如何实现Delay_us和Delay_ms延时(SysTick定时器)
SysTick定时器(System Tick Timer)是ARM Cortex-M内核中自带的一个24位递减计数器,通常用于产生系统节拍中断,为操作系统提供时基或用于一般性定时功能。它具有以下特点和用途:
一、SysTick的介绍
1. SysTick的主要用途(计时)
操作系统心跳时基:在实时操作系统(RTOS)中,SysTick通常用于产生周期性中断,作为系统节拍,触发任务切换和延时计时等功能。
精确延时:在裸机开发中,SysTick可用于实现精确延时,适合对时间敏感的应用场景。
通用计时器:在没有其他通用计时器的情况下,SysTick可以用作简单的通用定时器。
2. SysTick的工作原理
SysTick定时器是一个24位的递减计数器,在装载寄存器(LOAD
寄存器)中设置初始计数值后,定时器以固定频率递减计数。当计数到零时会产生一次中断,并重新装载计数值,开始新一轮计时。
SysTick可以选择系统时钟(HCLK
)或HCLK
的1/8作为时钟源。
3. SysTick定时器的寄存器
CTRL(控制和状态寄存器):用于配置启用/禁用SysTick定时器、中断、时钟源选择等。
LOAD(装载寄存器):设置计数的初始值,定时器每次计数到0后会重新装载这个值。
VAL(当前计数值寄存器):显示当前剩余的计数值。
4. 与其他定时器的区别
与其他定时器的不同(物理上):通用、基本、高级定时器位于STM32的外设模块中,通常由STM32微控制器的制造商(STMicroelectronics)提供,不属于ARM内核的一部分。这些定时器具有更丰富的功能,比如输入捕获、输出比较、PWM、编码器接口等。
二、SysTick时钟频率的设置
SysTick定时器的时钟来源是Cortex-M处理器的时钟,而Cortex-M处理器的时钟来源于外部系统时钟(SYSCLK)
如下图所示:我们设置内核时钟(Cortex的时钟)就是在设置SysTick的时钟频率了。
如何实现,设置例子如下:
参数可以是AHB 时钟(SYSCLK)的8分频或者不分频。
三、SysTick的应用(delayms,delayus)
接下来我们就可以看到如何实现微妙、毫秒的延时了。
代码将SysTick的时钟源设置为系统时钟(HCLK)的1/8。
如果系统时钟(HCLK
)为72 MHz,那么SysTick的时钟就是 72 MHz / 8 = 9 MHz
。
这样一来,SysTick定时器每秒钟计数9,000,000次,即每个计数周期的时间为 1/9 MHz = 0.111 微秒。
这里fac_us就是一微秒的延时了。那么fac_ms=fac_us*1000就是毫秒了
接下来写delayus和dalayms的函数