当前位置:   article > 正文

STM32 HAL库 us延时 使用SysTick->VAL和SysTick->LOAD_如何在hal库延时1us

如何在hal库延时1us

本文使用HAL库和STM32CubeMX配置时钟,使用 SysTick->LOAD 和 SysTick->VAL 来实现延时us和延时ms

M3内核中,SysTick计数器是24位递减计数器

计数范围2^24-1 到 0 ,然后重装载寄存器的值给SysTick计数器,重复下去

每来一个时钟,减1,STM32F1时钟来源为 HCLK(即AHB总线的时钟)72MHz

则 72次时钟过了1us,即 SystemCoreClock/1000000U 为 1us的定时计数值

获取上电以来的微秒数:

  1. uint32_t micros(void)
  2. {
  3. return (uwTick * 1000 + (SysTick->LOAD - SysTick->VAL) / (SystemCoreClock/1000000U));
  4. }

其中,uwTick为上电以来的毫秒数,SysTick->VAL为定时器的当前值,SysTick->LOAD为系统滴答定时器的重装载值,SystemCoreClock/1000000U为1us的定时计数值。

获取上电以来的毫秒数:

  1. uint32_t millis(void)
  2. {
  3. return uwTick;
  4. }

 微秒级延时:

  1. void delay_us(uint32_t us)
  2. {
  3. uint32_t total = 0;
  4. uint32_t target = (SystemCoreClock/1000000U) * us;
  5. int last = SysTick->VAL;
  6. int now = last;
  7. int diff = 0;
  8. while(1)
  9. {
  10. now = SysTick->VAL;
  11. diff = last - now;
  12. if(diff > 0)
  13. {
  14. total += diff;
  15. }
  16. else
  17. {
  18. total += diff + SysTick->LOAD;
  19. }
  20. if(total > target)
  21. {
  22. return;
  23. }
  24. last = now;
  25. }
  26. }

毫秒级延时:

  1. void delay_ms(uint32_t ms)
  2. {
  3. uint32_t Stop_TimePoint = uwTick + ms;
  4. while(uwTick < Stop_TimePoint);
  5. }

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

闽ICP备14008679号