1us / 主频时钟周期 = 1us 需要消耗的主频时钟周期数;
1us 需要消耗的主频时钟周期数 / 空转函数一次的指令周期数 = 空转多少次为1us;
需要延时多少us就空转多少次;
c
/*
* 忙等校准:STM32F072 SYSCLK=48MHz(与 system_stm32f0xx.c 一致)
* Cortex-M0 空循环约 subs+bne=4 周期,再加 1 条 NOP → 约 5 周期/圈
* 48e6/5 ≈ 9.6,取 10。若 Keil Debug/-O0 明显偏慢,把系数改成 4~6。
*/
#define ONEWIRE_CPU_HZ 48000000u
#define ONEWIRE_CYCLES_LOOP 5u
#define ONEWIRE_LOOPS_PER_US (ONEWIRE_CPU_HZ / 1000000u / ONEWIRE_CYCLES_LOOP)
static void delay_us(unsigned int us) {
unsigned int n = us * ONEWIRE_LOOPS_PER_US;
while (n--) {
__NOP();
}
}