本案例stm32死机或程序跑飞是实际产品中出现的,初步怀疑是外部中断口,有极强的干扰所致,于是拿着信号发生器实测,当信号发生器产生300KHz的信号,甚至到12MHz的信号时,期间,程序跑飞或死机。看门狗也无法重启。
解决点:1、初始化时,先关闭总中断,初始化完成后,再开启总中断
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init */__disable_irq();/* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();MX_USART1_UART_Init();MX_TIM3_Init();MX_IWDG_Init();MX_RTC_Init();/* USER CODE BEGIN 2 */ PVD_Config();TM1638_Init();light_Init();readConfigPara();light_ConfigPara();__enable_irq();/* USER CODE END 2 */
2、IO中断时,在ISR里先关闭相应的管脚的中断,处理完成后,再开启相应管脚的中 断。避免中断嵌套。
/* USER CODE BEGIN 0 */
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected */LL_EXTI_DisableIT_0_31(GPIO_Pin); if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u){ __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin); }LL_EXTI_EnableIT_0_31(GPIO_Pin);
}
/* USER CODE END 0 */
笔记记之,以防将来的项目类似故障查询。