static __IO uint32_t delay_ms_ticks; void delay_init(void) { SysTick_Config(SystemCoreClock/1000); } void delay_ms(uint16_t ms) { delay_ms_ticks = ms; while(delay_ms_ticks); } void SysTick_Handler() { if (delay_ms_ticks > 0) { delay_ms_ticks--; } }每一句都加注释,并解释单片机具体实现方式
时间: 2023-12-10 11:38:59 浏览: 80
```
// 定义一个静态全局变量,存储延时的tick数
static __IO uint32_t delay_ms_ticks;
// 延时初始化函数,配置SysTick定时器每1ms中断一次
void delay_init(void) {
SysTick_Config(SystemCoreClock/1000); // 配置SysTick定时器,计数值为CPU主频除以1000
}
// 毫秒级延时函数,传入需要延时的毫秒数
void delay_ms(uint16_t ms) {
delay_ms_ticks = ms; // 设置延时tick数
while(delay_ms_ticks); // 等待延时结束
}
// SysTick中断服务函数,每1ms被调用一次
void SysTick_Handler() {
if (delay_ms_ticks > 0) { // 如果还有延时未完成
delay_ms_ticks--; // 延时tick数减1
}
}
```
这段代码是针对单片机的延时函数实现。单片机没有像PC那样操作系统提供的sleep、usleep等函数,需要通过硬件定时器来实现延时。具体实现方式如下:
1. 在程序中调用`delay_init()`函数,配置SysTick定时器,使其每1ms产生一次中断。
2. 在需要延时的地方调用`delay_ms()`函数,传入需要延时的毫秒数。
3. `delay_ms()`函数将需要延时的毫秒数转换为需要延时的tick数,保存在静态全局变量`delay_ms_ticks`中。
4. `delay_ms()`函数通过while循环等待`delay_ms_ticks`变为0,即延时结束。
5. 每当SysTick定时器产生一次中断,就会调用`SysTick_Handler()`函数。`SysTick_Handler()`函数检查是否还有延时未完成,如果有,则将延时tick数减1。当`delay_ms_ticks`变为0时,延时结束,程序继续往下执行。
阅读全文