stm32 延时函数1s
时间: 2024-09-23 20:15:23 浏览: 73
stm32f1hal库超声波测距
5星 · 资源好评率100%
在STM32系列单片机中,实现1秒的延时通常依赖于其内部定时器,比如 TIM1、TIM2等。这里我们以使用TIM1为例,给出一种常见的基于软件和硬件两种方法:
### 软件延时(不推荐)
```c
void delay_ms(uint32_t ms)
{
for (uint32_t i = 0; i < ms * 1000; i++);
}
```
然后,1秒延时就是 `delay_ms(1000);`,但这不是最准确的方式,耗时可能会因CPU速度和任务负载而变化。
### 硬件定时器(推荐)
1. 设置TIM1工作在捕获模式,并初始化预分频器(PSC),例如84MHz系统频率下,选择1ms分辨率:
```c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure.TIM_Period = ((SystemCoreClock / 1000000) - 1) / 8;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_Cmd(TIM1, ENABLE);
```
2. 把TIM1设定成上升沿触发的中断,当计数器溢出时,会自动触发中断服务函数。在这里,我们可以计数8次,每个周期大约125us,总共大约1s。
```c
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
NVIC_EnableIRQ(TIM1_IRQn);
// 假设TIM1的周期为8个计数,那么设置阈值为7,超过就认为1s已过
TIM_SetCounter(TIM1, 7);
```
注意编写对应的中断服务函数来完成延时计数。
阅读全文