文章目录
- [ETAS 诊断 0x1101(ECU Reset / Hard Reset)到 MCU 复位完整流程](#ETAS 诊断 0x1101(ECU Reset / Hard Reset)到 MCU 复位完整流程)
-
- [1. 请求含义与工程配置](#1. 请求含义与工程配置)
- [2. 总体架构](#2. 总体架构)
- [3. 分阶段说明](#3. 分阶段说明)
-
- [阶段 A:总线接收(诊断工具 → ECU)](#阶段 A:总线接收(诊断工具 → ECU))
- [阶段 B:DCM 服务处理](#阶段 B:DCM 服务处理)
- [阶段 C:正响应发送确认](#阶段 C:正响应发送确认)
- [阶段 D:BswM 动作链(DcmEcuReset = HARD)](#阶段 D:BswM 动作链(DcmEcuReset = HARD))
- [阶段 E:EcuM 关机状态机](#阶段 E:EcuM 关机状态机)
- [阶段 F:MCU 硬件复位](#阶段 F:MCU 硬件复位)
- [4. 调试要点](#4. 调试要点)
- [5. 关键源文件索引](#5. 关键源文件索引)
- [6. 一句话总结](#6. 一句话总结)
ETAS 诊断 0x1101(ECU Reset / Hard Reset)到 MCU 复位完整流程
1. 请求含义与工程配置
| 项目 | 说明 |
|---|---|
| 诊断仪报文 | 11 01(SID=0x11 ECUReset,子功能=0x01) |
| 俗称 | 0x1101 |
| 语义 | ISO 14229:hardReset ;本工程 DCM 配置为 HARD 复位类型 |
| 正响应 | 51 01(响应 SID = 0x11 + 0x40) |
| 子功能配置 | Dcm_DspEcuResetType_cast[] 中 0x01 → RTE_MODE_DcmEcuReset_HARD |
配置出处 :BasicSoftware/src/bsw/Dcm/Dcm_Lcfg_DspUds.c
c
const Dcm_DspEcuReset_tst Dcm_DspEcuResetType_cast[DCM_CFG_DSP_NUMRESETTYPE] =
{
{
RTE_MODE_DcmEcuReset_HARD, /* DcmEcuReset Mode */
0x1, /* ResetType = hardReset */
DCM_RESET_NO_BOOT
}
};
服务入口 :BasicSoftware/src/bsw/Dcm/Dcm_Lcfg_DslDsd.c --- SID 0x11 → Dcm_DcmEcuReset()。
2. 总体架构
Mcu(AURIX) ASW/CDD EcuM BswM Dcm PduR CanIf/CanTp 诊断仪 Mcu(AURIX) ASW/CDD EcuM BswM Dcm PduR CanIf/CanTp 诊断仪 #mermaid-svg-n4yLhLKD6C7vhq5G{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-n4yLhLKD6C7vhq5G .error-icon{fill:#552222;}#mermaid-svg-n4yLhLKD6C7vhq5G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-n4yLhLKD6C7vhq5G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-n4yLhLKD6C7vhq5G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-n4yLhLKD6C7vhq5G .marker.cross{stroke:#333333;}#mermaid-svg-n4yLhLKD6C7vhq5G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-n4yLhLKD6C7vhq5G p{margin:0;}#mermaid-svg-n4yLhLKD6C7vhq5G .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-n4yLhLKD6C7vhq5G text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-n4yLhLKD6C7vhq5G .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-n4yLhLKD6C7vhq5G .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-n4yLhLKD6C7vhq5G .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-n4yLhLKD6C7vhq5G .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-n4yLhLKD6C7vhq5G #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-n4yLhLKD6C7vhq5G .sequenceNumber{fill:white;}#mermaid-svg-n4yLhLKD6C7vhq5G #sequencenumber{fill:#333;}#mermaid-svg-n4yLhLKD6C7vhq5G #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-n4yLhLKD6C7vhq5G .messageText{fill:#333;stroke:none;}#mermaid-svg-n4yLhLKD6C7vhq5G .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-n4yLhLKD6C7vhq5G .labelText,#mermaid-svg-n4yLhLKD6C7vhq5G .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-n4yLhLKD6C7vhq5G .loopText,#mermaid-svg-n4yLhLKD6C7vhq5G .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-n4yLhLKD6C7vhq5G .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-n4yLhLKD6C7vhq5G .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-n4yLhLKD6C7vhq5G .noteText,#mermaid-svg-n4yLhLKD6C7vhq5G .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-n4yLhLKD6C7vhq5G .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-n4yLhLKD6C7vhq5G .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-n4yLhLKD6C7vhq5G .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-n4yLhLKD6C7vhq5G .actorPopupMenu{position:absolute;}#mermaid-svg-n4yLhLKD6C7vhq5G .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-n4yLhLKD6C7vhq5G .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-n4yLhLKD6C7vhq5G .actor-man circle,#mermaid-svg-n4yLhLKD6C7vhq5G line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-n4yLhLKD6C7vhq5G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 11 01 分段重组完成 StartOfReception / CopyRxData / RxIndication 模式规则 / 预处理 / 状态机 SchM_Switch(DcmEcuReset=HARD) 51 01 TxConfirmation SchM_Switch(DcmEcuReset=EXECUTE) SelectShutdownTarget + Dem + GoDown GoOffOne → ShutdownOS OnGoOffTwo → NvM_WriteAll EcuM_AL_Reset → Mcu_PerformReset SCU SWRSTREQ 软件复位
通信栈路径(收) :CanIf → CanTp → PduR → Dcm
通信栈路径(发) :Dcm → PduR → CanTp → CanIf(PduR_DcmTransmit)
3. 分阶段说明
阶段 A:总线接收(诊断工具 → ECU)
- CAN 帧经 CanIf 进入协议栈。
- CanTp 完成多帧重组,经 PduR 回调 DCM:
Dcm_StartOfReceptionDcm_CopyRxDataDcm_TpRxIndication
- Dcm_MainFunction (周期任务)中 DSL 状态机调度 DSD,调用
Dcm_DcmEcuReset()。
阶段 B:DCM 服务处理
状态机 (Dcm_stEcuResetState_en):IDLE → REQPERMISSION → SENDRESPONSE → IDLE
| 步骤 | 动作 | 关键文件 |
|---|---|---|
| B1 | 校验子功能 0x01 已配置 |
DcmDspUds_Er.c |
| B2 | 模式规则(项目定制) | DcmAppl_UserSubServiceModeRuleService.c |
| B3 | 复位前准备 | DcmAppl_DcmEcuResetPreparation.c(默认 E_OK) |
| B4 | SchM_Switch_Dcm_DcmEcuReset(HARD),组正响应 |
DcmDspUds_Er.c |
| B5 | DcmAppl_Switch_DcmEcuReset(0x01) |
DcmAppl_Switch_DcmEcuReset.c |
| B6 | resData[0]=0x01,resDataLen=1 → 总线 51 01 |
同上 |
项目模式规则(0x1101)
文件 :BasicSoftware/integration/src/bsw/Dcm/integration/DcmAppl_UserSubServiceModeRuleService.c
- 拒绝复位(NRC 0x22):特定条件。
- 允许复位:满足复位条件。
阶段 C:正响应发送确认
正响应经 CanTp 发送成功 后,Dcm_Prv_DspEcuResetConfirmation() 被调用:
文件 :BasicSoftware/src/bsw/Dcm/src/DcmDsp/DcmDspUds/DcmDspUds_Er.c
| 动作 | 说明 |
|---|---|
SchM_Switch_Dcm_DcmEcuReset(EXECUTE) |
Tx 确认后切换执行模式 |
DcmAppl_Switch_DcmExecuteEcuReset() |
应用侧通知 |
DcmAppl_Switch_DcmExecuteReset() |
本工程为空实现 |
时序要点:
- HARD 模式在
SENDRESPONSE阶段切换(组包时),用于通知 BswM。 - EXECUTE 在 Tx 确认后 切换(符合 AUTOSAR:先应答、再执行复位)。
阶段 D:BswM 动作链(DcmEcuReset = HARD)
通知路径 :SchM_Switch(HARD) → BswM_Cfg_DfrdBswNotification_..._EcuReset_HARD → BswM_RequestMode → 规则 BswM_LE_DCM_EcuReset_HARD → 动作表 BswM_AL_DCM_EcuReset_HARD
文件 :BasicSoftware/src/bsw/BswM_PreCompile_and_PB_Variant/BswM_PBcfg.c、BswM_Cfg_AC.c
| 序号 | 动作 | 说明 |
|---|---|---|
| 1 | EcuM_SelectShutdownTarget(RESET, ECUM_RESET_IO) |
关机目标:复位,模式 RESET_IO |
| 2 | Dem_SetOperationCycleState(END) |
结束 DEM 运行周期 |
| 3 | Dem_Shutdown() |
DEM 关断 |
| 4 | CanTrcv_GotoSleep |
CAN 收发器休眠 |
| 5 | EcuM_GoDown(0) |
启动 EcuM 关机流程 |
Hard Reset 选用 ECUM_RESET_IO (非
ECUM_RESET_MCU),二者在EcuM_AL_Reset中均调用Mcu_PerformReset()。
阶段 E:EcuM 关机状态机
| 步骤 | 函数 | 说明 |
|---|---|---|
| E1 | EcuM_GoDown |
置位 EcuM_Prv_flgGoDown_b |
| E2 | EcuM_MainFunction |
检测 GoDown → EcuM_Prv_ProceedShutdown() |
| E3 | EcuM_OnGoOffOne |
Go Off I:见下表 |
| E4 | BswM_Deinit / SchM_Deinit |
BSW 去初始化 |
| E5 | ShutdownOS / ShutdownAllCores |
关闭 OS |
| E6 | EcuM_Shutdown → EcuM_OnGoOffTwo |
Go Off II:NvM 写 |
| E7 | EcuM_AL_Reset |
因 ShutdownTarget=RESET 进入复位 |
EcuM_OnGoOffOne 集成 (BasicSoftware/integration/src/bsw/EcuM/user/EcuM_integration.c):
Rte_Stop()Dem_SetOperationCycleState(END)/Dem_Shutdown()RE_NvMUT_100ms()
EcuM_OnGoOffTwo (BasicSoftware/src/bsw/EcuM/EcuM_Cfg_Shutdown.c):
NvM_Integration_WriteAll()--- 关机前 NvM writeall
阶段 F:MCU 硬件复位
文件 :BasicSoftware/integration/src/bsw/EcuM/integration/EcuM_Callout_Stubs.c
c
void EcuM_AL_Reset(EcuM_ResetType reset)
{
switch (reset)
{
case ECUM_RESET_MCU:
case ECUM_RESET_IO:
case ECUM_RESET_WDGM:
Mcu_PerformReset();
break;
default:
break;
}
}
MCAL :src/00BSW/00Mcal/Mcu/src/Mcu.c --- Mcu_PerformReset()
- 写 SCU.SWRSTCON.SWRSTREQ = 1 ,触发 AURIX 软件复位。
- 短延时等待复位生效。
4. 调试要点
- 先看到
51 01,MCU 才可能复位;NRC 0x22 表示模式规则拒绝。 - BswM HARD 在组正响应时即可触发;
Mcu_PerformReset在 OS 关闭之后。 DcmAppl_Switch_DcmExecuteReset为空,复位逻辑在 BswM/EcuM/MCU。- Hard Reset 配置为
ECUM_RESET_IO,与 ExeMgr 演示路径ECUM_RESET_MCU不同,最终均走Mcu_PerformReset()。
建议断点/日志顺序:
Dcm_DcmEcuReset
→ SchM_Switch HARD
→ BswM_AL_DCM_EcuReset_HARD
→ EcuM_GoDown
→ EcuM_OnGoOffOne / OnGoOffTwo
→ EcuM_AL_Reset
→ Mcu_PerformReset
5. 关键源文件索引
| 模块 | 路径 |
|---|---|
| ECU Reset 服务 | BasicSoftware/src/bsw/Dcm/src/DcmDsp/DcmDspUds/DcmDspUds_Er.c |
| 子功能配置 | BasicSoftware/src/bsw/Dcm/Dcm_Lcfg_DspUds.c |
| 服务表 | BasicSoftware/src/bsw/Dcm/Dcm_Lcfg_DslDsd.c |
| 模式规则 1101 | BasicSoftware/integration/src/bsw/Dcm/integration/DcmAppl_UserSubServiceModeRuleService.c |
| BswM 动作表 | BasicSoftware/src/bsw/BswM_PreCompile_and_PB_Variant/BswM_PBcfg.c |
| BswM Callout | BasicSoftware/src/bsw/BswM_PreCompile_and_PB_Variant/BswM_Cfg_AC.c |
| BswM 模式通知 | BasicSoftware/src/bsw/BswM_PreCompile_and_PB_Variant/BswM_Cfg_ModeManagerReq.c |
| EcuM GoDown/Shutdown | BasicSoftware/src/bsw/EcuM/src/EcuM_Shutdown.c |
| EcuM MainFunction | BasicSoftware/src/bsw/EcuM/src/EcuM_MainFunction.c |
| GoOffOne 集成 | BasicSoftware/integration/src/bsw/EcuM/user/EcuM_integration.c |
| GoOffTwo / NvM | BasicSoftware/src/bsw/EcuM/EcuM_Cfg_Shutdown.c |
| 复位 Callout | BasicSoftware/integration/src/bsw/EcuM/integration/EcuM_Callout_Stubs.c |
| MCU 复位 | src/00BSW/00Mcal/Mcu/src/Mcu.c |
6. 一句话总结
诊断仪 发送 11 01 → CanTp/PduR 递交 Dcm → 模式规则与预处理 → 切换 DcmEcuReset=HARD 触发 BswM(Dem/CanTrcv/EcuM_GoDown)→ 应答 51 01 且发送确认后进入 EXECUTE → EcuM 经 GoOffOne/Two 写 NvM 并关 OS → EcuM_AL_Reset 调用 Mcu_PerformReset 完成 MCU 软件复位。