单片机/MCU论坛
直播中

周煌煦

9年用户 1147经验值
私信 关注
[问答]

CY8C6347LQI-BLD52擦除扇区失败的原因?

我根据 Empty_App 示例创建了该项目。我使用芯片CY8C6347LQI-BLD52。我收到错误:
错误:无法擦除地址 0x10000000 的扇区 0(块验证错误)。

回帖(1)

niu!kf

2025-7-22 17:42:26

CY8C6347LQI-BLD52 擦除扇区失败的原因与解决方案


当您在 CY8C6347LQI-BLD52(PSoC 6)芯片上遇到扇区擦除失败 (0x10000000 扇区 0 验证错误) 时,常见原因及解决步骤如下:




1. 代码在目标扇区运行 (最常见原因)



  • 问题: PSoC 6 不允许擦除当前正在运行代码的扇区。

  • 分析:

    • 地址 0x10000000主 Flash 的起始扇区(通常存储启动代码或应用程序)。

    • 如果您的擦除代码在此扇区运行,擦除会立即导致崩溃。


  • 解决方案:

    1. 将关键代码移至 RAM
      CY_SECTION(".cy_ramfunc") CY_NOINLINE
      void EraseSector() {
      cy_en_flashdrv_status_t status;
      uint32_t sector = 0;
      status = Cy_Flash_EraseSector(sector, &context); // 传递上下文对象
      // 检查 status
      }

    2. 使用 Dual Bank 架构(如果已配置):确保代码从 Bank 0 运行时只擦除 Bank 1。





2. 闪存保护 (Flash Protection)



  • 问题: 扇区 0 可能被硬件/软件写保护。

  • 解决方案:

    • 检查保护状态
      uint32_t protectStatus = Cy_Flash_GetProtectionStatus();

    • 禁用保护(仅调试阶段):
      if (protectStatus & (1 << sector)) {
      Cy_Flash_ProtectSector(CY_FLASH_PROTECT_UNPROTECT, sector);
      }





3. 时钟配置错误



  • 要求: 闪存操作需要 48 MHz IMO 主时钟(与 PSoC 5 不同)。

  • 解决方案:

    • 检查时钟
      Cy_SysClk_ClkHfGetStatus(0); // 确认 HFCLK[0] 运行在 48MHz

    • 切换时钟(如果使用其他时钟源):
      Cy_SysClk_ClkHfSetSource(0, CY_SYSCLK_CLKHF_IN_CLKPATH0);





4. 闪存初始化遗漏



  • 问题: PSoC 6 的闪存驱动需显式初始化。

  • 解决方案:
    cy_en_flashdrv_status_t status = Cy_Flash_Init();
    if (status != CY_FLASH_DRV_SUCCESS) { /* 处理错误 */ }




5. 中断干扰



  • 问题: 擦除期间的中断会导致超时/失败。

  • 解决方案:
    __disable_irq(); // 禁用中断
    EraseSector();   // 擦除操作
    __enable_irq();  // 启用中断




6. 硬件问题



  • 检查项:

    • 供电电压不稳定(确保 > 2.7V)。

    • 调试器(KitProg/J-Link)固件过旧(更新至最新版)。

    • 芯片损坏(更换开发板测试)。





7. 工程配置问题



  • 关键设置:

    • 链接脚本 (LD/Linker Script): 确认 .text 段不在扇区 0 (如 0x10040000)。

    • IDE 配置:

    • PSoC Creator: 检查 Bootloader/DFU 是否占用了扇区 0。

    • ModusToolbox: 检查 design.modus 中的闪存分区。





调试建议



  1. 缩小擦除范围
    status = Cy_Flash_EraseRow(0x10000000); // 尝试擦除单行(256字节)

  2. 打印错误码
    printf("Status: 0x%08Xn", status); // 参考 cy_flash_drv.h 中的错误码

  3. 使用寄存器调试

    • 检查 FLASHC_FM_CTL 寄存器状态位:
      uint32_t statusReg = FLASHC_FM_CTL;



通过以上步骤,可解决 90% 的 PSoC 6 擦除失败问题。重点优先检查 代码位置时钟配置。如问题仍存在,请提供您的擦除代码片段及系统初始化配置。

举报

更多回帖

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