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

[复制链接]
2597|23
 楼主| renyaq 发表于 2021-6-9 23:03 | 显示全部楼层 |阅读模式
唤醒恢复时钟时异常卡死
pengf 发表于 2021-6-9 23:06 | 显示全部楼层


楼主详细说说怎么回事啊,这么说太笼统了
 楼主| renyaq 发表于 2021-6-9 23:08 | 显示全部楼层
为了进一步降低功耗,使用STOP模式。但是恢复时就出问题了
huangchui 发表于 2021-6-9 23:10 | 显示全部楼层

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| renyaq 发表于 2021-6-9 23:14 | 显示全部楼层
卡死处为以下代码处:
while (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
 楼主| renyaq 发表于 2021-6-9 23:16 | 显示全部楼层
原始代码应为“if”,但是为了找到问题替换成了“while”,果真就卡死了在这里,返回的值是HAL_ERROR和HAL_TIMEOUT。
跟踪函数流程,具体返回HAL_ERROR位置为如下代码处:
 楼主| renyaq 发表于 2021-6-9 23:43 | 显示全部楼层
  /*-------------------------------- PLL Configuration -----------------------*/

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

 楼主| renyaq 发表于 2021-6-9 23:48 | 显示全部楼层
返回HAL_TIMEOUT位置代码如下:
  /*-------------------------------- PLL Configuration -----------------------*/
  /* Check the parameters */
  assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));
  if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE)
  {
    /* Check if the PLL is used as system clock or not */
    if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL)
    {
      if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON)
      {
        /* Check the parameters */
        assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource));
        assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM));
        assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN));
        assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP));
        assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));

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

        /* Get Start Tick */
        tickstart = HAL_GetTick();

        /* Wait till PLL is ready */
        while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET)
        {
          if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE)
          {
            <font color="DarkOrange">return HAL_TIMEOUT;//此处返回超时错误</font>
          }
        }
 楼主| renyaq 发表于 2021-6-9 23:52 | 显示全部楼层
当出现如上两种错误时,在不重启的情况下,我应该如何解决?
wyjie 发表于 2021-6-9 23:55 | 显示全部楼层

你有什么打算呢?或者你想知道什么?
 楼主| renyaq 发表于 2021-6-9 23:58 | 显示全部楼层
在main中进入停止模式,使用外部中断进行唤醒后,系统先执行main进入停止模式后面的代码,还是首先执行外部中断的代码?
sonicll 发表于 2021-6-10 09:25 | 显示全部楼层
renyaq 发表于 2021-6-9 23:58
在main中进入停止模式,使用外部中断进行唤醒后,系统先执行main进入停止模式后面的代码,还是首先执行外部 ...

先执行外部中断的服务函数,要把中断标志清除,然后才会执行STOP模式后面的代码。STOP模式唤醒后,系统时钟会强制切换到HSI,HSE和PLL被关闭,你需要重新配置系统时钟
 楼主| renyaq 发表于 2021-6-14 22:11 | 显示全部楼层
在main中及中断函数中都增加了时钟恢复函数,是否会造成时钟恢复失败?
pengf 发表于 2021-6-14 22:14 | 显示全部楼层
恢复后再次运行时钟初始化程序。
zhaoxqi 发表于 2021-6-14 22:16 | 显示全部楼层
看看是不是初始化问题造成的。
wyjie 发表于 2021-6-14 22:19 | 显示全部楼层
听说STOP后,有一些初始化要重置。
kangzj 发表于 2021-6-14 22:24 | 显示全部楼层
比如时钟系统。
supernan 发表于 2021-6-14 22:26 | 显示全部楼层
再次初始化试试看
supernan 发表于 2021-6-14 22:29 | 显示全部楼层
在恢复的时候再次初始化就可以了
jiajs 发表于 2021-6-14 22:31 | 显示全部楼层
我习惯啥都定时进行初始化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

700

主题

10138

帖子

4

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