游者幻魂 发表于 2018-9-5 22:26:02

STM32f105进入停机模式,唤醒后初始化失败!

本帖最后由 游者幻魂 于 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 */

}

feixiang20 发表于 2018-9-5 23:22:35

死循环是语法问题,可能系统时钟初始化函数有错误,或者停机唤醒后时钟会变为HSI时钟,唤醒后首先执行的是外部中断的函数,然后是进入停机模式之后的函数,要继续执行下去的话需要在停机模式的函数后面再初始化一下系统时钟函数

游者幻魂 发表于 2018-9-6 11:13:01

feixiang20 发表于 2018-9-5 23:22
死循环是语法问题,可能系统时钟初始化函数有错误,或者停机唤醒后时钟会变为HSI时钟,唤醒后首先执行的是 ...

代码里面使用的时钟是内部时钟HSI,没用外部时钟



唤醒之后要跑地方是在睡眠处执行ASM (WFI)之后的,初始化也在唤醒处处理了


我怀疑进入停机模式前要对所有的已经初始化过的设备要Deinit,把相关的数据初始化的内存全部清除掉,做好所有的准备工作,下一次的初始化才有效,不然报错!但通过一步一步调试,问题没出现!

游者幻魂 发表于 2018-9-10 17:33:41

已解决!是开机第一次初始化独立看门狗,唤醒不用再初始化!另外看门狗初始化的位置放得不对,同样会引起该问题!
页: [1]
查看完整版本: STM32f105进入停机模式,唤醒后初始化失败!