在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留

在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留大小,以适配不同业务场景(如是否需要保留数据)并最大化降低功耗,下面结合硬件特性和可落地的代码,从「原理→核心函数→分场景实现→验证」全流程讲解:

一、先理解CH585M的PMU+RAM保留硬件特性

CH585M的低功耗核心是「PMU下电模式」和「RAM保留分级」的组合,两者直接决定休眠功耗:

PMU模式 RAM保留选项 休眠功耗(典型值) 数据保留特性 适用场景
Retention(保留) 32K RAM(默认) 1.1μA 保留全部RAM数据,唤醒后直接使用 需要保留大量中间数据
Retention(保留) 16K RAM ≈0.95μA 保留16K RAM数据 中等数据保留需求
Retention(保留) 8K RAM ≈0.8μA 仅保留8K RAM数据 仅需保留少量配置/计数数据
Deep(深度下电) 无RAM保留 ≈0.5μA 所有RAM数据丢失,唤醒后重初始化 无需保留数据,追求极致功耗

二、实现精细化配置的核心函数

CH585M的SDK提供了2个核心函数,是精细化配置的基础,先理解参数含义:

1. RAM保留配置函数

c 复制代码
void PMU_RAMRetentionConfig(PMU_RAM_RETENTION_T size);
  • 入参PMU_RAM_RETENTION_T size:可选值如下(SDK枚举定义):
    • PMU_RAM_RETENTION_32K:保留全部32K RAM(默认)
    • PMU_RAM_RETENTION_16K:保留16K RAM
    • PMU_RAM_RETENTION_8K:仅保留8K RAM

2. PMU下电模式配置函数

c 复制代码
void PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_T mode, uint32_t wakeup_src);
  • 入参1 PMU_PWR_DOWN_MODE_T mode
    • PMU_PWR_DOWN_MODE_RETENTION:保留模式(配合RAM保留)
    • PMU_PWR_DOWN_MODE_DEEP:深度下电模式(无RAM保留)
  • 入参2 wakeup_src:唤醒源(可组合):
    • PMU_PWR_DOWN_WAKEUP_RTC:RTC周期性唤醒(常用)
    • PMU_PWR_DOWN_WAKEUP_GPIO:GPIO外部中断唤醒
    • 0:仅依赖指定唤醒源(无额外唤醒)

三、分场景实现精细化PMU+RAM保留(可直接复用)

场景1:需保留少量数据(如唤醒计数)→8K RAM + Retention模式

这是最常用的平衡方案,功耗低且保留关键数据,完整代码片段:

c 复制代码
#include "CH58x_common.h"

// 定义需要保留的全局变量(放入保留RAM区)
__attribute__((section(".ram_retention"))) uint32_t wakeup_count = 0; // 唤醒计数,保留在8K RAM中

/*********************************************************************
 * @fn      PMU_RAM_Config_MinData
 * @brief   精细化配置:8K RAM保留 + Retention模式 + RTC唤醒
 * @return  none
 ********************************************************************/
void PMU_RAM_Config_MinData(void) {
    // 前置步骤:禁用所有冗余时钟(必做,否则时钟泄漏拉高功耗)
    RCC_PeriphClockCmd(RCC_PERIPH_ALL, DISABLE);
    RCC_PeriphClockCmd(RCC_PERIPH_RTC, ENABLE); // 仅保留RTC时钟
    
    // 步骤1:配置8K RAM保留(核心精细化点)
    PMU_RAMRetentionConfig(PMU_RAM_RETENTION_8K);
    
    // 步骤2:配置PMU Retention模式,仅RTC唤醒
    PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_RETENTION, PMU_PWR_DOWN_WAKEUP_RTC);
    
    // 唤醒计数+1(验证数据是否保留)
    wakeup_count++;
}

// 主函数中调用
int main(void) {
    System_Init();
    while(1) {
        // 业务逻辑:完成后进入精细化低功耗
        PMU_RAM_Config_MinData();
    }
}

场景2:无需保留任何数据→无RAM保留 + Deep模式

追求极致功耗,唤醒后重新初始化所有外设,代码片段:

c 复制代码
/*********************************************************************
 * @fn      PMU_RAM_Config_DeepSleep
 * @brief   精细化配置:无RAM保留 + Deep模式 + RTC唤醒
 * @return  none
 ********************************************************************/
void PMU_RAM_Config_DeepSleep(void) {
    // 前置步骤:禁用所有时钟
    RCC_PeriphClockCmd(RCC_PERIPH_ALL, DISABLE);
    RCC_PeriphClockCmd(RCC_PERIPH_RTC, ENABLE);
    
    // 步骤1:Deep模式无需配置RAM保留(自动无保留)
    // 步骤2:配置PMU Deep模式,仅RTC唤醒
    PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_DEEP, PMU_PWR_DOWN_WAKEUP_RTC);
}

// 主函数中调用(唤醒后需重新初始化外设)
int main(void) {
    while(1) {
        // 唤醒后重新初始化所有外设
        System_Init();
        SX1262_Init();
        W25Q16_Init();
        
        // 完成业务后进入深度下电
        PMU_RAM_Config_DeepSleep();
    }
}

场景3:需保留较多数据→16K/32K RAM + Retention模式

仅在需要保留大量数据时使用(如缓存接收的LoRa数据),代码片段:

c 复制代码
/*********************************************************************
 * @fn      PMU_RAM_Config_MoreData
 * @brief   精细化配置:16K RAM保留 + Retention模式 + RTC+GPIO唤醒
 * @return  none
 ********************************************************************/
void PMU_RAM_Config_MoreData(void) {
    // 前置步骤:禁用冗余时钟
    RCC_PeriphClockCmd(RCC_PERIPH_ALL, DISABLE);
    RCC_PeriphClockCmd(RCC_PERIPH_RTC, ENABLE);
    
    // 步骤1:配置16K RAM保留(按需换32K)
    PMU_RAMRetentionConfig(PMU_RAM_RETENTION_16K); // 换32K则用PMU_RAM_RETENTION_32K
    
    // 步骤2:配置PMU Retention模式,RTC+GPIO双唤醒
    PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_RETENTION, PMU_PWR_DOWN_WAKEUP_RTC | PMU_PWR_DOWN_WAKEUP_GPIO);
}

四、关键注意事项(确保配置生效)

  1. 全局变量放入保留RAM区
    若要保留数据,需给变量加__attribute__((section(".ram_retention")))属性,否则即使配置了RAM保留,变量也会丢失(SDK默认仅.ram_retention段保留)。
  2. 禁用冗余时钟是前提
    无论哪种配置,必须先禁用RCC_PERIPH_ALL(除RTC),否则外设时钟泄漏会让功耗比理论值高0.5~1μA。
  3. 唤醒源匹配场景
    • 仅周期性任务:选PMU_PWR_DOWN_WAKEUP_RTC
    • 需紧急响应:加PMU_PWR_DOWN_WAKEUP_GPIO,但会轻微增加漏电(≈0.1μA)。

五、验证配置是否生效

  1. 功耗验证
    • 8K RAM+Retention:CH585M休眠功耗≈0.8μA;
    • Deep模式:≈0.5μA;
    • 若功耗偏高,检查是否漏关时钟/GPIO未设为模拟输入。
  2. 数据保留验证
    打印wakeup_count变量,若每次唤醒后计数递增,说明RAM保留生效;若重置为0,说明配置错误(如变量未加保留属性)。

总结

实现CH585M精细化PMU+RAM保留的核心是:

  1. 按业务需求选最小RAM保留(8K优先,非必要不选16K/32K);
  2. 按需选PMU模式(需保留数据→Retention,无需→Deep);
  3. 配置前必禁冗余时钟(否则功耗优化失效)。

这套配置方式可直接集成到之前的低功耗工程代码中,替换原有简单的PMU配置,进一步压低休眠功耗。

相关推荐
xsdick几秒前
抛弃 OpenClawd吧!我用 Go 打造了企业级 Swarm(蜂群)agent,更智能,更安全、性能快 5 倍、成本直降80%
人工智能·ai·ai编程
Uncertainty!!12 分钟前
Ubuntu 22.04 安装超好用中文输入法rime-ice(雾凇拼音)过程记录
linux·ubuntu·中文输入法
冬奇Lab22 分钟前
Workflow 系列(10):企业级架构——注册表、组合与治理
人工智能·工作流引擎
F202269748625 分钟前
西门子 PLC 与 C# 通信
开发语言·c#
冬奇Lab35 分钟前
每日一个开源项目(第153篇):AgentsView - 跨 30+ AI 编程工具的会话分析和费用追踪,本地优先,无需账号
人工智能·开源·ai编程
泛普软件39 分钟前
工程合约管理软件具备哪些核心功能,解决合同结算各类纠纷难题
大数据·人工智能·区块链
gugucoding43 分钟前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
zhangxingchao1 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端
bkl_92131 小时前
GPT-Image-2 文生图:前景与背景怎么区分?
人工智能·gpt
ShineWinsu1 小时前
对于Linux:网络基础的解析
linux·网络·面试·udp·笔试·ip·tcp