查看: 5604|回复: 1

[S32] S32K144 Flash使用

[复制链接]

该用户从未签到

1

主题

1

帖子

0

新手上路

Rank: 1

积分
11
最后登录
2018-5-25
发表于 2018-5-21 13:43:02 | 显示全部楼层 |阅读模式
之前用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之后,去读这个区域读不出写进去的数据,请问哪位知道是怎么回事?
我知道答案 目前已有1人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2019-7-2 13:42
  • 签到天数: 31 天

    连续签到: 1 天

    [LV.5]常住居民I

    12

    主题

    253

    帖子

    0

    高级会员

    Rank: 4

    积分
    576
    最后登录
    2020-4-7
    发表于 2018-5-21 15:17:04 | 显示全部楼层
    学习了学习了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-11 13:34 , Processed in 0.095807 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表