【简介】
S32K146 的Flash Memory Module (FTFC) 包含P-flash/FlexNVM/FlexRAM 三种类型,其中P-flash 是我们存储代码的介质,FlexNVM 可以配置为存储代码数据或者模拟EEPROM使用,FlexRAM 可以作为RAM使用当FlexNVM 配置为EEPROM FlexRAM回加载EEPROM 数据至FlexRAM 供用户读写EEPROM使用,对应芯片手册描述如下:
【S32DS FLASH配置】
S32DS的flash 驱动程序配置也是很简单只是配置P-flash/FlexNVM/FlexRAM 的地址信息。
生成的配置结构体内容如下:
/*********************************************************************************************************************** * This file was generated by the S32 Configuration Tools. Any manual edits made to this file * will be overwritten if the respective S32 Configuration Tools is used to update this file. **********************************************************************************************************************/ /* clang-format off */ /* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* !!GlobalInfo product: Peripherals v14.0 processor: S32K146 package_id: S32K146_LQFP144 mcu_data: s32sdk_s32k1xx_rtm_401 processor_version: 0.0.0 functionalGroups: - name: BOARD_InitPeripherals UUID: 2d0c0af7-dbe7-4f00-821a-837510d6ab4e called_from_default_init: true selectedCore: core0 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ /* clang-format on */ /******************************************************************************* * Included files ******************************************************************************/ #include "peripherals_flash_1.h" /******************************************************************************* * flash_1 initialization code ******************************************************************************/ /* clang-format off */ /* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* instance: - name: 'flash_1' - type: 'flash' - mode: 'general' - custom_name_enabled: 'false' - type_id: 'flash' - functional_group: 'BOARD_InitPeripherals' - peripheral: 'FTFC' - config_sets: - flash_driver: - flashConfig: - 0: - Configuration: 'Flash_InitConfig0' - readOnly: 'true' - PFlashBase: '0x00000000' - PFlashSize: '0x100000' - DFlashBase: '0x10000000' - EERAMBase: '0x14000000' - CallBack: 'NULL_CALLBACK' - quick_selection: 'flash_default' * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ /* clang-format on */ /** * @page misra_violations MISRA-C:2012 violations * * @section [global] * Violates MISRA 2012 Advisory Rule 8.7, External variable could be made static. * The external variables will be used in other source files in application code. * */ /* Flash user configuration 0 */ const flash_user_config_t Flash_InitConfig0 = { .PFlashBase = 0x0U, .PFlashSize = 0x100000U, .DFlashBase = 0x10000000U, .EERAMBase = 0x14000000U, .CallBack = NULL_CALLBACK };
【FTFC控制指令】
FTFC 对flash 的编程通过FTFC的Flash Common Command Object Registers (FCCOB0 - FCCOBB) 寄存器控制,通过该寄存器组传递操作命令,对应的控制格式如下:
FCCOB0 代表控制命令,FCCOB01-FCCOB3发送操作的地址信息。
对应command sdk 代码中定义如下
/******************************************************************************* * Flash hardware algorithm operation commands *******************************************************************************/ #define FTFx_VERIFY_BLOCK 0x00U #define FTFx_VERIFY_SECTION 0x01U #define FTFx_PROGRAM_CHECK 0x02U #define FTFx_READ_RESOURCE 0x03U #define FTFx_PROGRAM_LONGWORD 0x06U #define FTFx_PROGRAM_PHRASE 0x07U #define FTFx_ERASE_BLOCK 0x08U #define FTFx_ERASE_SECTOR 0x09U #define FTFx_PROGRAM_SECTION 0x0BU #define FTFx_VERIFY_ALL_BLOCK 0x40U #define FTFx_READ_ONCE 0x41U #define FTFx_PROGRAM_ONCE 0x43U #define FTFx_ERASE_ALL_BLOCK 0x44U #define FTFx_SECURITY_BY_PASS 0x45U #define FTFx_PFLASH_SWAP 0x46U #define FTFx_ERASE_ALL_BLOCK_UNSECURE 0x49U #define FTFx_PROGRAM_PARTITION 0x80U #define FTFx_SET_EERAM 0x81U
以下是FLASH_DRV_EraseSector 函数中擦除sector 代码的操作command
以下是FLASH_DRV_Program 函数中对flash 进行写操作的command 序列
【代码验证】
编写如下测试代码对flash 进行写入擦除实验
#include "sdk_project_config.h" #include <stdio.h> #include <string.h> #include "func_init.h" /******************************************************************************************************** * Private Macro definition * *******************************************************************************************************/ #define DBG_ENABLE #define DBG_TAG "FLS" #define DBG_LEVEL DBG_LOG #define DBG_COLOR #include <rtdbg.h> /******************************************************************************************************** * Private Variable Definitions * *******************************************************************************************************/ flash_ssd_config_t Pss_InitConfig0; /******************************************************************************************************** * Global Function Declarations * *******************************************************************************************************/ static int chip_flash_init(void) { status_t ret; /* Init lpi2c master */ ret = FLASH_DRV_Init(&Flash_InitConfig0,&Pss_InitConfig0); if(ret != STATUS_SUCCESS) { LOG_E("FTFC init failed %x.",ret); } else { LOG_I("FTFC init OK."); } return 1; } INIT_BOARD_EXPORT_LEVEL1(chip_flash_init); /******************************************************************************************************** * Private Function Declarations * *******************************************************************************************************/ unsigned int flash(char argc,char *argv[]) { status_t ret; if(argc != 2) return 1; if(strcmp("write",argv[1]) == 0) { ret = FLASH_DRV_Program(&Pss_InitConfig0,0x80000,16,"0123356789abcdef"); if(ret != STATUS_SUCCESS) { LOG_E("FTFC write failed %x.",ret); } else { LOG_I("FTFC write OK."); } } if(strcmp("erase",argv[1]) == 0) { ret = FLASH_DRV_EraseSector(&Pss_InitConfig0,0x80000,4096); if(ret != STATUS_SUCCESS) { LOG_E("FTFC erase failed %x.",ret); } else { LOG_I("FTFC erase OK."); } } return 0; }
flash write 后通过IAR 的memory 窗口查看0x80000地址的数据内容已经按照预期的写入
flash erase 后后通过IAR 的memory 窗口查看0x80000地址的数据内容 发现已经被擦除
使用S32K1XX的SDK代码很容易就可以实现片内flash 的写入擦除处理。