当前位置:   article > 正文

【STM32HAL库学习】SysTick延时_hal库systick

hal库systick

一、SysTick简单介绍

 

SysTick是一个包含在内核里面的计数器,是一个24位递减的计数器 

二、SysTick寄存器

三、工作原理和延时实现

 

上图已经很明显了,操作流程就是

  1. 先选择时钟源和分频系数
  2. 在写入递减计数器和设置重装载值
  3. 在等待标志位值1
  4. 开始下一次递减计数
  1. //初始化延迟函数
  2. //当使用ucos的时候,此函数会初始化ucos的时钟节拍
  3. //SYSTICK的时钟固定为AHB时钟
  4. //SYSCLK:系统时钟频率,单位是M(直接传入32就可以了)
  5. void delay_init(u8 SYSCLK)
  6. {
  7. #if SYSTEM_SUPPORT_OS //如果需要支持OS.
  8. u32 reload;
  9. #endif
  10. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
  11. fac_us=SYSCLK; //不论是否使用OS,fac_us都需要使用
  12. #if SYSTEM_SUPPORT_OS //如果需要支持OS.
  13. reload=SYSCLK; //每秒钟的计数次数 单位为K
  14. reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
  15. //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右
  16. fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
  17. SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//开启SYSTICK中断
  18. SysTick->LOAD=reload; //每1/OS_TICKS_PER_SEC秒中断一次
  19. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
  20. #else
  21. #endif
  22. }

 

第一行先清空SysTick所有的设置,第二行进行时钟源的选择,第三行的g_fac_us是一个全局变量,用来计算延时1us需要计数多少次

例如:我们选用8分频,则SysTick的频率就是72/8=9M,那么计数一次需要1/9M 秒

而1us 是1/1000000 即1/1M 所以我们在9M下,需要计数9次才是1us,那么g_fac_us就等于9

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/755762
推荐阅读
  

闽ICP备14008679号