你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
游者幻魂 提问时间:2018-9-5 22:26 /
本帖最后由 游者幻魂 于 2018-9-10 17:32 编辑

写个测试的小程序,用version V4.1.0库函数写的,PD0口设置为外部中断低电平触发,发现唤醒后初始化设备,进入了void Error_Handler(void),while(1)死循环!不过用仿真器从唤醒处一步一步往下走,到最后初始化居然是成功的,正常跑起来!但下一次休眠唤醒不设断点全速跑起来又进入Error_Handler,到底是什么原因呢?脑壳疼!
  1. int main(void)
  2. {
  3.   HAL_Init();
  4.   SystemClock_Config();
  5.   MX_GPIO_Init();
  6.   MX_ADC1_Init();
  7.   MX_CAN2_Init();
  8.   MX_IWDG_Init();
  9.   MX_TIM2_Init();
  10.         MX_TIM3_Init();
  11.   MX_TIM4_Init();
  12.   MX_TIM5_Init();
  13.   MX_UART5_Init();
  14.   MX_USART1_UART_Init();
  15.   MX_USART3_UART_Init();
  16.   MX_NVIC_Init();

  17.   while (1)
  18.   {
  19.                         if(F_4ms_Timer)
  20.                         {
  21.                                         F_4ms_Timer=0;
  22.                                         if(Counter_4ms%3==0)                        //12ms
  23.                                         {
  24.                                                         if(KEY_DET==1&&Wakeup_Flag==1)
  25.                                                         {
  26.                                                                                 Wakeup_Flag=0;               
  27.                                                                                 MCU_RESET_SOC=1;
  28.                                                                                 POWER_ON_CTL=0;
  29.                                                                                 TFT_PWR_EN=0;
  30.                                                                                 HAL_ADC_DeInit(&hadc1);                                
  31.                                                                                 HAL_TIM_Base_DeInit(&htim2);
  32.                                                                                 HAL_TIM_PWM_MspDeInit(&htim2);
  33.                                                                                 HAL_TIM_Base_DeInit(&htim3);
  34.                                                                                 HAL_TIM_PWM_DeInit(&htim3);
  35.                                                                                 HAL_TIM_Base_DeInit(&htim4);
  36.                                                                                 HAL_TIM_Base_MspDeInit(&htim4);
  37.                                                                                 HAL_TIM_Base_DeInit(&htim5);
  38.                                                                                 HAL_TIM_OC_MspDeInit(&htim5);

  39.                                                                                 //        HAL_UART_DeInit(&huart1);        
  40.                                                                                 //        HAL_UART_DeInit(&huart3);
  41.                                                                                 //        HAL_UART_DeInit(&huart5);
  42.                                                                                 HAL_UART_MspDeInit(&huart1);        
  43.                                                                                 HAL_UART_MspDeInit(&huart3);        
  44.                                                                                 HAL_UART_MspDeInit(&huart5);        
  45.         
  46.                                                                                 __HAL_CAN_DISABLE_IT(&hcan2,CAN_IT_FMP0);
  47.                                                                                 HAL_CAN_DeInit(&hcan2);
  48.                                                                                                 
  49.                                                                         Ex_NVIC_Config(GPIO_D,0,FTIR);                                                //PD0 ACC_DET ϽµÑØ´¥·¢

  50.                                                                         __HAL_RCC_AFIO_CLK_DISABLE();
  51.                                                                         __HAL_RCC_GPIOA_CLK_DISABLE();
  52.                                                                         __HAL_RCC_GPIOB_CLK_DISABLE();
  53.                                                                         __HAL_RCC_GPIOC_CLK_DISABLE();        
  54.                                                                         __HAL_RCC_GPIOD_CLK_DISABLE();
  55.                                                                         __HAL_RCC_GPIOE_CLK_DISABLE();
  56.         
  57.                                                                         EXTI->PR=0X00000000;
  58.                                                                         //SysTick->CTRL  = 0;

  59.                                                                         //         RCC->APB1RSTR = 0x3E7EC83E;                //¸´Î»½áÊø                        
  60.                                                                         //        RCC->APB2RSTR = 0x00005E7D;         

  61.                                                                         SysTick->CTRL=0X00;
  62.                                                                         SysTick->VAL=0X00;
  63.                
  64.                                                                         __HAL_RCC_PWR_CLK_ENABLE();
  65.                                                                         __HAL_RCC_BKP_CLK_ENABLE();
  66.                                                                         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
  67.                                                                
  68.                                                                         HAL_Init();
  69.                                                                         SystemClock_Config();
  70.                                                                         MX_GPIO_Init();
  71.                                                                         MX_ADC1_Init();
  72.                                                                         MX_CAN2_Init();
  73.                                                                         MX_IWDG_Init();
  74.                                                                         MX_TIM2_Init();
  75.                                                                         MX_TIM4_Init();
  76.                                                                         MX_TIM5_Init();
  77.                                                                         MX_UART5_Init();
  78.                                                                         MX_USART1_UART_Init();
  79.                                                                         MX_USART3_UART_Init();
  80.                                                                         MX_NVIC_Init();        
  81.                                                                                                                                 
  82.                                                         }
  83.                                                         else if(Wakeup_Flag==0)
  84.                                                         {
  85.                                                                         MCU_RESET_SOC=0;
  86.                                                                         POWER_ON_CTL=1;
  87.                                                                         TFT_PWR_EN=1;
  88.                                                                         Wakeup_Flag=1;
  89.                                                         }
  90.                                         }
  91.                         }
  92.   }
  93.   /* USER CODE END 3 */

  94. }
复制代码


sleeptest.rar

下载

6.02 MB, 下载次数: 1, 下载积分: ST金币 -1

收藏 评论3 发布时间:2018-9-5 22:26

举报

3个回答
feixiang20 回答时间:2018-9-5 23:22:35
死循环是语法问题,可能系统时钟初始化函数有错误,或者停机唤醒后时钟会变为HSI时钟,唤醒后首先执行的是外部中断的函数,然后是进入停机模式之后的函数,要继续执行下去的话需要在停机模式的函数后面再初始化一下系统时钟函数
游者幻魂 回答时间:2018-9-6 11:13:01
feixiang20 发表于 2018-9-5 23:22
死循环是语法问题,可能系统时钟初始化函数有错误,或者停机唤醒后时钟会变为HSI时钟,唤醒后首先执行的是 ...

代码里面使用的时钟是内部时钟HSI,没用外部时钟 QQ图片20180906110445.png



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


我怀疑进入停机模式前要对所有的已经初始化过的设备要Deinit,把相关的数据初始化的内存全部清除掉,做好所有的准备工作,下一次的初始化才有效,不然报错!但通过一步一步调试,问题没出现!
游者幻魂 回答时间:2018-9-10 17:33:41
已解决!是开机第一次初始化独立看门狗,唤醒不用再初始化!另外看门狗初始化的位置放得不对,同样会引起该问题!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版