当前位置:   article > 正文

SysTick滴答定时器使用库函数实现1us和1ms精确定时(超短代码)(内含源码.c/.h)_stm32 systick 1us

stm32 systick 1us

一、SysTick介绍

SysTick—系统定时器是属于CM4内核中的一个外设,内嵌在NVIC中。一般我们叫他系统定时器或者滴答定时器。是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,当重装载数值寄存器的值递减到 0的时候,系统定时器就产生一次中断,以此循环往复。嵌入式操作系统常有一个类似“心跳”的定时器,来分配时间片,实现宏观上的多任务。其实,操作系统的多任务,在微观上,CPU对多任务的管理是分时的。每个任务都给一定的时间片,就是把时间分成N个等份,优先级高或是重要的任务多占几个时间片,优先级低的或是不重要的任务就少占几个时间片。大部分嵌入式操作系统是基于时间片的。如ucos。systick结论总结如下:

1、systick是一个24位的定时器,故重装值最大值为2的24次方 = 16 777 215,要注意不要超出这个值。

2、systick是cortex_m3的标配,不是外设,不需要在RCC寄存器组打开它的时钟。

3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。

4、采用使用库函数的方法,只能采用中断的方法响应定时器计时时间到,如要采用查询的方法,那只能采用设置systick的寄存器的方法。

定时原理:SysTick定时器的计数器是向下递减计数的,计数一次的时间当寄存器中的值LOAD减到0时,产生中断,可得中断一次的时间为:其中

比如在STM32F103x中SystemCoreClock是固件中定义的系统内核时钟,一般为78MHZ

即:=78MHZ,假如LOAD为78则,定时时间为

库函数SysTick_Config()函数的形参表示内核时钟有多少个周期触发一次systick定时中断

  1. SystemCoreClock / 1000 表示定时频率为 1000Hz, 也就是定时周期为 1ms
  2. SystemCoreClock / 500 表示定时频率为 500Hz, 也就是定时周期为 2ms
  3. SystemCoreClock / 2000 表示定时频率为 2000Hz, 也就是定时周期为 500us

在delay.c中第18行中SystemCoreClock/1000000)就是定时1us,当然也可以直接传递72,但是若是换个单片机时钟不是72MHZ则会定时错误,所以使用SystemCoreClock/1000000)更方便移植程序。

二、精确定时源码

delay.c

  1. //使用时记得将stm3210x_it.c中
  2. //void SysTick_Handler(void)
  3. //{
  4. //}
  5. //注销掉
  6. #include "delay.h"
  7. /*******************************************************************************
  8. *函数的原型:void Sys_Delay_Init(void)
  9. *函数的功能:系统滴答定时器初始化
  10. *函数的参数:None
  11. *函数返回值:None
  12. *函数的说明:
  13. SysTick_Config():系统滴答定时器初始化 返回1,说明初始化不成功
  14. ********************************************************************************/
  15. void Sys_Delay_Init(void)
  16. {
  17. if(SysTick_Config(SystemCoreClock/1000000) == 1)//1微秒
  18. {
  19. while(1);
  20. }
  21. }
  22. u32 sys_time = 0;
  23. void SysTick_Handler(void)
  24. {
  25. sys_time++;
  26. }
  27. /*******************************************************************************
  28. *函数的原型:void delay_us(u32 us)
  29. *函数的功能:微秒延时函数
  30. *函数的参数:
  31. @ u32 us:微秒 [1,4294967296]
  32. *函数返回值:None
  33. *函数的说明:
  34. 系统滴答定时器
  35. ********************************************************************************/
  36. void delay_us(u32 us)
  37. {
  38. sys_time = 0;
  39. while(sys_time != us);
  40. }
  41. /*******************************************************************************
  42. *函数的原型:void delay_ms(u32 ms)
  43. *函数的功能:微秒延时函数
  44. *函数的参数:
  45. @ u32 ms:毫秒 [1,4294967]
  46. *函数返回值:None
  47. *函数的说明:
  48. 系统滴答定时器
  49. ********************************************************************************/
  50. void delay_ms(u32 ms)
  51. {
  52. delay_us(ms*1000);
  53. }

delay.h

  1. #ifndef _DELAY_H
  2. #define _DELAY_H
  3. #include "stm32f10x.h"
  4. void Sys_Delay_Init(void);
  5. void delay_us(u32 us);
  6. void delay_ms(u32 ms);
  7. #endif

若要在函数中使用则应先在主函数(main.c)中进行初始化

  1. #include "sys.h"//我把所以的.h都放sys.h中了所以是#include "sys.h"
  2. int main(void)
  3. {
  4. Sys_Delay_Init(); //初始化定时器
  5.     //下面就可以直接调用delay_ms();delay_us();来进行定时了,比如若定时50ms则
  6.     delay_ms(50);
  7.     //若定时30us则
  8.     delay_us(30);
  9. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/285177
推荐阅读
相关标签
  

闽ICP备14008679号