本帖最后由 游者幻魂 于 2018-9-10 17:32 编辑
写个测试的小程序,用version V4.1.0库函数写的,PD0口设置为外部中断低电平触发,发现唤醒后初始化设备,进入了void Error_Handler(void),while(1)死循环!不过用仿真器从唤醒处一步一步往下走,到最后初始化居然是成功的,正常跑起来!但下一次休眠唤醒不设断点全速跑起来又进入Error_Handler,到底是什么原因呢?脑壳疼!- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_ADC1_Init();
- MX_CAN2_Init();
- MX_IWDG_Init();
- MX_TIM2_Init();
- MX_TIM3_Init();
- MX_TIM4_Init();
- MX_TIM5_Init();
- MX_UART5_Init();
- MX_USART1_UART_Init();
- MX_USART3_UART_Init();
- MX_NVIC_Init();
- while (1)
- {
- if(F_4ms_Timer)
- {
- F_4ms_Timer=0;
- if(Counter_4ms%3==0) //12ms
- {
- if(KEY_DET==1&&Wakeup_Flag==1)
- {
- Wakeup_Flag=0;
- MCU_RESET_SOC=1;
- POWER_ON_CTL=0;
- TFT_PWR_EN=0;
- HAL_ADC_DeInit(&hadc1);
- HAL_TIM_Base_DeInit(&htim2);
- HAL_TIM_PWM_MspDeInit(&htim2);
- HAL_TIM_Base_DeInit(&htim3);
- HAL_TIM_PWM_DeInit(&htim3);
- HAL_TIM_Base_DeInit(&htim4);
- HAL_TIM_Base_MspDeInit(&htim4);
- HAL_TIM_Base_DeInit(&htim5);
- HAL_TIM_OC_MspDeInit(&htim5);
- // HAL_UART_DeInit(&huart1);
- // HAL_UART_DeInit(&huart3);
- // HAL_UART_DeInit(&huart5);
- HAL_UART_MspDeInit(&huart1);
- HAL_UART_MspDeInit(&huart3);
- HAL_UART_MspDeInit(&huart5);
-
- __HAL_CAN_DISABLE_IT(&hcan2,CAN_IT_FMP0);
- HAL_CAN_DeInit(&hcan2);
-
- Ex_NVIC_Config(GPIO_D,0,FTIR); //PD0 ACC_DET ϽµÑØ´¥·¢
- __HAL_RCC_AFIO_CLK_DISABLE();
- __HAL_RCC_GPIOA_CLK_DISABLE();
- __HAL_RCC_GPIOB_CLK_DISABLE();
- __HAL_RCC_GPIOC_CLK_DISABLE();
- __HAL_RCC_GPIOD_CLK_DISABLE();
- __HAL_RCC_GPIOE_CLK_DISABLE();
-
- EXTI->PR=0X00000000;
- //SysTick->CTRL = 0;
- // RCC->APB1RSTR = 0x3E7EC83E; //¸´Î»½áÊø
- // RCC->APB2RSTR = 0x00005E7D;
- SysTick->CTRL=0X00;
- SysTick->VAL=0X00;
-
- __HAL_RCC_PWR_CLK_ENABLE();
- __HAL_RCC_BKP_CLK_ENABLE();
- HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
-
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_ADC1_Init();
- MX_CAN2_Init();
- MX_IWDG_Init();
- MX_TIM2_Init();
- MX_TIM4_Init();
- MX_TIM5_Init();
- MX_UART5_Init();
- MX_USART1_UART_Init();
- MX_USART3_UART_Init();
- MX_NVIC_Init();
-
- }
- else if(Wakeup_Flag==0)
- {
- MCU_RESET_SOC=0;
- POWER_ON_CTL=1;
- TFT_PWR_EN=1;
- Wakeup_Flag=1;
- }
- }
- }
- }
- /* USER CODE END 3 */
- }
复制代码
|
代码里面使用的时钟是内部时钟HSI,没用外部时钟
唤醒之后要跑地方是在睡眠处执行ASM (WFI)之后的,初始化也在唤醒处处理了
我怀疑进入停机模式前要对所有的已经初始化过的设备要Deinit,把相关的数据初始化的内存全部清除掉,做好所有的准备工作,下一次的初始化才有效,不然报错!但通过一步一步调试,问题没出现!