AUTOSAR EcuM休眠阶段的具体实现详解
其中,AWO的STBC、Reset Controller用于控制整个电源域;ISO可以单独关闭或者打开。这里我们就需要进一步了解和思考不同standby模式下的功耗。
在系统层级的低功耗状态,该芯片支持STOP/DeepSTOP 有限功能的低功耗操作,该芯片支持Cyclic RUN/ Cyclic STOP
很明显,CPU从RUN状态,只能切换至STOP/DeepSTOP/HALT模式,而要进入Cyclic RUN只能通过HALT、DEEPSTOP。Cyclic STOP只能由Cyclic RUN进入。
结合之前EcuM的GoHalt和GoPoll,这里就出现了一个疑问,什么时候进入除了HALT之外的其他四种模式?而这四种模式对功耗的影响究竟有多大?下面分析各种模式下的CPU、外设的运行状态。
HALT模式由指令HALT进入,该模式既不影响电源域也不影响时钟域,除了CPU以及CPU的时钟停止外,所有的外设均处于正常供电状态下运行;异常或者任意中断都可以从HALT模式恢复到RUN模式。
这种模式几乎就不存在低功耗,因此EcuM的GoHalt,我个人认为与这颗芯片的HALT模式完全是两回事。
STOP模式相较于HALT模式要睡得更香一点,首先是CPU子系统的时钟关闭,PLL关闭(其他时钟源继续运行),然后是在进入该模式之前,所有外设功能都停止,仅有Local RAM、Retention RAM以及IO buffer状态保持内容,注意,这里仅是时钟,所有的供电都还存在。
相比STOP,这种模式最香;看模式迁移那张图,在DeepSTOP模式下,ISO这块区域是灰色的,也即不仅要停掉大部分时钟,还要关掉电源。
但是AWO里还需要继续运行的外设将会选择合适的时钟继续运行。
在该模式下继续运行的有Osc、HS IntOSC、LS IntOSC、WDTA0、RTCA、TAUJ0\2、POC、LVI等。
值得注意的是,结合状态迁移图,当有唤醒事件产生时,DeepSTOP就可以返回RUN模式,也可以进入Cyclic RUN模式。这是依据WUF寄存器里定义的不同唤醒事件来决定的,例如WUF0\WUF_ISO0标志位会返回到RUN状态,WUF20会进入Cyclic RUN。
这里还有一点,在DeepSTOP模式下,如有唤醒事件的产生,CPU则会从复位向量首地址开始运行代码,可以从RESF检查标志位从而判断是否是从DeepSTOP返回的,唤醒事情也可从寄存器WUF0/ISO0读取;这里又与我理解的EcuM的GoPoll有很大差异。
在系统设计时,我们考虑到ECU有两种休眠模式,一种是正常休眠,这种情况个人认为是要进到最低功耗,也即DeepSTOP。还有一种是电压不稳导致的休眠,这我是在座舱里遇到的,电压低于6V,导致中控、仪表屏电供不上了,但是MCU还是可以在较低电压做一些动作,这种情况就使用Sleep或者Halt,等待电压回复,然后做具体分析。
那么结合AUTOSAR代码,我们来具体分析。
首先是正常下电流程,在BswM完成NvM的写和验证后,选择进入Sleep,此时将控制权让渡给EcuM,假设现在EcuM的SleepMode配置里正常休眠模式配置为Poll,Standby模式选择Stop,则进入函数:
EcuM_InternalEnterPollingMode -> EcuM_McuSetMode ->Mcu_SetMode
根据所选择的Standby模式,在Mcu_SetMode里做处理:
如果选择GoHalt,则如下: