STM32H743ZI定时器中断驱动双LED闪烁故障排查求助
嘿,我帮你找到了代码里几个关键问题,这就是程序死循环、LED不亮的根源:
1. 中断号配置完全错误(最致命)
你在main函数的USER CODE BEGIN 1块里自己定义了IRQn_Type TIM6_IRQn = 0;,这完全搞错了!STM32的中断号是CMSIS已经预定义好的枚举值,TIM6_IRQn本身就是系统提供的正确中断号,不需要你手动赋值为0。
你现在相当于把NMI(0号中断,非屏蔽中断)的优先级改成了0,还开了NMI中断,但TIM6的中断根本没被正确配置——这不仅会导致TIM6的中断永远触发不了,还可能干扰系统核心的NMI中断,直接让程序跑飞进死循环。
修复:直接删掉你自己定义的那行IRQn_Type TIM6_IRQn = 0;,用系统自带的TIM6_IRQn就行。
2. 重复开启TIM6时钟(冗余但不致命)
你在USER CODE BEGIN 2里加了__HAL_RCC_TIM6_CLK_ENABLE();,但MX_TIM6_Init()里调用的HAL_TIM_Base_Init(&htim6)已经会自动开启TIM6的外设时钟了,这行代码完全多余,删掉就行。
3. 引脚匹配要确认
你在中断回调里操作的是GPIOB_PIN_14和GPIOB_PIN_7,看你的MX_GPIO_Init(),配置成输出的GPIOB引脚是PB0、LD3_Pin、LD2_Pin。CubeMX里Nucleo-144 H743的LD2对应PB7,LD3对应PB14,所以硬编码引脚号其实没问题,但更稳妥的是直接用CubeMX生成的引脚宏:
HAL_GPIO_TogglePin(GPIOB, LD3_Pin); HAL_GPIO_TogglePin(GPIOB, LD2_Pin);
4. 检查是不是进了Error_Handler死循环
程序卡死大概率是某个HAL初始化函数失败,触发了默认的Error_Handler()(里面就是while(1))。你可以给Error_Handler()加个简单的LED闪烁,或者用调试器断点看看,是不是HAL_TIM_Base_Init或者其他初始化函数返回了错误。比如系统时钟配置不对的话,TIM6初始化会失败。
修复后的核心代码片段
修改后的main函数相关部分:
/* USER CODE BEGIN 1 */ // 删掉原来的TIM6_IRQn定义 /* USER CODE END 1 */ // ... 中间初始化代码不变 ... /* USER CODE BEGIN 2 */ // 删掉重复的__HAL_RCC_TIM6_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM6_IRQn); HAL_TIM_Base_Start_IT(&htim6); /* USER CODE END 2 */
最后再验证下定时公式:400MHz时钟,预分频399999(+1后是400000),周期499(+1后是500),计算下来400000*500/400000000 = 0.5s,这个是对的,没问题。
内容的提问来源于stack exchange,提问作者Ivan




