stm32f103定时器3和延时卡死
时间: 2025-05-03 16:43:07 浏览: 26
### STM32F103 定时器3 延时 卡死 解决方案
当使用 STM32F103 的 TIM3 实现延时时,如果程序出现卡死现象,可能是由于以下几个原因引起的:
#### 1. 中断优先级配置不当
STM32 的 NVIC 控制着中断的优先级。如果 TIM3 的更新事件触发了中断请求,而该中断被更高优先级的任务阻塞,则可能导致程序无法正常响应 TIM3 的中断[^2]。
解决方案是在初始化阶段合理设置 TIM3 的中断优先级,确保其不会因其他高优先级任务而导致延迟处理:
```c
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置优先级分组
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // 配置 TIM3 中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 启用 TIM3 中断
NVIC_Init(&NVIC_InitStructure);
```
#### 2. 定时器模式错误
TIM3 是一个通用定时器,在实现延时期间可能需要启用自动重载预装载功能(ARR 自动加载)。如果没有正确配置此选项,可能会导致计数溢出后未能及时重新加载 ARR 寄存器中的值,从而引发异常行为[^1]。
可以通过以下方式开启自动重载预装载:
```c
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 初始化 TIM3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = PeriodValue; // 设定周期值
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; // 设定预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不进行额外时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方向向上
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 开启自动重载预装载
TIM_ARRPreloadConfig(TIM3, ENABLE);
```
#### 3. 中断服务函数耗时过长
如果 TIM3 的中断服务函数执行时间较长,会占用大量 CPU 资源并影响其他任务运行,最终造成系统假死状态。因此应尽量缩短 ISR (Interrupt Service Routine) 执行时间,并将复杂逻辑移至主线程或其他低优先级线程中完成。
优化后的代码如下所示:
```c
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除标志位
static uint8_t counter = 0;
++counter;
if (counter >= TargetCount) { // 达到目标次数则退出循环
flag = SET; // 修改全局变量通知主程序继续操作
counter = 0;
}
}
}
```
通过以上方法可以有效解决由 TIM3 引发的延时过程中产生的卡顿问题。
---
阅读全文
相关推荐


















