【STM32】滴答时钟24位递减计数器系统时钟【SystTick】

简介: 【STM32】滴答时钟24位递减计数器系统时钟【SystTick】

SysTick定时器,也叫滴答定时器或者系统定时器。

       SysTick-系统定时器是属于CM3内核中的一个外设内嵌在NVIC中。系统定时器是一个24位向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72MHz。当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环往复。

       因为SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系统定时器,这是的软件在CM3单片机中可以很容易被移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

  • Systick定时器是一个比较简单的定时器,常用于延时或者计时,也可以用作实时系统的心跳时钟。节省通用定时器的资源。
  • 只要不把Systick定时器关闭,它就会循环往复计时,在睡眠模式下也能工作。
  • Systick中断的优先级也可以设置。

4个Systick寄存器

bbf83058605d41cc6c2bbbd94315a68e_568b72c5020c4ae99d726368c2ba7e90.png

7ff11c3646adcd6b97303cbd5f7c2e32_5536e8534c4b46759ef192c9f66eb05a.jpeg

SysTick库函数

1ed598eef80a12d64bda9fe85f248474_aac6939fec2b4e50b2aecc4740909e02.png

SysTick中断服务函数

void SysTick_Handler(void);

库函数中SysTick的定义以及其寄存器对应地址的映射如下:

1. //systick寄存器对应的映射地址,包装在一个结构体中
2. 
3. typedef struct
4. {
5.   __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
6.   __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
7.   __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
8.   __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
9. } SysTick_Type;

Delay延时函数

相比于51单片机直接生成的延时函数,STM32的延时函数就比较复杂了,但是可以直接cv

1. #include "stm32f10x.h"
2. #include "Delay.h"
3. 
4. 
5. static uint8_t  us = 0;
6. static uint16_t ms = 0;
7. 
8. void Delay_Init(uint8_t MHz) //72MHz
9. {
10.   SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //8分频,72M/8=9M
11.   us = MHz/8;         //1us计数9个
12.   ms = (uint16_t)us*1000;   //1ms计数9000个
13. }
14. 
15. /*说明
16. 2的24次方 = 3个2的8次方 = 256*256*256 = 16777216 (24位递减计数器计数个数)
17. 16777216/9000 = 1864.135  (能计时1864ms,最多计时1.864s)
18. 注意最大定时时间为1.864s
19. */
20. 
21. /**
22.   * @brief  毫秒级延时
23.   * @param  xms 延时时长,参数最大写1864
24.   * @retval 无
25.   */
26. void Delay_ms(uint32_t xms)
27. {
28.   uint32_t temp;
29.   SysTick ->LOAD = (uint32_t)ms*xms;  //重载值
30.   SysTick ->VAL  = 0;
31.   SysTick ->CTRL |= SysTick_CTRL_ENABLE_Msk;//软件方式开启计数器,使能
32.   //开启计数器另一种写法  SysTick ->CTRL = 0x01;
33.   do{
34.     temp = SysTick ->CTRL;
35.   }while( (temp & 0x01) && !(temp & (1<<16)) ); //COUNTFLAG = 1,就代表计数完毕
36.   //(temp & 0x01) 检查计数器是否开启
37. 
38.   SysTick ->VAL  = 0;
39.   SysTick ->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
40.   //关闭计数器另一种写法  SysTick ->CTRL = 0x00;
41. }
42. 
43. 
44. /**
45.   * @brief  微秒级延时
46.   * @param  ums 延时时长
47.   * @retval 无
48.   */
49. void Delay_us(uint32_t xus)
50. {
51.   uint32_t temp;
52.   SysTick ->LOAD = us*xus;
53.   SysTick ->VAL  = 0;
54.   SysTick ->CTRL |= SysTick_CTRL_ENABLE_Msk;
55.   do{
56.     temp = SysTick ->CTRL;
57.   }while( (temp & 0x01) && !(temp & (1<<16)) );
58. 
59.   SysTick ->VAL  = 0;
60.   SysTick ->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
61. }
62. 
63. void Delay_s(uint32_t xs)
64. {
65.   while(xs--)
66.   {
67.     Delay_ms(1000);
68.   }
69. }

在使用延时函数前,记得初始化延时函数

Delay_Init(72); //初始化延时函数

另一版本……也可以直接用

1. /**
2. * @brief  微秒级延时
3. * @param  xus 延时时长,范围:0~233015
4. * @retval 无
5. */
6. void Delay_us(uint32_t xus)
7. {
8. SysTick->LOAD = 72 * xus;        //设置定时器重装值
9. SysTick->VAL = 0x00;         //清空当前计数值
10. SysTick->CTRL = 0x00000005;       //设置时钟源为HCLK,启动定时器
11. while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
12. SysTick->CTRL = 0x00000004;       //关闭定时器
13. }
14. 
15. /**
16. * @brief  毫秒级延时
17. * @param  xms 延时时长,范围:0~4294967295
18. * @retval 无
19. */
20. void Delay_ms(uint32_t xms)
21. {
22. while(xms--)
23. {
24.   Delay_us(1000);
25. }
26. }
27. 
28. /**
29. * @brief  秒级延时
30. * @param  xs 延时时长,范围:0~4294967295
31. * @retval 无
32. */
33. void Delay_s(uint32_t xs)
34. {
35. while(xs--)
36. {
37.   Delay_ms(1000);
38. }
39. }

这个就不需要初始化等,直接用即可


相关文章
|
4月前
|
芯片
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
257 0
|
1月前
|
传感器 监控 物联网
基于STM32+微波雷达设计的非接触式睡眠监控系统
本项目开发一种非接触式的睡眠监控系统,该系统利用先进的60GHz毫米波雷达技术和STM32微控制器,实现了对人体在睡眠过程中的存在感知、运动感知以及生理指标如呼吸频率、心率的实时监测。系统能够自动评估睡眠质量,并在用户睡眠周期结束时提供睡眠评分。为了确保用户能够在任何地点了解自己的睡眠状况,系统集成了Wi-Fi模块,可以将收集到的数据上传至华为云物联网平台,并通过专门设计的移动应用程序供用户远程访问。此外,系统还具备超阈值报警功能,当检测到异常的生理指标时会发出警报提醒。本地1.44寸TFT LCD显示屏用于实时显示监测到的信息,包括生理指标和环境数据。为了全面监测用户的健康状况,系统还加入了
214 0
基于STM32+微波雷达设计的非接触式睡眠监控系统
|
1月前
|
存储 机器学习/深度学习 编解码
基于STM32的车牌识别系统
基于STM32的车牌识别系统
77 0
|
1月前
|
传感器 网络协议 物联网
基于STM32的环境监测系统 (esp8267)(下)
基于STM32的环境监测系统 (esp8267)(下)
91 0
|
1月前
|
传感器 测试技术 芯片
基于STM32的环境监测系统 (esp8266)(上)
基于STM32的环境监测系统 (esp8266)(上)
283 0
|
2月前
|
存储 传感器 Linux
STM32微控制器为何不适合运行Linux系统的分析
总的来说,虽然技术上可能存在某些特殊情况下将Linux移植到高端STM32微控制器上的可能性,但从资源、性能、成本和应用场景等多个方面考虑,STM32微控制器不适合运行Linux系统。对于需要运行Linux的应用,更适合选择ARM Cortex-A系列处理器的开发平台。
239 0
|
4月前
|
前端开发 安全
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
160 0
|
4月前
stm32f407探索者开发板(十)——时钟系统精讲
stm32f407探索者开发板(十)——时钟系统精讲
164 0
|
5月前
|
芯片
【STM32】详解RTC实时时钟的概念和配置&示例代码
【STM32】详解RTC实时时钟的概念和配置&示例代码