STM32无法进入STOP模式的解决方法

最近在使用RT-Thread的PM组件时遇到了一奇怪的现象,发现居然进不去,调用HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI)函数会直接跳过里面的__WFI函数,以下是出问题的代码段。

static void _drv_pm_enter(struct rt_pm *pm)
{
    rt_uint32_t mode;

    mode = pm->current_mode;

    switch (mode)
    {
    case PM_RUN_MODE_NORMAL:
        break;

    case PM_SLEEP_MODE_SLEEP:
        HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
        break;

    case PM_SLEEP_MODE_TIMER:
        rt_kprintf("enter stop mode,tick = %d\n",rt_tick_get());
        HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
        rt_update_system_clock();
        rt_kprintf("exit stop mode,tick = %d\n",rt_tick_get());
        break;

    case PM_SLEEP_MODE_SHUTDOWN:
        HAL_PWREx_EnterSHUTDOWNMode();
        break;

    default:
        RT_ASSERT(0);
        break;
    }
}

在进入STOP模式前希望打印一些提示信息,然而就是这行打印导致了进不去STOP模式。因为_drv_pm_enter是个回调函数,在调用这个回调函数前,pm组件调用了rt_hw_interrupt_disable关闭了中断,而这行打印已经超过RTOS的1个tick(我设置的是1000Hz),导致systick中断已经pending了但因为中断被关闭所以无法处理,而__WFI函数的前提是系统没有中断在pending,所以造成了进不去STOP模式的现象。

简单来说,以上现象可以抽象成以下代码。

__disable_irq();                                /* 关闭全局中断 */
printf("enter stop mode\r\n");                  /* 打印提示,因耗时导致systick中断pending */
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);    /* 进入STOP模式 */

根本原因在于进入STOP模式前系统有中断在pending。所以解决方法就是在HAL_PWREx_EnterSTOP2Mode函数前打个断点,查看此时系统中在pending的中断。具体的查看方法可以参考我的这篇博客:https://blog.csdn.net/qq_27575841/article/details/106973644

下图是我截取的NVIC信息,可以看到在进入STOP模式前,systick中断在pending,所以无法进入。

回答: 如果您的STM32无法烧录程序,可能有几个可能的原因。首先,您可以检查电源是否正常工作,并确保电源电压稳定。其次,您可以检查最小系统是否正常工作,包括检查引脚是否断开或与其他线短路,以及检查烧录引脚上是否有电容或过大的电阻。\[2\]此外,如果您的STM32误入了STOP模式并且没有写入相应的唤醒方法,可能会导致程序无法下载。在这种情况下,您可以尝试按住复位键,然后点击下载,然后松开复位键,以解决无法唤醒的问题。\[3\]希望这些解决方法能帮助您解决STM32无法烧录程序的问题。 #### 引用[.reference_title] - *1* *3* [stm32单片机进入低功耗后无法烧录程序](https://blog.csdn.net/guangod/article/details/108112346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32单片机烧录失败汇总](https://blog.csdn.net/liuhuan307056001/article/details/109721587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dokin丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值