使用空指令进行延时
在STM32F103中,不使用中断而使用空循环(NOP指令)来实现延时,需要根据时钟频率计算出每个NOP指令的执行时间。
计算NOP指令时间
- 时钟频率:72MHz
- 每个NOP指令执行时间:1个时钟周期
- NOP指令执行时间:1 / 72MHz ≈ 13.89ns
微秒级延时
void Delay_us(uint32_t us) {
uint32_t count = us * 72 / 5; // 估算循环次数
while (count--) {
__NOP(); // 空操作,防止优化
}
}
在 STM32 使用的这段延时代码中,uint32_t count = us * 72 / 5; 是用来估算延时所需的循环次数。下面是这一估算的原理:
1. 72 MHz 时钟频率
STM32 通常运行在 72 MHz 的系统时钟频率下(假设使用的是常见的 STM32F1 系列)。这意味着每秒钟处理器可以执行 72,000,000 个时钟周期。为了方便计算,假设每个时钟周期大约能执行一条指令。
2. 时间单位换算
1 微秒 (us) = 1,000,000 分之一秒,因此在 72 MHz 的时钟频率下,1 微秒内可以执行约 72 个时钟周期。
因此,对于给定的 us 微秒的延时,我们大概需要等待 us * 72 个时钟周期,才能达到期望的延时时间。
2. 为何除以 5?
代码中的 count = us * 72 / 5 并不是直接使用 us * 72,而是对其进行了除以 5 的操作。这个除以 5 的操作是为了补偿循环中其他指令(例如,while (count--) 的减法操作和循环判断等)所消耗的额外时钟周期。
毫秒级延时
void Delay_ms(uint32_t ms) {
while (ms--) {
Delay_us(1000); // 调用微秒延时
}
}
- 这种方法简单但不精确,受编译器优化和其他因素影响。
- 在精度要求高的场合,建议使用定时器实现延时。
3466

被折叠的 条评论
为什么被折叠?



