请选择 进入手机版 | 继续访问电脑版

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

基于STM32的SysTick系统定时器经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:40
SysTick是STM32中的系统定时器,利用SysTick可以实现精确的延时。
SysTick—系统定时器
属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

延时模式:
SysTick的延时可以有俩种模式:
1.单纯递减延时
2.利用void SysTick_Handler(void) 中断函数延时

俩种方法都涉及到一个函数,那就是SysTick 配置库函数 ,
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
  2. {
  3. // 不可能的重装载值,超出范围
  4. if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  5.   {
  6.          return (1UL);
  7. }

  8. // 设置重装载寄存器
  9. SysTick->LOAD = (uint32_t)(ticks - 1UL);

  10. // 设置中断优先级
  11. NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);

  12. // 设置当前数值寄存器
  13. SysTick->VAL = 0UL;

  14. // 设置系统定时器的时钟源为 AHBCLK=72M
  15. // 使能系统定时器中断
  16. // 使能定时器
  17. SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
  18. SysTick_CTRL_TICKINT_Msk |
  19. SysTick_CTRL_ENABLE_Msk;
  20. return (0UL);
  21. }
复制代码

其主要任务是装填计时器初始值、设置时钟源、设置中断源优先级。初始值不能超过2^24,时钟源一般为72M。

20190726212429892.png

1.单纯递减延时
毫秒级延时
  1. void SysTick_Delay_ms(uint32_t ms)
  2. {
  3.         uint32_t  i;
  4.         SysTick_Config(72000);  /* 设置初始值为72000 */
  5.         for(i=0;i<ms;i++)
  6.         {
  7.                 while(!((SysTick->CTRL) & (1<<16))) ;       /* 检测一次计时完成 */
  8.         }               
  9.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 操作寄存器 */
  10. }

复制代码

2.利用void SysTick_Handler(void) 中断函数延时
毫秒级延时
  1. volatile uint32_t isr_ms;
  2. void SysTick_Delay_ms_INT(uint32_t ms)
  3. {        
  4.         isr_ms = ms;
  5.         SysTick_Config(72000);
  6.         
  7.   while(isr_ms);  /* 在中断里递减 */
  8.         
  9.         /* 失能systick */
  10.         SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  11. }
复制代码

在stm32f10x_it.c中的代码如下:
  1. extern volatile uint32_t isr_ms;   /* 这个变量在bsp_systick.c里面定义 */
  2. void SysTick_Handler(void)
  3. {
  4.         isr_ms--;
  5. }
复制代码

————————————————
版权声明:Aspirant-GQ
如有侵权请联系删除
收藏 评论0 发布时间:2023-3-18 16:40

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版