在线时间1 小时
UID2099442
注册时间2018-5-18
NXP金币0
该用户从未签到
新手上路

- 积分
- 11
- 最后登录
- 2018-5-25
|
之前用STM32的时候,可以把一些固定信息保存在Flash中,请问S32K144怎么用?我在P-Flash留了一块区域:
MEMORY
{
/* Flash */
m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x0007FBF0
/* m_user_data (RX) : ORIGIN = 0x00070000, LENGTH = 0x0000FFFF */
m_user_data (RW) : ORIGIN = 0x10000000, LENGTH = 0x00007FFF
/* SRAM_L */
m_data (RW) : ORIGIN = 0x1FFF8000, LENGTH = 0x00008000
/* SRAM_U */
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00007000
}
然后找程序里把一个数组定义到这个区域:
user_config_t __uninited_region_start__ __attribute__((section(".m_user_section")));
const user_config_t *lUserConfigPtr = &__uninited_region_start__;
然后将数据更新到这个区域:
flashInit();
pFlashUpdate(lUserConfigPtr->tls_device_cert, hello, strlen(hello)+1);
pFlashUpdate(lUserConfigPtr->tls_device_key, world, strlen(world)+1);
其中:
int pFlashUpdate(uint32_t dst_addr, const void *data, uint32_t size){
int ret = 0;
int remaining = size;
uint8_t * src_addr = (uint8_t *) data;
if((dst_addr+size)>(flashSSDConfig.PFlashBase+flashSSDConfig.PFlashSize)
|| dst_addr<flashSSDConfig.PFlashBase){
return -1;
}
uint8_t *sector_buff = PLATFORM_MALLOC(FEATURE_FLS_PF_BLOCK_SECTOR_SIZE);
DEV_ASSERT(sector_buff != NULL);
do {
uint32_t fl_addr = ROUND_DOWN(dst_addr, FEATURE_FLS_PF_BLOCK_SECTOR_SIZE);
int fl_offset = dst_addr - fl_addr;
int len = MIN(FEATURE_FLS_PF_BLOCK_SECTOR_SIZE - fl_offset, size);
/* Load from the flash into the cache */
memcpy(sector_buff, (void *) fl_addr, FEATURE_FLS_PF_BLOCK_SECTOR_SIZE);
/* Update the cache from the source */
memcpy((uint8_t *)sector_buff + fl_offset, src_addr, len);
/* Erase the page, and write the cache */
INT_SYS_DisableIRQGlobal();
ret = FLASH_DRV_EraseSector(&flashSSDConfig, fl_addr, FEATURE_FLS_PF_BLOCK_SECTOR_SIZE);
INT_SYS_EnableIRQGlobal();
DEV_ASSERT(STATUS_SUCCESS == ret);
// ret = FLASH_DRV_VerifySection(&flashSSDConfig, fl_addr, FEATURE_FLS_PF_BLOCK_SECTOR_SIZE / FTFx_DPHRASE_SIZE, 1u);
// DEV_ASSERT(STATUS_SUCCESS == ret);
/* Write some data to the erased PFlash sector */
INT_SYS_DisableIRQGlobal();
ret = FLASH_DRV_Program(&flashSSDConfig, fl_addr, FEATURE_FLS_PF_BLOCK_SECTOR_SIZE, sector_buff);
INT_SYS_EnableIRQGlobal();
DEV_ASSERT(STATUS_SUCCESS == ret);
/* Verify the program operation at margin level value of 1, user margin */
// ret = FLASH_DRV_ProgramCheck(&flashSSDConfig, address, size, sourceBuffer, &failAddr, 1u);
// DEV_ASSERT(STATUS_SUCCESS == ret);
dst_addr += len;
src_addr += len;
remaining -= len;
} while ((ret == 0) && (remaining > 0));
PLATFORM_FREE(sector_buff);
return ret;
}
发现可以写进去,也可以读出相应的数据,但是reset之后,去读这个区域读不出写进去的数据,请问哪位知道是怎么回事?
|
|