RT-Threadwilliam hill官网
直播中

李玉兰

7年用户 1514经验值
私信 关注
[问答]

GD32F303无法进入低功耗模式的原因?怎么解决?

希望在原有代码的基础上加入PM组件实现低功耗,目前是直接进入待机模式就可以
但是在测试的时候发现,无法进入低功耗模式,现象如下:

void enter_standby_mode(void) {
    pmu_wakeup_pin_enable();
    pmu_to_standbymode(WFI_CMD);
}
直接执行GD32的库函数进入低功耗模式,会失败,形式为按下唤醒键后不会重启,会继续执行后续的代码
改成PM组件使用rt_pm_request(PM_SLEEP_MODE_STANDBY);(会先调用rt_pm_release(PM_SLEEP_MODE_NONE)释放掉None模式的请求),也同1的情况类似,在IDLE线程中会通过_pm_change_sleep_mode调用自己写的sleep函数,然后执行pmu_to_standbymode
个人猜想是底层的驱动或者rt-thread的某些机制影响了代码的执行,但无法确定问题
我使用GD32的板级支持包新建了一个项目,只使用PM组件进行电源关系,不管是DEEPSLEEP还是standby模式都能正常进入与唤醒,但是在自己的项目上就不行,我尝试了将原项目的代码移植到新项目上,后续也出现无法进入睡眠模式的问题
我的测试情况是关闭了所有其他线程的初始化,直接在main函数中通过while(1)进入睡眠模式的,且在新项目上成功过
项目中使用的驱动有串口、adc(电压采集)、pwm(舵机控制)、gpio(led)和按钮
希望有大佬帮我分析下问题,实在没有头绪

回帖(1)

李鸿洋

2024-7-9 16:02:28
GD32F303无法进入低功耗模式的原因可能有以下几点:

1. 电源管理配置不正确:确保在初始化过程中正确配置了电源管理模块。
2. 唤醒源未配置:确保已经配置了唤醒源,如外部中断、定时器等。
3. 时钟配置问题:检查时钟配置是否正确,确保系统时钟在低功耗模式下仍然可以正常工作。
4. 其他外设干扰:检查其他外设是否在低功耗模式下正常工作,避免对低功耗模式的干扰。

为了解决这个问题,可以尝试以下步骤:

1. 确保电源管理模块已经正确初始化。在原有代码的基础上,加入PM组件的初始化代码,例如:

```c
int main(void)
{
    // 其他初始化代码
    rt_pm_init();
    // 其他代码
}
```

2. 配置唤醒源。在进入低功耗模式之前,确保已经配置了唤醒源,例如:

```c
void enter_standby_mode(void)
{
    // 配置唤醒源,例如外部中断
    // ...

    pmu_wakeup_pin_enable();
    pmu_to_standbymode(WFI_CMD);
}
```

3. 检查时钟配置。确保在低功耗模式下,系统时钟仍然可以正常工作。可以在进入低功耗模式之前,将系统时钟切换到低速时钟源,例如:

```c
void enter_standby_mode(void)
{
    // 切换到低速时钟源
    // ...

    // 配置唤醒源
    // ...

    pmu_wakeup_pin_enable();
    pmu_to_standbymode(WFI_CMD);
}
```

4. 在IDLE线程中使用RT-Thread的PM组件。在IDLE线程中,可以使用RT-Thread的PM组件来管理低功耗模式,例如:

```c
#include

void idle_thread_entry(void *parameter)
{
    while (1)
    {
        rt_thread_mdelay(100);
        rt_pm_request(PM_SLEEP_MODE_STANDBY);
    }
}
```

5. 如果问题仍然存在,可以尝试使用调试工具(如ST-Link)来检查程序在低功耗模式下的执行情况,以便找到问题所在。

通过以上步骤,应该可以解决GD32F303无法进入低功耗模式的问题。如果问题仍然存在,请检查硬件连接和电源供应是否正常。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分