stm32的非阻塞延时
时间: 2023-06-27 14:01:00 浏览: 60
在STM32中实现非阻塞延时可以使用定时器中断的方式。具体步骤如下:
1. 配置一个定时器,使其每隔一定的时间产生一个中断。
2. 在中断服务程序中,将延时计数器减一。
3. 在需要延时的地方,将延时计数器设置为需要延时的时间,然后等待中断发生。
4. 当中断发生时,判断延时计数器是否为0,如果不为0,则继续等待中断;如果为0,则延时结束。
下面是一个简单的代码示例:
```c
#include "stm32f10x.h"
volatile uint32_t delay_count = 0;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {
if (delay_count > 0) {
delay_count--;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
void delay_ms(uint32_t ms)
{
delay_count = ms;
TIM_Cmd(TIM2, ENABLE);
while (delay_count != 0) {
// 等待延时结束
}
TIM_Cmd(TIM2, DISABLE);
}
int main(void)
{
TIM_TimeBaseInitTypeDef tim_init_struct;
NVIC_InitTypeDef nvic_init_struct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
tim_init_struct.TIM_Prescaler = 72 - 1; // 计数器时钟频率为72MHz
tim_init_struct.TIM_Period = 1000 - 1; // 定时器周期为1ms
tim_init_struct.TIM_ClockDivision = TIM_CKD_DIV1;
tim_init_struct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &tim_init_struct);
nvic_init_struct.NVIC_IRQChannel = TIM2_IRQn;
nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 0;
nvic_init_struct.NVIC_IRQChannelSubPriority = 0;
nvic_init_struct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init_struct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
while (1) {
delay_ms(1000); // 延时1秒
// 代码继续执行
}
}
```
在上面的代码中,我们使用了TIM2定时器来实现延时功能。在中断服务程序中,我们将延时计数器减一。在需要延时的地方,我们将延时计数器设置为需要延时的时间,然后等待中断发生。当中断发生时,判断延时计数器是否为0,如果不为0,则继续等待中断;如果为0,则延时结束。