适用与s32k144的Bootloader,符合uds规范,应用于量产项目,制作了独立的fla...
适用与s32k144的Bootloader,符合uds规范,应用于量产项目,制作了独立的flash_driver文件,可直接用于项目中
最近在搞S32K144的Bootloader,折腾了好一阵子,总算有点眉目了。这个Bootloader符合UDS规范,而且已经应用在量产项目中了。今天就来聊聊这个Bootloader的一些实现细节,特别是那个独立的flash_driver文件,直接拿来用都没问题。
首先,S32K144是NXP的一款汽车级MCU,资源丰富,性能也不错。做Bootloader的时候,最头疼的就是Flash的读写操作了。为了简化这部分工作,我专门写了一个flash_driver文件,封装了Flash的擦除、写入等操作。这样,在Bootloader的主逻辑中,就不用再操心这些底层细节了。

先来看看flash_driver中的关键代码:
void Flash_EraseSector(uint32_t sectorAddress) {
// 等待Flash控制器空闲
while (!(FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK));
// 设置擦除命令
FTFC->FCCOB[0] = 0x09; // 擦除扇区命令
FTFC->FCCOB[1] = (sectorAddress >> 16) & 0xFF;
FTFC->FCCOB[2] = (sectorAddress >> 8) & 0xFF;
FTFC->FCCOB[3] = sectorAddress & 0xFF;
// 启动命令
FTFC->FSTAT = FTFC_FSTAT_CCIF_MASK;
}
这段代码的作用是擦除指定地址的Flash扇区。S32K144的Flash控制器(FTFC)提供了丰富的命令集,通过设置FCCOB寄存器来执行不同的操作。这里我们用的是擦除扇区命令(0x09),然后通过FSTAT寄存器启动命令。
接下来是写入数据的代码:
void Flash_WriteData(uint32_t address, uint8_t *data, uint32_t length) {
// 等待Flash控制器空闲
while (!(FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK));
// 设置写入命令
FTFC->FCCOB[0] = 0x06; // 写入数据命令
FTFC->FCCOB[1] = (address >> 16) & 0xFF;
FTFC->FCCOB[2] = (address >> 8) & 0xFF;
FTFC->FCCOB[3] = address & 0xFF;
// 写入数据
for (uint32_t i = 0; i < length; i++) {
FTFC->FCCOB[4 + i] = data[i];
}
// 启动命令
FTFC->FSTAT = FTFC_FSTAT_CCIF_MASK;
}
这段代码的作用是将数据写入指定的Flash地址。写入数据命令是0x06,同样通过FCCOB寄存器设置地址和数据,然后启动命令。
适用与s32k144的Bootloader,符合uds规范,应用于量产项目,制作了独立的flash_driver文件,可直接用于项目中

有了这两个函数,Bootloader中的Flash操作就变得非常简单了。比如在接收完新的固件数据后,只需要调用FlashEraseSector擦除目标扇区,然后调用FlashWriteData将数据写入即可。
当然,Bootloader的核心逻辑远不止这些。UDS规范要求Bootloader支持多种服务,比如诊断会话控制、ECU复位、请求下载、传输数据等。这些服务的实现需要根据具体的项目需求来设计,但有了flash_driver的支持,至少Flash操作这部分可以省去不少麻烦。
最后,这个flash_driver文件是独立的,可以直接用在其他项目中。如果你也在用S32K144,不妨试试这个驱动,应该能帮你省下不少时间。

好了,今天就聊到这里。如果你对这个Bootloader的实现细节感兴趣,或者有什么问题,欢迎留言讨论。
更多推荐
所有评论(0)