单片机/MCU论坛
直播中

fdvcxhtg

9年用户 1106经验值
擅长:嵌入式技术
私信 关注
[问答]

T2G Cluster 4M Lite 上的 (S26HL512T) 中的数据在重置后会被覆盖,如何确保持久性?

我们正在使用TRAVEO™ T2G Cluster 4M LITE开发板。 我们的目的是利用映射到 SMIF0 的HYPERFLASH™ (S26HL512T) 来存储特定数据。
我们使用了图形驱动程序中的示例将数据写入 SMIF。SMIF 初始化后,数据成功写入HYPERFLASH™ ,我们通过监视窗口进行了验证。
然而,我们面临的问题是,在下一次电路板重置和 SMIF 重新初始化之后,先前写入的数据会被其他数据覆盖。
我们已经广泛审查了文档,但找不到任何明确的信息来表明是否需要任何额外的配置来确保写入HYPERFLASH™数据保持持久,直到我们在应用程序中明确擦除或覆盖它。
您能否澄清一下:

  • 是否需要任何特定的配置或设置来防止重置后先前写入的数据被覆盖?
  • 是否有可能默认初始化序列或启动代码的某些部分无意中修改了HYPERFLASH™的内容?

回帖(1)

梁宏满

2025-7-25 18:12:34

为了确保写入HyperFlash(S26HL512T)的数据在TRAVEO™ T2G Cluster 4M Lite开发板复位后持久保存,避免被覆盖,以下是关键步骤和配置说明:


核心问题分析



  • 数据被覆盖的原因:通常在复位后,SMIF模块重新初始化时,如果配置了内存映射区域(如XIP区域)或其他启动代码意外修改了数据区域,可能导致已写入的数据被覆盖。

  • HyperFlash特性:HyperFlash是非易失性存储器,数据在断电后不会丢失。写入后数据被覆盖通常是软件配置问题,而非硬件问题。


解决方案步骤




  1. 确保写入地址避开关键区域



    • 检查链接器脚本:确保数据写入地址 不与应用代码/数据区域重叠。例如:

      • 应用代码通常占用起始地址(如 0x18000000)。

      • 将数据写入高端地址(如 0x187F0000)以减少冲突风险。

      • 参考示例地址分配:
        # 链接器脚本片段
        FLASH (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000    /* 128MB 整个HyperFlash */
        .user_data 0x187F0000 : {
        KEEP(*(.user_data))
        } > FLASH





  2. 正确配置SMIF的初始化流程



    • 禁用缓存干扰:在写入操作后禁用缓存并刷新,确保数据写入物理Flash:
      // 写入后刷新缓存
      if (Cy_SMIF_MemWrite( ... ) == CY_SMIF_SUCCESS) {
      // 禁用并刷新数据缓存
      CY_SMIF_CTL(SMIF0)->CACHE_CTL &= ~(CY_SMIF_CTL_CACHE_ENABLE_Msk);
      __DSB(); __ISB(); // 确保指令完成
      }

    • 避免XIP区域重新映射:在main()初始化时,配置SMIF但不修改数据所在区域的内存映射。确保XIP配置与复位前一致。




  3. 完整擦除-写入流程



    • 擦除扇区:写入前必须先擦除目标扇区(HyperFlash仅支持扇区擦除)。
      cy_en_smif_status_t status;
      uint32_t sectorAddr = 0x187F0000; // 目标地址
      status = Cy_SMIF_MemErase(SMIF0, CY_SMIF_WIDTH_OCTAL, sectorAddr, CY_SMIF_FLASH_SECTOR_ERASE);
      while (Cy_SMIF_BusyCheck(SMIF0)); // 等待擦除完成

    • 分页写入:HyperFlash要求分页写入(每页256字节),确保使用正确API:
      uint8_t writeData[256] = { ... }; // 数据需对齐分页
      cy_stc_smif_mem_write_params_t writeParams = {
      .data = writeData,
      .dataSize = 256,
      .addr = sectorAddr,
      .memoryMappedMode = false // 必须设为false
      };
      status = Cy_SMIF_MemWrite(SMIF0, &writeParams, CY_SMIF_WRITE_FIRST_BYTE);




  4. 复位后安全读取数据



    • 延迟初始化:在应用初始化后期(如main()函数末尾)再读取数据,避开启动代码干扰:
      void main() {
      board_init(); // 基本硬件初始化
      init_user_app(); // 用户应用初始化
      read_persistent_data(); // 最后读取数据
      }

    • 直接地址访问:通过指针直接访问数据:
      uint32_t* dataPtr = (uint32_t*)0x187F0000;
      uint32_t storedValue = *dataPtr; // 读取数据




关键配置注意事项



  • SMIF时钟与模式

    确保SMIF时钟频率在HyperFlash支持的范围内(如166MHz),并在初始化时配置为Octal(8线)模式
    cy_en_smif_status_t smifStatus = Cy_SMIF_Init(SMIF0, &smifConfig, 166000000);

  • HyperFlash状态检查

    写入/擦除后检查状态寄存器:
    if (Cy_SMIF_IsOperationComplete(SMIF0, CY_SMIF_FLASH_CHECK_COMPLETION, 1000) != CY_SMIF_SUCCESS) {
      // 处理超时错误
    }

  • 避免启动代码干扰

    确保启动代码或BSP初始化流程不擦除/覆写数据区域。


验证流程



  1. 写入数据后复位,使用调试器直接从 0x187F0000 查看数据。

  2. 读取逻辑使用直接地址访问而非SMIF API(避免缓存影响)。

  3. 如果问题仍存在:

    • 检查芯片手册中 SMIF复位后的默认状态(如缓存是否自动使能)。

    • 在复位后通过调试器手动暂停执行,立即查看目标地址数据是否物理损坏。



按照以上步骤配置,可确保HyperFlash中的数据在复位后持久保留。重点在于避开关键地址区域正确擦除写入以及复位后谨慎初始化SMIF

举报

更多回帖

发帖
×
20
完善资料,
赚取积分