stm32中三种延时函数

stm32中常见的三种延时函数总结

使用循环

1
2
3
4
5
6
7
8
9
10
11
//该代码适用于72MHZ下

void delay_ms(u16 time)
{
u16 i = 0;
while(time--){
i = 12000;
while(i--);
}
}

使用SysTick

1
2
//先在stm32f10x_it.h中定义
extern _IO uint32_t TimingDelay
1
2
3
4
5
6
7
8
//在stm32f10x_it.c中定义void SysTick_Hankler(void)

void SysTick_Hankler(void)
{
if(TimingDelay != 0x00){
TimingDelay--;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//在main.c中定义
void SysTick_Init(void)
{
if(SysTick_config(SystemCoreClock/1000))//1ms的时基
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) //这是1us的重加载数
SysTick_Config(SystemCoreClock / 1) //这是1s的重加载数

所以需要以x时间为长度,则 /x

使用汇编进行定时

1
2
3
4
5
6
7
8
9
10
11
12
/*!
* @brief 软件延时
* @param ulCount:延时时钟数
* @return none
* @note ulCount每增加1,该函数增加3个时钟
*/
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


stm32中三种延时函数
https://ysc2.github.io/ysc2.github.io/2023/11/20/stm32中三种延时函数/
作者
Ysc
发布于
2023年11月20日
许可协议