优化void delay_ms(u16 ms) { u16 i; for (i = 0; i < ms; i++) { u16 j; for (j = 0; j < 9000; j++) { __NOP(); } } }
时间: 2024-01-12 16:03:47 浏览: 22
使用循环来进行延时的方式并不是很精确,而且还会占用大量的CPU资源。因此,我们可以使用定时器来实现更加准确和高效的延时。
以下是使用定时器来实现延时的代码:
```
#include "delay.h"
void delay_init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; //设定计数器自动重装值
TIM_TimeBaseStructure.TIM_Prescaler = 71; //预分频值,72Mhz/72=1Mhz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //TIM2初始化
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
void delay_us(u32 us)
{
TIM_SetCounter(TIM2, 0); //清零计数器
while(TIM_GetCounter(TIM2) < us); //延时
}
void delay_ms(u16 ms)
{
while(ms--)
{
delay_us(1000); //每毫秒延时1000us
}
}
```
这段代码使用了STM32的定时器TIM2来实现延时。在初始化时,我们将TIM2的预分频值设置为71,这样计数器每计数一次就需要消耗1us的时间。然后在延时函数中,我们将计数器清零,然后通过while循环实现延时。由于定时器的计数精度很高,因此可以实现比较准确的延时。