请写一段利用stm32f4xx的定时器延时10s的代码以及利用flag递增程序延时10s的代码
时间: 2024-04-13 14:30:55 浏览: 70
使用stm32f4xx的定时器来实现延时10秒的代码如下所示:
```c
#include "stm32f4xx.h"
void Delay_10s(void)
{
// 配置定时器
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 使能TIM2时钟
TIM2->PSC = 15999; // 设置预分频值,定时器时钟为84MHz/(15999+1) = 5.25kHz
TIM2->ARR = 52500; // 设置自动重装载值,定时器将计数到这个值后溢出,产生中断
TIM2->CR1 = TIM_CR1_URS; // 只有在溢出时才产生更新事件
TIM2->EGR = TIM_EGR_UG; // 产生更新事件,重新加载预分频值和自动重装载值
TIM2->SR &= ~TIM_SR_UIF; // 清除中断标志位
// 启动定时器
TIM2->CR1 |= TIM_CR1_CEN; // 启动定时器
// 等待定时器溢出中断
while (!(TIM2->SR & TIM_SR_UIF)) {
// 等待中断发生
}
// 清除中断标志位
TIM2->SR &= ~TIM_SR_UIF;
// 停止定时器
TIM2->CR1 &= ~TIM_CR1_CEN; // 停止定时器
}
```
而使用flag递增程序来实现延时10秒的代码如下所示:
```c
#include "stm32f4xx.h"
volatile uint32_t flag = 0;
void Delay_10s(void)
{
flag = 0; // 初始化flag为0
while (flag < 10000) {
// 等待flag递增到10000
}
}
// 在某个中断服务函数或其他地方将flag递增
void IncrementFlag(void)
{
flag++;
}
```
在上述代码中,我们设置一个volatile类型的全局变量flag,并初始化为0。在Delay_10s函数中,通过while循环判断flag是否递增到10000,如果还没有到达,就一直等待。在某个中断服务函数或其他地方,需要调用IncrementFlag函数将flag递增。这样,当flag递增到10000时,Delay_10s函数才会退出,实现了大约10秒的延时。请注意,在实际使用中,你需要根据你的系统时钟频率和实际需求来调整递增的值和判断条件。
阅读全文