【简介】
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 的写入擦除处理。

 
					
				
 
			
			
			
						
			 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

