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 */
}
死循环是语法问题,可能系统时钟初始化函数有错误,或者停机唤醒后时钟会变为HSI时钟,唤醒后首先执行的是外部中断的函数,然后是进入停机模式之后的函数,要继续执行下去的话需要在停机模式的函数后面再初始化一下系统时钟函数 feixiang20 发表于 2018-9-5 23:22
死循环是语法问题,可能系统时钟初始化函数有错误,或者停机唤醒后时钟会变为HSI时钟,唤醒后首先执行的是 ...
代码里面使用的时钟是内部时钟HSI,没用外部时钟
唤醒之后要跑地方是在睡眠处执行ASM (WFI)之后的,初始化也在唤醒处处理了
我怀疑进入停机模式前要对所有的已经初始化过的设备要Deinit,把相关的数据初始化的内存全部清除掉,做好所有的准备工作,下一次的初始化才有效,不然报错!但通过一步一步调试,问题没出现!
已解决!是开机第一次初始化独立看门狗,唤醒不用再初始化!另外看门狗初始化的位置放得不对,同样会引起该问题!
页:
[1]