Ecu是如何断电的?MCU是何时停止工作的?总线的通信是什么时候停止的?围绕这些问题,我们基于Autosar架构进行讨论。
Autosar下架构下,是靠EcuM模块对Ecu进行状态机的管理,其中EcuM的状态机又分两种Flex的和Fixed的,本文是基于Fixed进行分析的。先看一下EcuM的状态机:该状态机包含了Ecu的startup,up,sleep和shutdown.实际项目中我们不必严格按照下面的状态执行,例如一般项目上并不需要sleep状态,而是直接接入shutdown状态,这样也是可以的,取决于实际项目的需要。
Shutdowm的状态Ecu需要做些什么,我们再看流程图:
首先在进入shutdown时,BswM会调用EcuM_SelectShutdownTarget,这一步是需要在BswM里面手动配置的。从而进入Ecum_Godown,而后进入EcuM_OnGoOffone,这是一个callout函数,根据需要可以在其中添加一些我们的手工代码,当然,这个阶段也可以直接断掉ECU的电源使能接口。
一般ECU的供电电源都会有一个enable port,当这个port口的电源为high时,使能电源,给整个ECU供电,包括MCU的供电,而这个enbale port通常是由软件控制的MCU IO口或者CANtransceiver来实现,所以要想令整个ECU下电,则只需要通过软件,拉低IO口的电压,或者发送指令让CANtransceiver进入休眠模式即可。
不过正常情况下,需要先对BswM和schM模块进行去初始化,并且关掉所有工作的内核,最终才执行以上的下电动作。其中要注意的是,如果在shutdown的过程中又收到有效的唤醒事件,那么则要执行reset的动作,重新开启ECUM的流程。