0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用STM32单片机systick来实现延时定时功能

电子设计 来源:CSDN博主 作者:hurryddd 2021-02-14 06:25 7155次阅读

1、前言

CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。这样可以用systick来实现延时定时功能,不用再占用系统定时器。systick也多用做系统的时钟节拍,如freeRTOS等OS,再启动调度器的时候,就会将systick配置成其系统时钟,给系统提供心跳。systick中有4个寄存器CTRL、LOAD、VAL、CALIB

pIYBAF_9XjWAZY1uAAQTsF9Rra4795.png

2、systick配置注意事项

使用CubeMX配置生成的代码中,会自动生成一个 SystemClock_Config() 的函数,用于配置单片机时钟,其中就会配置systick

void SystemClock_Config()
{
    ...........
    LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK);
    LL_SetSystemCoreClock(32000000);
#ifndef SYSTICK_IRQ
    LL_Init1msTick(32000000); //使能systick但是不开启systick中断
#else
    SysTick_Config(SystemCoreClock / 1000);//使能systick同时开启systick中断
#endif
}

但是这里 需要注意的是,是不是需要开启 systick 中断!!!!

1、如果只是想用systick来作为延时用,程序不想被中断打断,就只需要使能systick而不用开启systick中断,调用 LL_Init1msTick 即可

void LL_Init1msTick(uint32_t HCLKFrequency)
    ---> LL_InitTick(HCLKFrequency, 1000U);
        ---> __STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
            {
                  /* Configure the SysTick to have interrupt in 1ms time base */
                  SysTick->LOAD  = (uint32_t)((HCLKFrequency / Ticks) - 1UL);  /* set reload register */
                  SysTick->VAL   = 0UL;  /* Load the SysTick Counter Value */
                  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                                   SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */
            }

但是需要自己编写延时函数,不能使用HAL库提供的HAL_Delay()。原因如下:HAL_Delay的实现是依靠一个uwTickFreq变量,uwTickFreq是在HAL_IncTick中累加的,需要在 SysTick_Handler中断函数中周期调用,这样HAL_Delay才会有一个基准

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}
__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;
 
  /* Add a period to guaranty minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
 
  while((HAL_GetTick() - tickstart) < wait)
  {
  }
}

自定义的us延时

void my_delay_us(uint32_t nus)
{		
	uint32_t temp;	
	uint32_t fac_us = SystemCoreClock/1000000;	  //为系统时钟的1/1000000  	
	SysTick->LOAD   = nus*fac_us; 			      //时间加载	  		 
	SysTick->VAL    = 0x00;        			      //清空计数器
	SysTick->CTRL  |= SysTick_CTRL_ENABLE_Msk ;	  //开始倒数	  
	do
	{
		temp = SysTick->CTRL;
	}
	while((temp & 0x01) &&! (temp&(1 << 16)));	 //等待时间到达   
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;	 //关闭计数器
	SysTick->VAL = 0X00;      					 //清空计数器	 
}

2、如果想用systick座系统的时钟节拍,需要开启systick中断,可以直接调用 SysTick_Config 来配置,也可以使用 HAL_Init 来配置,HAL_Init 配置最终也会调用 SysTick_Config 函数

 HAL_Init(void)
    ---> HAL_InitTick(uint32_t TickPriority)
        ---> SysTick_Config(uint32_t ticks)
            {
              if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
              {
                return (1UL);                                                   /* Reload value impossible */
              }
            
              SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
              NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
              SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
              SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                               SysTick_CTRL_TICKINT_Msk   |
                               SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
              return (0UL);                                                     /* Function successful */
            }

这样配置完成之后,还需要再systick的中断中调用 osSystickHandler 和 HAL_IncTick

void SysTick_Handler(void)
{
	osSystickHandler();//为OS提供系统时钟节拍
	HAL_IncTick();//为HAL库提供时钟基准
}

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6053

    文章

    44748

    浏览量

    642428
  • 寄存器
    +关注

    关注

    31

    文章

    5394

    浏览量

    122172
  • 定时器
    +关注

    关注

    23

    文章

    3260

    浏览量

    116113
  • STM32单片机
    +关注

    关注

    59

    文章

    549

    浏览量

    59069
  • Systick
    +关注

    关注

    0

    文章

    63

    浏览量

    13308
收藏 人收藏

    相关推荐

    瑞萨MCU RA8系列教程:RA8单片机SysTick使用描述

      每个Cortex-M内核都集成了一个SysTick模块,那是因为这个模块几乎是单片机项目必备的一个(定时器)功能。 不管是最新的Cortex-M85内核,还是经典的Cortex-M
    的头像 发表于 03-27 14:27 447次阅读
    瑞萨MCU RA8系列教程:RA8<b class='flag-5'>单片机</b><b class='flag-5'>SysTick</b>使用描述

    上位如何实现发送参数给单片机单片机保存接收的参数重复运行指定的功能

    ,类似于设定单片机运行指定功能时所需要的参数: 举例:名称,功能,上限,下限,参数一,参数二,...,延时。一行代表一个功能。 上位机设定好
    发表于 12-04 08:19

    STM32单片机的特点介绍

    和易用的工具,再配合强大的功能,在行业中享有盛誉。 STM32单片机的特点主要体现在以下几个方面: STM32拥有强大的内核。它采用了ARM32位Cortex-M3 CPU,最高工作频
    的头像 发表于 09-25 17:19 2929次阅读

    基于STM32单片机的智能加湿器设计

    本文介绍了一种基于STM32单片机的智能加湿器。该加湿器配备了DHT11温湿度传感器、水位传感器和浊度传感器,数据通过单片机处理并显示在OLED屏幕上。用户可通过按键模块设置阈值,并在检测值与设定值
    的头像 发表于 09-14 08:04 1701次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>的智能加湿器设计

    stm32单片机用什么软件编程

    STM32单片机是一种广泛应用于嵌入式系统领域的微控制器,具有高性能、低功耗、丰富的外设接口等特点。要对STM32单片机进行编程,需要选择合适的软件工具。 概述
    的头像 发表于 09-02 10:16 2565次阅读

    stm32单片机引脚介绍及功能

    特点,广泛应用于工业控制、消费电子、医疗设备、智能家居等领域。本文将介绍STM32单片机的引脚及其功能。 1. 引脚概述 STM32单片机
    的头像 发表于 09-02 09:38 9077次阅读

    第19.1 章-星瞳科技 OpenMV视觉循迹功能 超详细OpenMV与STM32单片机通信

    第19.1 章-[星瞳科技]OpenMV视觉循迹功能 超详细OpenMV与STM32单片机通信 (有完整版源码) 【星曈科技】OpenMv笔记——利用OpenMV与STM32进行串口通
    的头像 发表于 08-20 11:41 1300次阅读
    第19.1 章-星瞳科技 OpenMV视觉循迹<b class='flag-5'>功能</b> 超详细OpenMV与<b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>通信

    简述单片机定时器的工作原理

    单片机定时器的工作原理是一个复杂而精细的过程,它涉及到单片机内部的多个组件和机制。
    的头像 发表于 08-19 18:20 2222次阅读

    stm32单片机的优势有哪些?

    STM32作为一款强大而多功能单片机,凭借其性能、功能、开发者生态系统以及广泛的应用领域,成为了众多单片机中的佼佼者。无论是专业开发者
    发表于 07-29 09:29

    揭秘:单片机硬件与软件延时之大不同!

    普及一下延时相关概念和分类。硬件延时:指利用具有计数功能的硬件进行延时。比如:定时器(Timer)、实时时钟(RTC)、系统滴答
    的头像 发表于 07-25 08:11 1059次阅读
    揭秘:<b class='flag-5'>单片机</b>硬件与软件<b class='flag-5'>延时</b>之大不同!

    基于STM32单片机的声光控节能灯系统设计

    系统使用STM32单片机进行主控,系统内使用光敏电阻模块检测外界的光强,另外通过红外光电识别模块进行人体识别,使用声音传感器检测是否有人声。
    的头像 发表于 06-27 10:25 1870次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>的声光控节能灯系统设计

    基于STM32单片机的智能冰箱控制系统设计

    基于单片机设计的一款智能冰箱控制系统,可以控制冰箱的制冷装置,可以采集冰箱的异味浓度,超过闽值之后控制紫外灯进行消毒工作单片机采用单片机采用单片机采用
    的头像 发表于 06-25 09:21 1643次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>的智能冰箱控制系统设计

    51、STM32单片机的编程方式一样吗?

    STM32和51单片机是两种常见的单片机系列,它们在硬件架构、性能特点和编程方式等方面有所不同。但是从c语言编程的角度来说,我认为是大同小异的。我们对比一下它们的编程特点:51&am
    的头像 发表于 05-18 08:04 2956次阅读
    51、<b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>的编程方式一样吗?

    STM32单片机最小化系统设计原理

    STM32最小系统,就是能让STM32单片机能够正常工作所必须拥有的组成部分的集合,也是STM32单片机正常运行的必要环境。
    发表于 04-23 14:54 3331次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>单片机</b>最小化系统设计原理

    Systick到底是用作延时好还是用作定时好?都有什么优缺点?

    功能,作基础定时用,而不建议用作延时功能,方便后面程序移植. 最好有个定论,方便后面程序的移植,不能各自玩各自的,一个公司里面写程序的风格和标准需要统一。 想问下各位,
    发表于 04-08 07:37