你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32的Systick滴答定时器及延时函数编写(内附代码)

[复制链接]
STMCU小助手 发布时间:2022-5-18 21:00
一、Systick滴答定时器是什么?    Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。  定时器既是在规定时间之后执行某个操作。    Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。二、Systick一般用来做延时,精确延时一共4个Systick寄存器    CTRL             SysTick 控制和状态寄存器     LOAD             SysTick 自动重装载初值寄存器     VAL              SysTick 当前值寄存器     CALIB            SysTick 校准值寄存器三、systick定时器原理这个定时器是设置一个初值,然后这个初值减数到0,就是定时完成,完成之后可以产生中断,也可以不使用中断。 EZM`KG2081BWE(GB}VRW1YU.png 第0位是使能位,可以使能或者使能定时器第1位是使能中断位,减数结束之后是否产生中断。第2位是时钟选择位,可以选择外部的或者内部时钟作为时钟源。第16位是标志位,减数到0之后该位被置位1,读取过后自动清清零。四、uSysTick 重装载数值寄存器-LOAD ICO9H2XKEDQJK}B@}KG{8VS.png 当当前值寄存器减数到0,自动会将把这个RELOAD的值赋给当前值寄存器。if(VAL == 0)    VAL = RELOAD五、SysTick 当前值寄存器- VAL UFS`Z_@M4~9DKVW@2D9T2]5.png VAL就是从初值(RELOAD)一直减一,倒数到0的时候,重新将初值(RELOAD)赋给VAL。六、滴答定时器的实现对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8内核时钟是HCLK时钟1、选择时钟源    SysTick_CLKSourceConfig();//选择时钟源 misc.c文件中 (]]A00RCAKI6Z0MN2P.png     SysTick_Config(uint32_t ticks) //初始化systick,时钟为HCLK,并开启中断 core_cm4.h文件中 6]NZ4(S)@AQ(5GM($LD5YVK.png 2、编写延时函数3、设置中断优先级分组    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);    一般使用中断都需要在最开始对我们的优先级进行分组,分好之后再进行优先级的设置。    尽量不要在同一个程序里面频繁的改变分组,频繁切换分组可能会使程序出现不可预料错误。七、用中断的方式实现delay延时Systick中断服务函数:void SysTick_Handler(void); 2Z5JCHW%)M47(KDNRP3`8(L.png 注意:  uCortex-M系统中,Systick代码可以通用。  如果使用中发现延时不一致,问题一般都是因为不同内核时钟不一样而已。修改ticks值即可。参考代码如下:
  1. void init_delay(void)
  2. {
  3.     /*我们外部晶振为8MHz,然后倍频到168M,那么Systick时钟即为21M,也就是Systick的计数器
  4.     VAL每减1就代表过了1/21us*/
  5.     //1.选择时钟源(选择外部时钟)
  6.     //外部时钟要/8,内部始终不用
  7.     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  8. }
  9. //2.编写延时函数
  10. //最大延时不超过798.915ms,即(2^24)/21/1000
  11. void delay_us(u32 nus)
  12. {
  13.     u32 temp = 0;
  14.     //1、实现1us*nus的延时
  15.     //21外是外部时钟频率,如果选择内部时钟就是168M/8
  16.     SysTick->LOAD = 21*nus;//设置自动装载值为21(1us)
  17.     SysTick->VAL = 0x00;//设置当前初值为0
  18.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开启(使能)计数:使能SysTick定时器
  19.     do
  20.     {
  21.         //读取控制寄存器
  22.         temp = SysTick->CTRL;
  23.     }while(!(temp & (1<<16)));//等待计数时间到达(位16)
  24.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭(失能)计数
  25.     SysTick->VAL = 0x00;//再设置当前初值为0,重置VAL
  26. }
  27. void delay_ms(u32 nms)
  28. {
  29.     u32 temp = 0;
  30.     //1、实现1us*nus的延时
  31.     SysTick->LOAD = 21000*nms;//设置自动装载值为21(1us)
  32.     SysTick->VAL = 0x00;//设置当前初值为0
  33.     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开启(使能)计数
  34.     do
  35.     {
  36.         //读取控制寄存器
  37.         temp = SysTick->CTRL;
  38.     }while(!(temp & (1<<16)));
  39.     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭(失能)计数
  40.     SysTick->VAL = 0x00;//再设置当前初值为0
  41. }
  42. void delay_s(u32 s)
  43. {
  44.     while(s--)
  45.     {
  46.         delay_ms(500);
  47.         delay_ms(500);
  48.     }
  49. }
复制代码
收藏 评论0 发布时间:2022-5-18 21:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版