[STM32F2] 求助!F205进入STOP模式后,唤醒恢复时钟时异常卡死!

[复制链接]
1119|5
 楼主| zwl3615473 发表于 2019-7-7 11:20 | 显示全部楼层 |阅读模式
为了进一步降低功耗,使用STOP模式。但是恢复时就出问题了。卡死处为以下代码处:
  1. while (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  2.   {
  3.     _Error_Handler(__FILE__, __LINE__);
  4.   }
原始代码应为“if”,但是为了找到问题替换成了“while”,果真就卡死了在这里,返回的值是HAL_ERROR和HAL_TIMEOUT。
跟踪函数流程,具体返回HAL_ERROR位置为如下代码处:
  1.   /*-------------------------------- PLL Configuration -----------------------*/

  2. /* Check the parameters */
  3.   assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
  4.   if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
  5.   {
  6.     /* Check if the PLL is used as system clock or not */
  7.     if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL)
  8.     {……}else{<font color="Red">return HAL_ERROR;//此处返回错误!</font>}


返回HAL_TIMEOUT位置代码如下:
  1.   /*-------------------------------- PLL Configuration -----------------------*/
  2.   /* Check the parameters */
  3.   assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
  4.   if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
  5.   {
  6.     /* Check if the PLL is used as system clock or not */
  7.     if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL)
  8.     {
  9.       if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON)
  10.       {
  11.         /* Check the parameters */
  12.         assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource));
  13.         assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM));
  14.         assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN));
  15.         assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP));
  16.         assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));

  17.         /* Disable the main PLL. */
  18.         __HAL_RCC_PLL_DISABLE();

  19.         /* Get Start Tick */
  20.         tickstart = HAL_GetTick();

  21.         /* Wait till PLL is ready */
  22.         while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET)
  23.         {
  24.           if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE)
  25.           {
  26.             <font color="DarkOrange">return HAL_TIMEOUT;//此处返回超时错误</font>
  27.           }
  28.         }
问题:
1、当出现如上两种错误时,在不重启的情况下,我应该如何解决?
2、在main中进入停止模式,使用外部中断进行唤醒后,系统先执行main进入停止模式后面的代码,还是首先执行外部中断的代码?
3、在main中及中断函数中都增加了时钟恢复函数,是否会造成时钟恢复失败?

xuanhuanzi 发表于 2019-7-7 19:04 | 显示全部楼层
恢复后再次运行时钟初始化程序。
xuanhuanzi 发表于 2019-7-7 19:04 | 显示全部楼层
看看是不是初始化问题造成的。听说STOP后,有一些初始化要重置。比如时钟系统。
八层楼 发表于 2019-8-6 10:55 | 显示全部楼层
再次初始化试试看
观海 发表于 2019-8-6 11:04 | 显示全部楼层
在恢复的时候再次初始化就可以了
guanjiaer 发表于 2019-8-6 11:08 | 显示全部楼层
我习惯啥都定时进行初始化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部