在做车载项目时,模块在常供电时需要维系随时可以被唤醒工作的状态,并且静态电流需要在3mA以内,当然在JTT1163标准中要求的是5mA以内。
目标明确了,在模块休眠时需要关闭一切不必要的资源消耗,只保留模块被唤醒的部分功能。
3mA的电流很低,尝试了STOP1/STOP2/VLPR后,效果都不理想,静态电流都比3mA高,因此采用POWER_MANAGER_VLPS深度睡眠的模式。
睡眠的方法调用函数为:
POWER_SYS_SetMode(POWER_MANAGER_VLPS, POWER_MANAGER_POLICY_AGREEMENT);
在函数睡眠之前,需要做几件事情:
1、反初始化已经初始化好的资源。
2、安装唤醒的中断。
3、在中断处理函数中进行软重启。
反初始化已经初始化好的资源举例,我在程序开始的地方进行了CAN资源的初始化,调用了
FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);
进行了初始化的。那么反初始化是将已经初始化的资源进行释放,告诉MCU,CAN资源我不使用了,可以释放他的时钟了。反初始化的函数为:
FLEXCAN_DRV_Deinit(INST_CANCOM1);
S32K144的唤醒,在不同的模式下有不同的唤醒方式
详细需要查手册,我是用的是GPIO中断唤醒,因此查看这部分的内容
在引脚的中断中,进行软重启,达到唤醒的目的。
void gpio_portb_wakeup_ISR(void)
{
PINS_DRV_ClearPortIntFlagCmd(PORTB);//RXD GPIOB Clear Interrupt Flag
INT_SYS_DisableIRQ(PORTB_IRQn);//disable PORTB
SystemSoftwareReset();//reset by SystemSoftwareReset
}
最后,在深度睡眠模式下,静态电流不到2mA