正点原子stm32f407 滴答定时器延时
时间: 2025-01-20 14:53:55 浏览: 57
### 实现 STM32F407 滴答定时器延时功能
对于 STM32F407 的滴答定时器 (SysTick Timer),可以利用其特性来创建精确的延迟函数。以下是具体实现方法:
#### 使用 SysTick 定时器初始化
为了设置 SysTick 计数频率,通常会配置它以每毫秒中断一次的方式工作。
```c
#include "stm32f4xx.h"
// 初始化 SysTick 用于产生周期性的中断
void systick_init(void){
if (SysTick_Config(SystemCoreClock / 1000)){ // 配置为每 ms 中断一次
while (1); // 如果配置失败,则进入死循环
}
}
```
上述代码通过 `SystemCoreClock` 获取当前系统核心时钟速度,并将其除以 1000 来获得每毫秒触发一次的时间间隔[^3]。
#### 创建延时函数
基于已经设定好的 SysTick 中断机制,下面定义两个简单的阻塞型延时函数——`delay_ms()` 和 `delay_us()`.
```c
volatile uint32_t ticks;
// 更新全局变量 'ticks' 的值
void SysTick_Handler(void){
ticks++;
}
// 延迟指定数量的毫秒
void delay_ms(uint32_t nms){
uint32_t cur_tick = ticks;
while((ticks - cur_tick) < nms);
}
// 微秒级延迟(假设 SystemCoreClock 是固定的)
void delay_us(uint32_t us){
__IO uint32_t temp;
do {
asm volatile ("nop");
temp = us * (SystemCoreClock / 1000000UL) >> 16;
}while(temp-- != 0);
}
```
这段程序展示了如何使用硬件计数器配合软件逻辑完成精准时间控制的功能.
#### 主要注意事项
- 当调用这些延时函数期间,其他任务会被挂起直到所需等待的时间结束;
- 对于更复杂的实时操作系统环境下的应用开发,建议采用 RTOS 提供的标准 API 函数来进行调度管理而不是直接操作裸机上的 Systick.
阅读全文
相关推荐

















