背景:实际工程中,经常需要通过0x10 02从Application中进入BootLoader中进行刷写。但是实际项目中很多人对这个过程不了解或者理解有误差,这里提供一个思路供大家参考:
背景知识:
Dcm中有下面Rte接口,其对应两个callout函数
1.Rte_Switch_Dcm_DcmEcuReset_DcmEcuReset
此callout 是个通知函数,用于告知Application 当前的ecu reset的mode
Mode 有以下值:
2.Rte_SwitchAck_Dcm_DcmEcuReset_DcmEcuReset
Dcm 调用 Rte_SwitchAck以确保在执行EXECUTE 模式之前 请求的mode 已被对方接收,它会调用 Rte_SwitchAck。
Rte_SwitchAck 返回RTE_E_TRANSMIT_ACK : 请求的mode 已被对方接收
Rte_SwitchAck 返回RTE_E_NO_DATA : 请求的mode 还没有被对方接收
代码分析:
Dcm_Service10Processor 10服务的主函数
Dcm_Svc10Handler
Dcm_Svc10CheckAccess
Dcm_Svc10_TriggerReset 调用Rte_Switch接口将mode为JumpToBootloader告知application需要跳转到fbl,为reset做准备
Dcm_Svc10_WaitForResetAck 调用Rte_SwitchAck接口,直至返回结果为RTE_E_TRANSMIT_ACK,才进行到下一步
Dcm_Svc10_WaitForRcrRpAck 决定是否给response
Dcm_Svc10_SetProgConditions 调用Rte_Switch接口将mode为Execute告知application,让其执行reset(reset形式的下电流程)
具体配置:
1.把下面两个设置,设置成如下图所示:
第一个宏表示在reset前,要发ResponsePending。
/MICROSAR/Dcm/DcmConfigSet/DcmDsl/DcmDslProtocol/DcmDslProtocolRow/Dcm SendRespPendOnTransToBoot/
第二个宏表示允许跳转到boot。
/ActiveEcuC/Dcm/DcmConfigSet/DcmDsp/DcmDspSession/Programming
注意:打开后会多出service port
2.把"DcmEcuReset" 关联到swc
3.在关联的swc中,分别为JumpToBootloader和Execute 创建runnable
其中trigger设置为当mode为JumpToBootloader和Execute时,调用此runnable(new-->On Mode entry--> 选择mode declaration为JumpToBootloader和Execute)
4.execute所对应的runnable里,Access points 选择SelectShutdownTarget
注: 如果有其他的一些操作,例如存nvm,也可以在这两个runnable中添加其他的Access point
5.在execute所对应的runnable函数中,添加执行函数,使下电时候执行reset和下电相关代码
关于下电reset过程中注意事项:
1.打开shutdown hook
2.EcuM_AL_Reset中调用MCU的复位接口(例如:Mcu_PerformReset)
如果有更多的问题需要咨询,可以加入问题咨询群与我们进行讨论,qq群号:531159112
关注公众号“奥先生学Autosar”查看更多文章