2. Flash驱动初始化与擦除
任务目标
本案例实现AUTOSAR Bootloader中的Flash驱动初始化与扇区擦除功能。通过调用Flash驱动接口完成指定扇区的擦除操作,并验证擦除后内存数据是否变为0xFF(擦除态)。
环境与依赖
- 硬件:Infineon TC275(或任意AUTOSAR MCAL支持的MCU)
- 软件:AUTOSAR MCAL Fls驱动(Fls_Cfg.c/h),EB tresos或Davinci工具生成驱动代码
- 编译器:Tasking或HighTec GCC
核心实现
以下代码展示Flash驱动初始化、扇区擦除及擦除验证的最小完整实现。实际项目中Fls驱动由MCAL配置工具生成,此处提供调用逻辑及必要的验证函数。
#include "Fls.h"
#include "Fls_Cfg.h"
#include <string.h>
/* 测试扇区地址与大小(根据实际MCU配置修改) */
#define TEST_SECTOR_START_ADDR 0xAF000000uL
#define TEST_SECTOR_SIZE 0x00010000uL /* 64KB */
/* 擦除验证缓冲区 */
static uint8 EraseCheckBuf[TEST_SECTOR_SIZE];
/* Flash驱动初始化 */
static void Flash_Init(void)
{
Fls_ConfigType FlsConfig;
/* 从Fls_Cfg.c获取实际配置(此处为示例,实际由MCAL配置生成) */
FlsConfig.FlsBaseAddr = 0xAF000000uL;
FlsConfig.FlsTotalSize = 0x00100000uL; /* 1MB */
FlsConfig.FlsPageSize = 0x100uL;
FlsConfig.FlsSectorSize = TEST_SECTOR_SIZE;
Fls_Init(&FlsConfig);
}
/* 擦除指定扇区并等待完成 */
static Std_ReturnType Flash_EraseSector(uint32 SectorAddr)
{
Std_ReturnType ret;
/* 发起擦除请求 */
ret = Fls_Erase(SectorAddr, TEST_SECTOR_SIZE);
if (ret != E_OK)
{
return ret;
}
/* 轮询等待擦除完成 */
while (Fls_GetStatus() != FLS_CMD_ERASE_DONE)
{
/* 可加入超时保护,实际工程中建议使用事件通知 */
}
return E_OK;
}
/* 验证擦除结果:读取整个扇区并检查是否全为0xFF */
static Std_ReturnType Flash_VerifyErase(uint32 SectorAddr)
{
uint32 i;
Fls_Read(SectorAddr, TEST_SECTOR_SIZE, EraseCheckBuf);
/* 等待读取完成 */
while (Fls_GetStatus() != FLS_CMD_READ_DONE)
{
}
for (i = 0; i < TEST_SECTOR_SIZE; i++)
{
if (EraseCheckBuf[i] != 0xFFu)
{
return E_NOT_OK; /* 擦除不完整 */
}
}
return E_OK;
}
/* 主函数:演示Flash擦除流程 */
int main(void)
{
Std_ReturnType result;
/* 1. 初始化Flash驱动 */
Flash_Init();
/* 2. 擦除目标扇区 */
result = Flash_EraseSector(TEST_SECTOR_START_ADDR);
if (result != E_OK)
{
/* 擦除失败处理 */
while(1);
}
/* 3. 验证擦除结果 */
result = Flash_VerifyErase(TEST_SECTOR_START_ADDR);
if (result == E_OK)
{
/* 擦除成功:扇区内容全部为0xFF */
}
else
{
/* 擦除验证失败 */
while(1);
}
while(1);
return 0;
}
运行与验证
- 在EB tresos或Davinci中配置Fls驱动,确保扇区大小与地址匹配(本案例使用0xAF000000起始的64KB扇区)。
- 编译并下载代码到MCU,在擦除前向目标扇区写入非0xFF数据(如0xAA)以便对比。
- 运行程序,观察执行流程:
- 若验证通过,程序停留在while(1)且无异常;
- 若验证失败,程序进入错误死循环。 - 使用UDE或Lauterbach调试器读取0xAF000000起始的64KB内存,确认所有字节均为0xFF。
通过标准:调试器读取目标扇区全部字节为0xFF,且程序未进入错误处理分支。
关键说明
- Fls_Init、Fls_Erase、Fls_Read、Fls_GetStatus为AUTOSAR MCAL标准接口,具体实现由MCAL配置工具生成。
- 实际工程中建议使用Fls_EventNotification回调替代轮询等待,以提升CPU利用率。
- 擦除操作不可中断,需确保电源稳定;若擦除期间复位,扇区数据可能处于不确定状态。