这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】Flash驱动使用

共8条 1/1 1 跳转至

【S32K3XX】Flash驱动使用 26

高工
2026-01-15 09:21:30     打赏

【简介】

              S32K3XX 系列的MCU 的 FLASH 管理是通过C40 IP 完成的,以下是C40 IP 的框图说明。

             image.png

在 S32DS 中可以通过C40 IP 来配置C40 的驱动程序。

image.png


image.png   

我们基于 C40 IP 的配置工具来配置驱动程序,对应配置如下:

image.png

【flash 驱动初始化】

生成上述C40 IP 的驱动配置后,我们就可以使用使用生成的配置结构来初始化C40 IP 的驱动,flash 驱动初始化配置如下:

    /* C40 IP init */
    C40_Ip_Init(&C40_Ip_InitCfg);

【flash 数据擦写验证】

对 flash 数据进行写入前需要先进行擦除,编写如下的测试代码 擦除芯片的0x500000地址的数据内容。

/*==================================================================================================
*                                       LOCAL MACROS
==================================================================================================*/
#define FLS_MASTER_ID                0U
#define FLS_BUF_SIZE                 128U
#define FLS_SECTOR_ADDR              0x00500000U
#define FLS_SECTOR_TEST              C40_CODE_ARRAY_0_BLOCK_1_S128

void flash_erase_test(void)
{
    C40_Ip_StatusType t_ReturnValue = C40_IP_STATUS_ERROR;

    t_ReturnValue = C40_Ip_ClearLock(FLS_SECTOR_TEST, FLS_MASTER_ID);
    if(C40_IP_STATUS_SUCCESS != t_ReturnValue)
    {
        /* erase failed */
        PRINTF("Flash clear lock failed %x \r\n", t_ReturnValue);
    }
    else
    {
        PRINTF("Flash clear lock success \r\n");
    }

    /* erase 0x50_0000  */
    t_ReturnValue = C40_Ip_MainInterfaceSectorErase(FLS_SECTOR_TEST, FLS_MASTER_ID);
    if(C40_IP_STATUS_SUCCESS != t_ReturnValue)
    {
        /* erase failed */
        PRINTF("Flash erase failed %x \r\n", t_ReturnValue);
    }
    else
    {
        PRINTF("Flash erase success \r\n");
    }

    t_ReturnValue = WaitForFlag(FLASH_MCR_ERS_MASK);
    if(C40_IP_STATUS_SUCCESS != t_ReturnValue)
    {
        /* erase failed */
        PRINTF("Flash waite erase failed %x \r\n", t_ReturnValue);
    }
    else
    {
        PRINTF("Flash wait erase success \r\n");
    }
}

image.png

上述代码运行ok,同时查看Memory 数据确认flash 数据已经成功擦除。

image.png

【flash 数据写入验证】

在上述擦除的基础上 继续进行写入验证,编写如下的测试代码。

/*==================================================================================================
*                                       LOCAL MACROS
==================================================================================================*/
#define FLS_MASTER_ID                0U
#define FLS_BUF_SIZE                 128U
#define FLS_SECTOR_ADDR              0x00500000U
#define FLS_SECTOR_TEST              C40_CODE_ARRAY_0_BLOCK_1_S128

void flash_write_test(void)
{
    C40_Ip_StatusType t_ReturnValue = C40_IP_STATUS_ERROR;
    const uint8_t wBuffer[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
                           0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10};

    t_ReturnValue = C40_Ip_ClearLock(FLS_SECTOR_TEST, FLS_MASTER_ID);
    if(C40_IP_STATUS_SUCCESS != t_ReturnValue)
    {
        /* erase failed */
        PRINTF("Flash clear lock failed %x \r\n", t_ReturnValue);
    }
    else
    {
        PRINTF("Flash clear lock success \r\n");
    }

    /* Write data */
    t_ReturnValue = C40_Ip_MainInterfaceWrite(FLS_SECTOR_ADDR, 16, wBuffer, FLS_MASTER_ID);
    if(C40_IP_STATUS_SUCCESS != t_ReturnValue)
    {
        /* erase failed */
        PRINTF("Flash write failed %x \r\n", t_ReturnValue);
    }
    else
    {
        PRINTF("Flash write success \r\n");
    }

    t_ReturnValue = WaitForFlag(FLASH_MCR_PGM_MASK);
    if(C40_IP_STATUS_SUCCESS != t_ReturnValue)
    {
        /* erase failed */
        PRINTF("Flash wait write failed %x \r\n", t_ReturnValue);
    }
    else
    {
        PRINTF("Flash wait write success \r\n");
    }
}

   上述代码运行结果如下:

        image.png

查看flash 中的数据也已经按照预期的写入。

image.png


院士
2026-01-16 16:50:09     打赏
2楼

谢谢分享。


高工
2026-01-21 07:19:51   被打赏 5 分(兑奖)     打赏
3楼

车规级的芯片应用在以后应该很有前途


专家
2026-01-21 12:23:02     打赏
4楼

谢谢分享!


工程师
2026-01-21 13:18:47   被打赏 5 分(兑奖)     打赏
5楼

这个清除锁的操作是为了避免资源竞争吗?这个SDK的设计考虑的蛮多的。C40_Ip_ClearLock 的这个函数。


专家
2026-01-22 22:05:49   被打赏 5 分(兑奖)     打赏
6楼

数据有数据验证更完美


高工
2026-01-23 11:55:20   被打赏 5 分(兑奖)     打赏
7楼

怎么看出代码擦掉的是0x500000这个地址开始的数据?


高工
2026-01-23 13:01:09     打赏
8楼

感谢分享,这擦写还是蛮方便的


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]