CH579/CH573/CH57x低功耗处理


CH579/CH573支持多种功耗模式,实际上常用的无非就是RAM保持和RTC运行以及是否广播之间的各种组合罢了


由于CH57x 只有一个RTC 且只有一个触发值可以设置,而BLE等 做休眠时候,需要用到这个值
CH57x的BLE是通过其“tmos”操作系统实现,需要休眠时候,每次协议栈需要睡多久tmos都是知道的,比如下个event是什么时候(蓝牙事件也是tmos的event)然后把要睡多久传递给休眠函数,休眠函数去设置一个RTC的触发中断,然后就进行休眠了(RTC在跑,RAM保持),直到RTC或者其他中断唤醒MCU。休眠期间其功耗睡眠期间在2.0uA左右,

通过TMOS管理(推荐,RAM保持,rtc运行 休眠时候CH577/578/579=2uA,CH573/571=6uA,CH581/582/583=3uA )

工程的全局宏里面加上HAL_SLEEP=TRUE 即可

  • BLE下休眠强烈建议使用
  • RF_PHY下强烈建议使用
  • 只当普通mcu,不用无线,也可以用

不通过TMOS管理(需要自己管理,不推荐,rtc唤醒可选,按键可唤醒,唤醒后继续运行)

直接sleep

  • 可以通过rtc/gpio 等唤醒,唤醒后芯片继续运行
    用户无需去停掉ble的协议栈,只要关掉ble的事件就行(连接状态就断开连接,广播状态就关闭广播);实际上这就是上面BLE在跑的休眠
    也可以手动直接调用下面用休眠即可,用户调用,而不是交由协议栈调用
LowPower_Sleep(RB_PWR_RAM2K|RB_PWR_RAM14K|RB_PWR_EXTEND );

如果用了BLE,并不推荐这样用,比如连接期间调用这个,会导致对方设备产生超时断开.

关机模式(唤醒会导致复位, 最低0.2uA,rtc唤醒可选,开rtc要加上rtc的功耗,按键可唤醒,唤醒后重启)

直接调用下面函数,就会关掉ram 电源并休眠
这里务必注意,rtc寄存器内容shutdown后会保持的,如果这里关掉了,在代码开始运行的时候,一定要手动再开启,而不是用芯片的上电默认值,切记!

//以下代码 在ch579 上运行
GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
//开启上升沿中断
GPIOB_ITModeCfg(GPIO_Pin_8,GPIO_ITMode_FallEdge);  
//使能gpio 唤醒
PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_GPIO_WAKE ); 
//开启GPIO中断
NVIC_EnableIRQ( GPIO_IRQn );
​
//关掉内外32768.0
R8_SAFE_ACCESS_SIG = 0x57; 
R8_SAFE_ACCESS_SIG = 0xa8;
R8_CK32K_CONFIG    = 0;
R8_SAFE_ACCESS_SIG = 0;
​
//关机,对于ch577/578/579   571/573 建议写个标志位,在主循环 判断标志位进行调用此函数
//ch573/571 调用此函数前,需要降频到6.4Mhz
LowPower_Shutdown( NULL ); 

//这里也要加上,shutdown 是需要一定的过程的,短时间内唤醒,会接着运行,所以这里需要处理继续运行的情况
//开启时钟,使用外部时钟,这里先设置内部时钟是必须的
SetSysClock( CLK_SOURCE_HSI_32MHz );
DelayMs(1);
SetSysClock( CLK_SOURCE_HSE_32MHz );

//打开rtc,这里使用外部32768
R8_SAFE_ACCESS_SIG = 0x57;
R8_SAFE_ACCESS_SIG = 0xa8;
R8_CK32K_CONFIG |= RB_CLK_OSC32K_XT | RB_CLK_XT32K_PON;
R8_SAFE_ACCESS_SIG = 0;

高级使用 程序中动态屏蔽BLE的休眠:

可以在下面这个代码中添加一个全局变量做标识,如果标识有效,直接 return 0即可,这样就可以做到动态使能低功耗模式与否了.

static volatile bool block_sleep = false;

void ch57x_block_sleep_request(void) {    
    block_sleep = true;
}
void ch57x_block_sleep_release(void) {
    block_sleep = false;
}
u32 CH57X_LowPower( u32 time ) {
    if( true == block_sleep) {
        return 0;  
    }
    <...>
};

注意事项:

  • 沁恒mcu的gpio 都没有内部断开模式,上电后的默认状态是浮空输入的,所以休眠时候所有的IO都需要有确定的电平,对于不同的封装的芯片,引脚少的只是部分gpio没有引出来,实际上这些没有引出来IO也是需要初始化为确定的电平.
  • 对于模拟引脚,有专门的寄存器,可以把对应IO的数字部分断开,否者功耗可能会降不下去
  • 休眠后SWD会被禁用,swd的一且操作都会失效.
  • 对于ch577/ch578/ch579 在休眠模式下(2uA的那种),前面16KB的ram 会断电,如果启用了低功耗,休眠模式下这部分RAM会丢失数据,使用时候格外注意.


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM