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;
}

运行与验证

  1. 在EB tresos或Davinci中配置Fls驱动,确保扇区大小与地址匹配(本案例使用0xAF000000起始的64KB扇区)。
  2. 编译并下载代码到MCU,在擦除前向目标扇区写入非0xFF数据(如0xAA)以便对比。
  3. 运行程序,观察执行流程:
    - 若验证通过,程序停留在while(1)且无异常;
    - 若验证失败,程序进入错误死循环。
  4. 使用UDE或Lauterbach调试器读取0xAF000000起始的64KB内存,确认所有字节均为0xFF。

通过标准:调试器读取目标扇区全部字节为0xFF,且程序未进入错误处理分支。

关键说明

  • Fls_Init、Fls_Erase、Fls_Read、Fls_GetStatus为AUTOSAR MCAL标准接口,具体实现由MCAL配置工具生成。
  • 实际工程中建议使用Fls_EventNotification回调替代轮询等待,以提升CPU利用率。
  • 擦除操作不可中断,需确保电源稳定;若擦除期间复位,扇区数据可能处于不确定状态。