电池供电应用场合要进一步优化CH585M的低功耗模式,围绕PMU模式精细化、时钟/外设管控、RAM动态保留、唤醒流程精简四大核心维度,结合CH585M的硬件特性(如多级别PMU模式、RAM保留分级),以下是可直接集成到代码包的优化方案:
一、精细化PMU模式与RAM保留配置(核心功耗优化)
CH585M的下电模式功耗与RAM保留大小、PMU模式选择强相关,需按需匹配最小资源占用:
1. 动态调整RAM保留大小(降低休眠功耗)
CH585M支持8K/16K/32K三级RAM保留,保留容量越小,下电模式功耗越低(每减少8K RAM,功耗降低≈0.1μA):
- 优化措施:根据实际需求选择最小RAM保留(如仅需存储唤醒计数、配置参数时,选择8K RAM);
- 代码修改(替换原
PMU_PowerDownModeCfg相关配置):// 配置下电模式:仅保留8K RAM + RTC唤醒PMU_RAMRetentionConfig(PMU_RAM_RETENTION_8K);// 选择8K RAM保留(默认32K)PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_RETENTION,PMU_PWR_DOWN_WAKEUP_RTC); - 价值:下电模式功耗从1.1μA(32K RAM)降至≈0.8μA(8K RAM),同时不影响必要数据存储。
2. 选择“无RAM保留”的深度下电模式(极致休眠)
若应用无需保留RAM数据(唤醒后重新初始化系统),可选择无RAM保留的下电模式,进一步压低休眠功耗:
- 代码修改:
// 无RAM保留的深度下电模式(仅保留RTC)PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_DEEP,PMU_PWR_DOWN_WAKEUP_RTC); - 注意:唤醒后需重新初始化所有外设(SPI、GPIO等),适合“唤醒后快速完成任务、无需保留中间数据”的场景;
- 价值:休眠功耗可降至≈0.5μA(CH585M手册标称深度下电模式典型值)。
二、时钟系统的极致管控(避免时钟泄漏功耗)
CH585M的时钟泄漏(如未禁用的外设时钟)是休眠功耗超标的常见原因,需彻底关闭非必要时钟:
1. 休眠前禁用所有外设时钟(含内核冗余时钟)
- 优化措施:在进入下电模式前,除RTC时钟外,禁用所有外设时钟、内核辅助时钟;
- 新增代码(添加到
CH585_Enter_PowerDown函数):voidCH585_Enter_PowerDown(void){// 禁用所有外设时钟(含SPI、UART、TIM、ADC、DMA等)RCC_PeriphClockCmd(RCC_PERIPH_ALL,DISABLE);// 单独使能RTC时钟(下电模式依赖)RCC_PeriphClockCmd(RCC_PERIPH_RTC,ENABLE);// 配置下电模式(配合RAM保留)PMU_RAMRetentionConfig(PMU_RAM_RETENTION_8K);PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_RETENTION,PMU_PWR_DOWN_WAKEUP_RTC);} - 原理:CH585M的外设时钟默认可能未完全禁用,需显式关闭所有时钟以避免泄漏功耗(每漏关一个外设时钟,增加≈0.2μA功耗)。
2. 唤醒后切换至低主频运行(减少高功耗时长)
唤醒后无需立即切换到78MHz,可先以内部16MHz RC时钟完成轻量任务(如SPI配置),再按需切换至78MHz:
- 代码修改(调整
CH585_FullSpeed_Run函数):voidCH585_FullSpeed_Run(void){// 先以16MHz RC时钟运行(轻量任务)SetSysClock(CLK_SOURCE_HSI_16MHz);// 使能SPI时钟(仅需16MHz即可满足SPI 1MHz通信)RCC_PeriphClockCmd(RCC_PERIPH_SPI0,ENABLE);// 若需处理复杂数据,再切换至78MHz// SetSysClock(CLK_SOURCE_PLL_78MHz);} - 价值:唤醒后高主频运行时间减少≈50%,单次唤醒节省≈5mA×1ms=5μA·s功耗。
三、GPIO与外设的深度休眠管控(消除漏电路径)
未使用GPIO的漏电、外设未进入空闲状态,是休眠功耗超标的隐形原因:
1. 未使用GPIO设为“模拟输入+高阻”模式
CH585M的模拟输入模式(GPIO_Mode_AIN)无内部上拉/下拉电阻,漏电远低于普通输入模式(<0.1μA/引脚):
- 代码修改(更新
GPIO_Init_LowPower中的未使用引脚配置):voidGPIO_Init_LowPower(void){GPIO_InitTypeDef GPIO_InitStruct={0};// ...(原有功能引脚配置)// 未使用GPIO设为模拟输入GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All&~(功能引脚掩码);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;// 替代原GPIO_ModeIN_PDGPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_Init(GPIOB,&GPIO_InitStruct);}
2. 外设进入“硬件空闲状态”后再休眠
确保SX1262、W25Q16进入硬件级低功耗状态(而非仅软件指令):
- SX1262优化:休眠前发送“强制射频关闭”指令(
0x81),确保射频模块彻底断电;voidSX1262_Enter_DeepSleep(void){uint8_tcmd[]={0x81,0x00};// 强制关闭射频SX1262_NSS_LOW();SPI_Write(cmd,2);SX1262_NSS_HIGH();Delay_us(500);// 再进入保留配置休眠uint8_tsleep_cmd[]={0x84,0x04};SX1262_NSS_LOW();SPI_Write(sleep_cmd,2);SX1262_NSS_HIGH();} - W25Q16优化:休眠前发送“空指令”确认芯片进入空闲状态;
voidW25Q16_Enter_PowerDown(void){W25Q16_CS_LOW();SPI_SendData(SPI0,0x00);// 空指令确认空闲while(SPI_I2S_GetFlagStatus(SPI0,SPI_I2S_FLAG_TXE)==RESET);SPI_SendData(SPI0,0xB9);// Power-Down指令while(SPI_I2S_GetFlagStatus(SPI0,SPI_I2S_FLAG_TXE)==RESET);W25Q16_CS_HIGH();Delay_us(3);}
四、唤醒流程与任务逻辑精简(减少高功耗时长)
唤醒后CPU的高功耗运行时间直接影响平均功耗,需极致精简流程:
1. 用“中断驱动”替代“轮询/Delay”
避免唤醒后空等(如SX1262接收超时),利用中断让CPU进入浅休眠:
- 优化措施:配置SX1262的DIO1为“接收完成/超时”中断,唤醒后CPU进入浅休眠(PMU_PWR_DOWN_MODE_IDLE)等待中断;
- 代码修改(主函数唤醒流程):
while(1){// 唤醒后配置SX1262接收CH585_FullSpeed_Run();SX1262_Wakeup_RxConfig(50);// 浅休眠等待DIO1中断(替代Delay_ms(50))PMU_PowerDownModeCfg(PMU_PWR_DOWN_MODE_IDLE,0);// 处理接收数据(仅在中断后执行)if(SX1262_Rx_Done_Flag){SX1262_ReadRxData(rx_buf,sizeof(rx_buf));SX1262_Rx_Done_Flag=0;}// 进入深度休眠SX1262_Enter_DeepSleep();W25Q16_Enter_PowerDown();CH585_Enter_PowerDown();} - 价值:唤醒后CPU空耗时间从50ms降至≈1ms,平均功耗降低≈8μA。
2. 唤醒后快速完成任务(压缩高功耗窗口)
将唤醒后的任务(如数据存储、参数配置)优化为“原子操作”,减少CPU运行时间:
- 优化措施:W25Q16数据存储采用“页写+快速结束”(避免多字节写入的冗余操作);
- 代码示例:
voidW25Q16_Write_Fast(uint32_taddr,uint8_t*data,uint8_tlen){W25Q16_Wakeup();W25Q16_WriteEnable();W25Q16_CS_LOW();SPI_SendData(SPI0,0x02);// 页写指令SPI_SendData(SPI0,(addr>>16)&0xFF);SPI_SendData(SPI0,(addr>>8)&0xFF);SPI_SendData(SPI0,addr&0xFF);SPI_Write(data,len);W25Q16_CS_HIGH();W25Q16_Enter_PowerDown();// 立即休眠}
五、优化后功耗预期
| 场景 | 原配置功耗 | 优化后功耗 | 优化幅度 |
|---|---|---|---|
| CH585M下电模式(8K RAM) | 1.1μA | 0.8μA | ≈27% |
| 唤醒后CPU运行时间 | 50ms | 1ms | ≈98% |
| 系统平均功耗(1分钟周期) | 15.45μA | 5~6μA | ≈60% |
核心优化原则
- 最小资源匹配:RAM保留、时钟、外设均按“当前任务必需”配置,避免冗余;
- 快速休眠回归:唤醒后快速完成任务,立即回到深度低功耗状态;
- 硬件特性利用:充分调用CH585M的PMU分级、RAM保留分级等原生低功耗功能。