stm32f4标准库延时函数
时间: 2025-01-14 13:11:11 AIGC 浏览: 145
### STM32F4 标准库中的延时函数实现
#### SysTick定时器简介
SysTick定时器是一个简单却非常有用的定时器,在基于Cortex-M3和Cortex-M4内核的MCU中普遍存在。该定时器主要用于提供精确的时间延迟以及时间管理功能[^1]。
#### 库函数介绍
在STM32的标准外设库中,提供了几个用于配置和操作SysTick定时器的关键函数:
- `SysTick_Config(uint32_t ticks)`:此函数用来初始化并启动SysTick计数器。参数`ticks`表示希望设定的最大计数值减去一(即重装载值)。当计数达到零时会产生中断或触发回调事件。
- `SysTick->LOAD = ticks - 1UL;`:设置重新加载寄存器的值,决定了每次溢出所需的时间间隔。
- `SysTick->VAL = 0UL;`:清除当前计数值以便立即开始新的倒计时周期。
- `NVIC_SetPriority(SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);`:调整SysTick异常优先级,通常将其设置为最低级别以防止干扰其他更重要的ISR处理程序。
- `SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_CLKSOURCE_Msk;`:使能SysTick计数器及其对应的IRQ请求信号,并指定使用的时钟源(APB总线频率还是外部参考振荡器)[^2]。
#### 示例代码展示
下面是一段利用上述提到的功能创建毫秒级延时子例程的例子:
```c
#include "stm32f4xx.h"
// 定义全局变量保存每ms发生一次的滴答次数
volatile uint32_t TimingDelay;
/**
* @brief 初始化systick定时器
*/
void Delay_Init(void){
// 使用72MHz AHB作为SYSTICK时钟源
if (SysTick_Config(SystemCoreClock / 1000)){
while (1);
}
}
/**
* @brief 减少TimingDelay的值直到它变为0为止
*/
void TimingDelay_Decrement(void){
if(TimingDelay != 0x00){
TimingDelay--;
}
}
/**
* @brief 提供一个阻塞式的等待接口
*
* @param nTime 要等待多少个滴答周期(ms)
*/
void delay_ms(__IO uint32_t nTime){
TimingDelay = nTime;
while(TimingDelay != 0);
}
```
在此基础上还可以进一步扩展到支持更长时间跨度的延时服务,比如通过增加额外的状态机逻辑来跟踪多个不同长度的任务序列;或是采用非阻塞性的设计模式让CPU可以在执行延时期间继续做其它有用的工作而不是单纯地空转循环。
阅读全文
相关推荐




















