适用与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的实现细节感兴趣,或者有什么问题,欢迎留言讨论。

更多推荐