本案例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 */
笔记记之,以防将来的项目类似故障查询。