S32K116调试记录(4)Flash(FlexRam)调试

需求:

       1.  需要一块能够掉电存储ID信息的分区,用于识别,类似于EEPROM

      2.  这块区域要和程序逻辑分区分开

1.  基本概念

           FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了

         现在的单片机,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电不丢失的数据

2. S32K116 flash介绍

(1)各分区介绍

(2)FlexRam

FlexRam可以作为EEPROM使用,可作为存储id区域

3. Flash调试

(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;

猜你喜欢

转载自blog.csdn.net/jzwjzw19900922/article/details/104494674