[研电赛技术支持] GD32 ACM核 MCU进入低功耗模式,唤醒后需要注意的事,程序如何正常运行??

[复制链接]
2136|1
renzheshengui 发表于 2025-11-8 18:06 | 显示全部楼层 |阅读模式
一、先明确:Deep Sleep ≠ 复位
在 Deep Sleep 模式 下:

CPU 停止运行;
SRAM 和寄存器内容保留;
唤醒后 程序继续从 WFI 指令后面执行。
也就是说,你的 enter_pd_mode() 调用:

pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_ENABLE, WFI_CMD);


唤醒后会从这行往下继续执行。
程序不会从 main() 或 Reset_Handler 重新启动。


二、逐条解读你贴的官方描述
① “关闭1.2V域所有时钟,禁用IRC16M、HXTAL及PLL,但SRAM和寄存器内容保留。”
意思是:

20419690ebc4dbbb20.png


所以你唤醒后虽然“代码接着跑”,但所有外设(USART、SPI、ADC 等)时钟源都挂了。
此时系统默认只靠 IRC16M(16 MHz)在跑。

② “1.2V 域供电正常,LDO可配置为正常功耗或低功耗模式”
1.2V 域 = CPU 和核心逻辑域。
低功耗模式下,LDO 会“缓慢供电”,功耗更低,但唤醒时需要时间让电压稳定。
也就是说:

如果你在进入低功耗时使用了 PMU_LDO_LOWPOWER(低功耗LDO),
那唤醒时 MCU 不能立刻执行高速指令,
要“等几微秒”让内部 LDO 稳定后才能恢复正常速度。

这就对应到:

pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_ENABLE, WFI_CMD);


你这里用的 PMU_LDO_LOWPOWER → 意味着唤醒后要多等待一点时间再跑高速代码。

③ “退出后时钟:默认恢复IRC16M作为系统时钟”
这非常关键


MCU唤醒后系统时钟 = 内部RC振荡器IRC16M(16 MHz)

也就是说:

你进入DeepSleep之前,主频可能是 240 MHz(PLL);
唤醒后,主频只有 16 MHz;
所以所有基于时钟的外设(UART波特率、定时器、SPI速率)全都错了!

三、结合你的代码解释唤醒后现象
你的 UART 初始化时是基于 240 MHz 系统时钟:

usart_baudrate_set(USART1, 115200);


但唤醒后,系统自动退回到 16 MHz,而你没有重新配置 PLL。
结果就是:

串口波特率变了 ≈ 原来的 1/15,
电脑看到的是乱码或完全没输出。


四、唤醒后应该做的三件事

7787690ebc2de7afe.png

示例修复流程(GD32 官方推荐)
void enter_pd_mode(void)
{
    debug("Enter DeepSleep...\r\n");

    wakeup_gpio_init();

    // 进入低功耗模式
    pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, PMU_LOWDRIVER_ENABLE, WFI_CMD);

    // === 唤醒后执行此处 ===

    // 1. 等待LDO稳定(关键!)
    for (volatile int i = 0; i < 5000; i++); // 简单延时几百微秒

    // 2. 重新配置系统时钟
    system_clock_config();   // 恢复到原来的240MHz主频

    // 3. 重新初始化外设
    uart1_init();
    adc_init();
    spi_init();

    debug("Wakeup OK, system clock restored to 240MHz!\r\n");
}





五、额外说明:如果你不恢复PLL也可以打印
假设你想快速验证程序“确实唤醒了”而不恢复PLL,可以:

暂时用 IRC16M 重新初始化UART;
用较低波特率,如 9600;
这样在唤醒后不改时钟也能看到打印。
usart_baudrate_set(USART1, 9600);




但正式程序要恢复PLL,不然系统跑在16MHz性能太低。


六、总结一句话

87611690ebc154d241.png

你要不要我帮你在你现有的 enter_pd_mode() 里,插入一段“带时钟恢复 + LDO稳定等待 + 串口恢复”的完整版本?
我可以直接给你一份能在 GD32F4 上跑通、唤醒后立即恢复打印的参考代码。
————————————————
版权声明:本文为CSDN博主「ACM_User」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_57249200/article/details/153534073

小明的同学 发表于 2025-11-13 16:33 | 显示全部楼层
GD32 ACM 核(基于 ARM Cortex-M 系列)MCU 进入低功耗模式后,唤醒后的核心需求是恢复被低功耗模式关闭 / 暂停的硬件模块、校准时钟、处理唤醒源事件,确保程序从暂停点无缝继续运行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

120

主题

4378

帖子

3

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