需求:
1. 需要一块能够掉电存储ID信息的分区,用于识别,类似于EEPROM
2. 这块区域要和程序逻辑分区分开
FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了
现在的单片机,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据
(1)各分区介绍
(2)FlexRam
FlexRam可以作为EEPROM使用,可作为存储id区域
(1)debug flash时出现刷成砖的情况
解决刷砖方法
方法a: Jflash可以连上但S32DS无法debug
SWD接口无需reset线
a.使用Jflash 擦除扇区“Erase Sectors”
b.直接使用二进制文件烧写 点击“.Program”
注意: 如果以上解锁不了,可使用Jlink命令行模式,
输入unlock kinetis进行解锁
方法b: Jflahs连不上
需要SWD接口接上reset线,这样就可以连上Jflash了
这个reset线是Jlink设备上的“RST”不是“TRST”
刷成砖原因
原因一:
使用FLASH_DRV_EraseAllBlock(&flashSSDConfig)接口导致
后续没有使用此接口
原因二:
/* Disable cache to ensure that all flash operations will take effect instantly,
* this is device dependent */
#ifndef FLASH_TARGET
#ifdef S32K11x_SERIES
MSCM->OCMDR[0u] |= MSCM_OCMDR_OCM1(0xFu);
MSCM->OCMDR[1u] |= MSCM_OCMDR_OCM1(0xFu);
MSCM->OCMDR[2u] |= MSCM_OCMDR_OCM1(0xFu);
#endif /* S32K11x_SERIES */
#endif /* FLASH_TARGET */
此段程序不能使用,否则全速跑(单步不会出问题)就会出现问题,变成砖
这个不太清楚是什么原因
(2)操作EEProm流程
FlexNVM相当于是作为管理flash的部分
a. 需将Flexram格式化作为EEprom,DFlash的一部分作为FlexNVM
/* Configure FlexRAM as EEPROM and FlexNVM as EEPROM backup region,
* DEFlashPartition will be failed if the IFR region isn't blank.
* Refer to the device document for valid EEPROM Data Size Code
* and FlexNVM Partition Code. For example on S32K116:
* - EEEDataSizeCode = 0x03u: EEPROM size = 2 Kbytes
* - DEPartitionCode = 0x03u: EEPROM backup size = 32 Kbytes */
ret = FLASH_DRV_DEFlashPartition(&flashSSDConfig, 0x03u, 0x03u, 0x0u, false, true);
DEV_ASSERT(STATUS_SUCCESS == ret);
/* Re-initialize the driver to update the new EEPROM configuration */
ret = FLASH_DRV_Init(&Flash1_InitConfig0, &flashSSDConfig);
DEV_ASSERT(STATUS_SUCCESS == ret);
/* Make FlexRAM available for EEPROM */
ret = FLASH_DRV_SetFlexRamFunction(&flashSSDConfig, EEE_ENABLE, 0x00u, NULL);
DEV_ASSERT(STATUS_SUCCESS == ret);
b. EEPROM 写操作
status_t FLASH_EEPROM_Write(uint32_t addr_offset,
uint32_t size,
const uint8_t * pData)
{
status_t ret;
uint32_t address;
address = flashSSDConfig.EERAMBase + addr_offset;
ret = FLASH_DRV_EEEWrite(&flashSSDConfig, address, size, pData);
DEV_ASSERT(STATUS_SUCCESS == ret);
return ret;
}
c. EEPROM 读操作
#define DATA_ADDRESS_DATA0 0x14000000
#define DATA_ADDRESS_DATA1 0x14000004
uint32_t *addr0=(uint32_t *)DATA_ADDRESS_DATA0;
uint32_t *addr1=(uint32_t *)DATA_ADDRESS_DATA1;
gSysFlashPara.FlashFlag = (uint8_t)*addr0;
gSysFlashPara.SubNodeId = (uint8_t)*addr1;