(TC397 BootLoader开发记录)一、Flash擦除刷写

TC397 BootLoader开发记录


由于公司有保密要求,具体代码不能开源,只记录一下学习过程以及遇到的一些坑,可以一起交流。

在这里插入图片描述


前言

要做一个最简单的BootLoader,可以分为以下几个工作要做:
1、ROM的分配,主要分配好BootLoader code和App code在PFlash中的存储位置
2、程序的跳转,BootLoader跳App,以及App跳BootLoader。
3、Flash的刷写,在BootLoader中将App code刷写到指定位置。
4、通讯方式和协议栈,本次开发基于以太网和UDS进行刷写,所以还需要配置好这些相关的协议栈。

现在刚好刷写有点问题,所以第一章先记录一下刷写相关的操作,后续慢慢把其他工作的开发思路再记录一下。


一、MCAL 底层驱动

配置方面就没什么好介绍的,导入flsloader模块,基本不用做任何修改,CAN、ETH用什么通讯就配什么,再配一个STM或者GPT用来定时就可以了,本章主要讲一下flsloader的使用方法:

在这里插入图片描述

在这里插入图片描述

相关的文档可以在英飞凌官网下载:

MCAL配置文档

二、FlsLoader_Erase 擦除API

输入参数一个是目标地址TargetAddress,一个是Length,FlsLoader_Erase的使用有两点需要注意的地方。

在这里插入图片描述

1. 擦除大小按照Flash logical sector

在这里插入图片描述

在这里插入图片描述

这里首先需要分清几个概念,例如:

核0的3 Mbyte PFlash可以分为3块Physical Sector,每块的大小为1 Mbyte,每块Physical Sector又可分成 64 个 Logical Sector,每块Logical Sector大小为16 Kbyte。

FlsLoader_Erase(TargetAddress, Length )输入参数Length不是指刷写的长度,而是Logical sectors的数量(Number of Flash sectors to be erased)。

在TC397中,PFlash 每个 sector 为 16 Kbyte,DFlash 为 4 Kbyte,所以擦除的大小只能是它的倍数,BootLoader 主要刷写 PFlash ,当Length = 1时,PFlash 擦除 16Kbyte。也因为只能按块擦写,所以擦写地址(TargetAddress)也得按16 Kbyte对齐。

如果使用UDS协议进行通讯,一般会得到刷写的目标地址(MemoryAddress)和大小(MemorySize),目标地址需要对齐到16 Kbyte使用,MemorySize需要转换为sector的数量,可参考以下代码:

代码如下(示例):

void EraseMemoryTool(uint32 MemoryAddress, uint32 MemorySize)
{
    /* Align MemoryAddress to 16 Kbyte boundary */
    uint32 AlignedAddress = MemoryAddress & ~(16 * 1024 - 1);

    /* Adjust MemorySize based on the alignment */
    uint32 adjustedMemorySize = MemorySize + (MemoryAddress - AlignedAddress);

    /* Calculate the number of 16 Kbyte blocks needed */
    uint32 numBlocks = (adjustedMemorySize + 16 * 1024 - 1) / (16 * 1024);
    
	/* Erase PFlash */
    FlsLoader_Erase(AlignedAddress, numBlocks);
}

2. 不支持跨区域擦除

在这里插入图片描述
在这里插入图片描述

这里的Flash bank应该是指的3Mbyte的PF0、PF1,因为我没有刷过超 3Mbyte的程序,这里我就没有写判断条件,如果刷写太大的App code这里需要注意一下。

3. 检测是否擦写完成

擦除动作会有4个返回值,可以检查擦除是否正常工作。

在这里插入图片描述

或者查看寄存器值:

DMU_HF_ERRSR

在这里插入图片描述

三、FlsLoader_Write 写入API

在这里插入图片描述
在这里插入图片描述

1. 需按页(page)进行写入

在这里插入图片描述
PFlash每页(page)为32 bytes ,DFlash每页为8bytes,写PFlash的输入参数Length虽然是字节数(Number of bytes to be written),但也应该是32的倍数。写入的数据部分不足32bytes需要补0对齐。可参考以下代码:

代码如下(示例):

void WriteMemoryTool(uint32 MemoryAddress, uint32 MemorySize, const uint8* const SourceAddressPtr)
{
    uint32 paddedSize;
    uint8* paddedBuffer;

    paddedSize = ((MemorySize + 32 - 1) / 32) * 32;
    paddedBuffer = (uint8*)malloc(paddedSize);
    memset(paddedBuffer, 0, paddedSize);
    memcpy(paddedBuffer, SourceAddressPtr, MemorySize);
    FlsLoader_Write(MemoryAddress, paddedSize, paddedBuffer);
    free(paddedBuffer);
}

2. 检测是否写入完成

在这里插入图片描述

或寄存器值:

DMU_HF_ERRSR

总结

Flash的擦写操作返回值为NOT_OK可能有以下两种情况:
在这里插入图片描述
如果操作一直出现FLSLOADER_E_BUSY就需要硬件复位一下了。

参考

MC-ISAR_TC3xx_UM_FlsLoader.pdf
【User Manual】AURIXTC3XX_um_part1_v1.4.pdf
CSDN:TC3xx NvM小细节解读

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aprilaaaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值