stm32中常见的三种延时函数总结
使用循环
1 2 3 4 5 6 7 8 9 10 11
|
void delay_ms(u16 time) { u16 i = 0; while(time--){ i = 12000; while(i--); } }
|
使用SysTick
1 2
| extern _IO uint32_t TimingDelay
|
1 2 3 4 5 6 7 8
|
void SysTick_Hankler(void) { if(TimingDelay != 0x00){ TimingDelay--; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void SysTick_Init(void) { if(SysTick_config(SystemCoreClock/1000)) for(;;); }
_IO uint32_t TimingDelay;
void delay_ms(_IO uint32_t ntime) { TimingDelay = nTime; while(TimingDelay != 0); }
|
SysTick 时基计算公式:
Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)
Reload Value:就是重加载数,重加载数最大不得超过0xffffff(16,777,215)。SysTick_config()
中的参数就是重加载数
SysTick Counter Clock (Hz):是系统时钟的频率
Desired Time:所需要的时基。
1 2
| SysTick_Config(SystemCoreClock / 1000) SysTick_Config(SystemCoreClock / 1)
|
所以需要以x时间为长度,则 /x
使用汇编进行定时
1 2 3 4 5 6 7 8 9 10 11 12
|
void SysCtlDelay(unsigned long ulCount) { __asm(" subs r0, #1\n" " bne.n SysCtlDelay\n" " bx lr"); }
|
这3个时钟指的是CPU时钟,也就是系统时钟。120MHZ,也就是说1s有120M的时钟,一个时钟也就是1/120 us,也就是周期是1/120 us。3个时钟,因为执行了3条指令。
参考资料
https://zhuanlan.zhihu.com/p/345804589