
基于UDS的Bootloader开发:包含诊断协议栈、网络协议栈、瑞萨底层驱动及周立功CA
N盒通讯的单片机程序更新功能参考指南
最近在搞车载ECU的bootloader开发,发现UDS协议栈这玩意儿真是让人又爱又恨。今天就跟大伙儿
唠唠怎么用瑞萨RH850单片机整出个能远程刷写的bootloader,顺便分享几个开发时踩过的坑。
诊断协议栈这块最要命的是会话控制,像0x10切会话这种操作,很多新手容易栽在定时器配置上。
看这段代码:
```c
void HandleSessionControl(uint8_t sessionType) {
static uint32_t activeSessionTimer = 0;
if(sessionType == DEFAULT_SESSION) {
// 默认会话下关闭安全访问
SecurityUnlockState = SECURITY_OFF;
activeSessionTimer = 0;
} else {
// 扩展会话激活后启动30秒超时
activeSessionTimer = GetSystemTick() + 30000;
}
CurrentSession = sessionType;
SendPositiveResponse(SID_SESSION_CONTROL, &sessionType, 1);
}
```
这里有个骚操作——用系统滴答计时代替独立定时器,省了硬件资源。但注意GetSystemTick()要确
保在1ms中断里自增,否则时间不准会搞出幽灵bug。
网络层处理CAN报文时,瑞萨的CAN驱动有个坑爹的地方:接收FIFO的配置必须严格按手册来。有次
调试发现CAN盒死活收不到响应,最后发现是波特率计算时少了个零:
```c
void CAN_Init(void) {
CAN0.CTMR.BIT.TPM = 0; // 使用内部时钟
CAN0.BITREG.BIT.BRGC = (BRP_VALUE << 16) | (TSEG1 << 8) | TSEG2;
// 波特率计算公式:1Mbps时BRP=0, TSEG1=4, TSEG2=3