目录
1 普通延时函数
普通延时函数是最基本的延时实现方式,通常在裸机编程或者对时间精度要求不高的场合使用。它的工作原理是通过循环消耗CPU周期来达到延时的目的。例如,一个简单的延时函数可能如下所示:
```c
void delay_ms(uint32_t ms)
{
uint32_t i, j;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 1000; j++);
}
}
```
在这个例子中,通过两个嵌套的循环,程序执行大量的空指令,从而占用CPU时间,达到延时的目的。这种方法的缺点很明显:延时不精确,受CPU时钟频率和系统负载的影响较大,且在延时期间CPU不能执行其他任务,浪费了资源。
2 SysTick 定时器延时中断方式
SysTick定时器是Cortex-M系列处理器内核自带的一个24位下递减计数器。当计数到0时,它可以通过中断的方式通知CPU。这种方式实现延时的步骤通常如下:
1. **初始化SysTick定时器**:设置时钟源(通常为系统时钟),重装载值(决定计数周期),开启中断,并使能定时器。
2. **编写中断服务例程(ISR)**:当SysTick计数到0时,ISR会被执行,此时可以更新延时状态或直接处理延时后的逻辑。
3. **开始计数**:启动SysTick计数器后,它会在每个时钟周期递减计数值,一旦计数到0,会触发中断并自动重装载初始值,继续计数。
4. **等待中断**:主程序设置好延时时间后,进入等待状态,直到SysTick中断发生,然后在ISR中处理延时结束的逻辑。
这种方法的优点是延时更加准确,不会因为CPU执行其他任务而受到影响,且在延时期间CPU可以执行其他任务。
3 SysTick 定时器延时非中断方式
非中断方式使用SysTick定时器实现延时,通常是在不需要执行特定中断处理逻辑,或者希望简化程序结构时使用。其基本流程包括:
1. **初始化SysTick定时器**:类似中断方式,设置时钟源、重装载值,但不一定需要开启中断。
2. **轮询计数器**:启动SysTick后,主程序通过不断检查SysTick当前计数值(通常是通过读取计数器寄存器`VAL`),等待其递减到0或者某个预设值。
3. **执行延时**:在计数器达到预设值之前,主程序可能执行忙等待(即空循环),或者进行其他非关键性操作。
相比于中断方式,非中断方式的延时实现较为简单,不需要编写中断服务例程,但是它仍然会导致CPU在此期间无法执行其他任务,且实时性不如中断方式,因为需要不断地检查计数器状态。
总结来说,普通延时函数简单但不精确,SysTick定时器延时(无论是中断还是非中断方式)提供了更精确的延时控制,其中中断方式更为高效且不阻塞CPU,适用于对时间敏感和多任务处理的场景。