2. Stellar/SPC5硬件与软件架构解析
要理解UDS诊断与刷写为什么能在Stellar/SPC5上跑起来,必须先看清这颗MCU的“硬件骨架”和“软件分层”。诊断刷写不是孤立功能,它同时依赖内核、存储、通信外设和AUTOSAR基础软件四层支撑。本节从硬件资源讲到软件部署位置,帮助读者建立一张可对照的架构地图。
一、内核与运行域:诊断代码跑在哪里
Stellar/SPC5系列面向汽车域控制器与安全相关应用,典型结构包含多个处理单元:主核(如Cortex-M或Power Architecture内核,具体型号依SPC5子系列而定)、锁步核或校验核、以及用于安全监控的辅助模块。对诊断刷写而言,关键不是核的数量,而是代码运行域与权限边界。
通常,Bootloader(引导加载程序)驻留在受保护区域,拥有擦写Flash、跳转到应用、响应UDS刷写请求的权限;应用程序(App)运行在普通区域,只能通过特定接口请求进入编程会话。Stellar/SPC5的存储保护单元(如Flash保护寄存器、MPU)决定了哪些地址可写、哪些只能读。若Bootloader区域未加保护,刷写过程中一旦断电或误操作,就可能破坏引导代码,导致ECU“变砖”。因此,实际工程中会把Bootloader放在独立扇区,并设置写保护,只有通过特定解锁序列才允许擦除。
二、存储映射:诊断数据与刷写目标
存储映射是刷写工程的核心。Stellar/SPC5的地址空间通常划分为:
- Bootloader区:存放引导代码、UDS服务处理、Flash驱动,起始地址常为0x0000_0000或0x8000_0000(依具体型号)。
- 应用区:存放App代码,刷写时被擦除和重写。
- 标定/配置区:存放DID(数据标识符)对应的参数、VIN、指纹信息,诊断读取和写入常发生在此。
- NVM/EEPROM模拟区:存放故障码、自适应值,刷写时通常保留。
刷写流程中,Tester通过UDS的RequestDownload(0x34)告诉ECU目标地址和长度,ECU校验地址是否落在允许擦写的应用区。若地址越界或指向Bootloader区,ECU应返回否定响应(NRC 0x31 RequestOutOfRange)。这一判断逻辑就写在Bootloader的Flash驱动层。
三、外设资源:诊断通信的物理通道
UDS诊断通常走CAN或CAN FD,部分新车型走DoIP(以太网)。Stellar/SPC5内部集成多路CAN控制器(如MCAN),每路对应一个物理通道。诊断报文通过CAN收发器进入MCU,由CAN驱动接收后交给PduR路由,再送到DCM(诊断通信管理)模块解析。
刷写时,数据量远大于普通诊断。以CAN FD为例,单帧可携带64字节,但完整刷写仍需要数千帧。此时CAN驱动的接收缓冲区、中断优先级、DMA配置都会影响刷写速度。实际工程中,Bootloader阶段常把CAN接收中断优先级设为较高,避免丢帧;同时使用DMA搬运数据,减少CPU占用。若刷写过程中出现帧丢失,Tester会因等待超时而中止,ECU应能通过NRC 0x21(BusyRepeatRequest)或0x24(RequestSequenceError)反馈异常。
四、AUTOSAR分层:诊断刷写部署位置
在AUTOSAR架构下,诊断刷写功能横跨多层:
- 应用层:诊断事件管理、刷写条件判断(如车速为零、电压正常)。
- RTE:连接应用层与BSW,传递诊断请求和状态。
- DCM:解析UDS服务,管理会话状态(默认会话、编程会话、扩展会话),处理0x10、0x27、0x34、0x36、0x37等。
- FIM:刷写集成模块,负责在编程会话中挂起应用、调用Flash驱动。
- MCAL:Flash驱动直接操作寄存器,完成擦除、写入、校验。
Bootloader通常不依赖完整AUTOSAR栈,而是精简实现DCM和Flash驱动,以减小代码体积、提高可靠性。App则运行完整AUTOSAR,通过DCM响应常规诊断。两者通过共享内存或特定跳转标志协调:App收到0x10 0x02进入编程会话后,设置跳转标志并复位,Bootloader上电后检测标志,决定是否停留在刷写模式。
五、实操视角:一次刷写请求的路径
假设Tester发送0x34 RequestDownload,目标地址0x0008_0000,长度0x0002_0000。报文经CAN进入MCAL CAN驱动,PduR路由到DCM。DCM检查当前会话是否为编程会话,若不是则返回NRC 0x7F。若是,DCM调用FIM,FIM校验地址范围:0x0008_0000落在应用区,允许擦写;若地址为0x0000_1000(Bootloader区),则拒绝并返回NRC 0x31。校验通过后,FIM调用Flash驱动解锁、擦除目标扇区,并返回正响应0x74。后续0x36 TransferData逐块写入,0x37 RequestTransferExit结束,最后0x31 RoutineControl执行校验和跳转。