打印
[STM32F2]

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

[复制链接]
2148|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 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
renyaq|  楼主 | 2021-6-9 23:14 | 只看该作者
卡死处为以下代码处:
while (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

使用特权

评论回复
6
renyaq|  楼主 | 2021-6-9 23:16 | 只看该作者
原始代码应为“if”,但是为了找到问题替换成了“while”,果真就卡死了在这里,返回的值是HAL_ERROR和HAL_TIMEOUT。
跟踪函数流程,具体返回HAL_ERROR位置为如下代码处:

使用特权

评论回复
7
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>}

使用特权

评论回复
8
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>
          }
        }

使用特权

评论回复
9
renyaq|  楼主 | 2021-6-9 23:52 | 只看该作者
当出现如上两种错误时,在不重启的情况下,我应该如何解决?

使用特权

评论回复
10
wyjie| | 2021-6-9 23:55 | 只看该作者

你有什么打算呢?或者你想知道什么?

使用特权

评论回复
11
renyaq|  楼主 | 2021-6-9 23:58 | 只看该作者
在main中进入停止模式,使用外部中断进行唤醒后,系统先执行main进入停止模式后面的代码,还是首先执行外部中断的代码?

使用特权

评论回复
12
sonicll| | 2021-6-10 09:25 | 只看该作者
renyaq 发表于 2021-6-9 23:58
在main中进入停止模式,使用外部中断进行唤醒后,系统先执行main进入停止模式后面的代码,还是首先执行外部 ...

先执行外部中断的服务函数,要把中断标志清除,然后才会执行STOP模式后面的代码。STOP模式唤醒后,系统时钟会强制切换到HSI,HSE和PLL被关闭,你需要重新配置系统时钟

使用特权

评论回复
13
renyaq|  楼主 | 2021-6-14 22:11 | 只看该作者
在main中及中断函数中都增加了时钟恢复函数,是否会造成时钟恢复失败?

使用特权

评论回复
14
pengf| | 2021-6-14 22:14 | 只看该作者
恢复后再次运行时钟初始化程序。

使用特权

评论回复
15
zhaoxqi| | 2021-6-14 22:16 | 只看该作者
看看是不是初始化问题造成的。

使用特权

评论回复
16
wyjie| | 2021-6-14 22:19 | 只看该作者
听说STOP后,有一些初始化要重置。

使用特权

评论回复
17
kangzj| | 2021-6-14 22:24 | 只看该作者
比如时钟系统。

使用特权

评论回复
18
supernan| | 2021-6-14 22:26 | 只看该作者
再次初始化试试看

使用特权

评论回复
19
supernan| | 2021-6-14 22:29 | 只看该作者
在恢复的时候再次初始化就可以了

使用特权

评论回复
20
jiajs| | 2021-6-14 22:31 | 只看该作者
我习惯啥都定时进行初始化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

700

主题

10138

帖子

4

粉丝