文章目录
电压监控 可以独立的监控电压的功能,常用于
①电压过低导致内核等运行不正常
③电压过低导致Flash 擦写异常
等等
电压监控功能介绍
下图节选与CH59x的规格,除了基本的配置外,需要注意的是开启电压监控会增加功耗。
功耗是根据精度决定的,低精度的功耗低,高精度功耗高。
如果特别在意功耗可以分段配置,比如2.5v时使用低精度的,触发后,配置1.8V高精度的。
注:每个系列的功耗不一样,具体参考对应系列的规格书

代码配置
高精度
初始化:
c
PowerMonitor(ENABLE,HALevel_2V5); //设置高精度触发
PFIC_EnableIRQ(NMI_IRQn); //使能NMI中断
PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE|RB_SLP_BAT_WAKE, Long_Delay);
中断:
c
__INTERRUPT
__HIGH_CODE
void NMI_Handler(void)
{
DelayMs(5);
PRINT("R8_BAT_STATUS=%x. \n",R8_BAT_STATUS);
while(R8_BAT_STATUS&RB_BAT_STAT_LOWER) //等电压恢复
{
PRINT("wait...\n");
}
PRINT("recover...\n");
}
中断的效果是不断的在中断内等待电压恢复,因为电压不正常出中断也是没有意义的。
低精度
初始化:
c
PowerMonitor(ENABLE,LPLevel_2V5); //使能低精度电压监控
PFIC_EnableIRQ(WDOG_BAT_IRQn); //低精度使用此中断
PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE|RB_SLP_BAT_WAKE, Long_Delay);
中断:
c
__INTERRUPT
__HIGH_CODE
void WDOG_BAT_IRQHandler(void)
{
DelayMs(5);
PRINT("R8_BAT_STATUS=%x. \n",R8_BAT_STATUS);
while(R8_BAT_STATUS&RB_BAT_STAT_LOWER) //等电压恢复
{
PRINT("wait...\n");
}
PRINT("recover...\n");
}
常见问题
打印问题:
如果开启低功耗的时候无法打印,大概率是因为降低功耗配置为IO了,所以要再次初始化串口才可以,代码如下:
c
__INTERRUPT
__HIGH_CODE
void NMI_Handler(void) //或 void WDOG_BAT_IRQHandler(void)
{
DelayMs(5);
DebugInit();
PRINT("R8_BAT_STATUS=%x. \n",R8_BAT_STATUS);
while(R8_BAT_STATUS&RB_BAT_STAT_LOWER) //等电压恢复
{
PRINT("wait...\n");
}
PRINT("recover...\n");
}
蓝牙工程中配置后未生效
为了低功耗,使用的低功耗函数会默认关闭 电压监控,需要手动注释后才能正常开启电压监控功能,下图是注释后的。
