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

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

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

【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");
}
}
上述代码运行ok,同时查看Memory 数据确认flash 数据已经成功擦除。

【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");
}
}上述代码运行结果如下:

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

26

