onion_ss 2026-01-27 15:23 采纳率: 0%
浏览 2

Contents mismatch at: 90000000H !

Erase Done.
Programming Done.
Contents mismatch at: 90000000H !
Verify Failed!
Error: Flash Download failed - "Cortex-M7"
编译可以通过,烧录会变成这样

这是报错界面

img


这是flash download

img


是这个flash算法文件的错误吗

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2026-01-27 15:24
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的错误信息是:

    Contents mismatch at: 90000000H !
    Erase Done. Programming Done. Contents mismatch at: 90000000H !
    Verify Failed!
    Error: Flash Download failed - "Cortex-M7"

    这表明在烧录(Flash Download)过程中,程序被写入了 Flash 存储器,但验证时发现内容不匹配,特别是在地址 90000000H 处。这通常与以下几种原因有关:


    可能的原因分析:

    1. Flash 算法文件(Flash Algorithm)配置错误

      • 这是最常见的原因之一。
      • 如果使用的 Flash 算法文件(通常是 .s.lst 文件)与芯片实际的 Flash 结构不符,会导致烧录失败。
    2. 目标设备 Flash 配置不正确

      • 比如 Flash 的起始地址、大小、扇区划分等与实际芯片不一致。
    3. 代码中存在不可写入 Flash 的区域

      • 某些寄存器或内存区域不能直接写入,比如 Bootloader 区域、系统控制寄存器等。
    4. 烧录工具设置问题

      • 如 J-Link、ST-Link、OpenOCD 等调试器的配置错误。
    5. 编译器生成的代码位置与 Flash 地址不匹配

      • 如果你手动设置了 .ld 文件(链接脚本),可能会导致代码被写入到非预期的 Flash 地址。

    🔧 解决方案:

    1. 检查 Flash 算法文件是否正确

    • 确保使用的是与你的芯片型号完全匹配的 Flash 算法文件。
    • 常见的 Flash 算法文件格式是 .s.lst,位于 Keil、STM32CubeProgrammer、J-Link 等工具的安装目录下。

    示例路径(Keil):
    C:\Keil_v5\ARM\FLASH\

    示例路径(STM32CubeProgrammer):
    C:\STMicroelectronics\STM32CubeProgrammer\flash\

    • 如果你使用的是 STM32 芯片,确保选择的 Flash 算法与你的芯片型号一致(例如 STM32F4xxSTM32L4xx 等)。

    2. 检查链接脚本(.ld 文件)

    • 如果你自定义了链接脚本,请确认以下几点:
      • Flash 起始地址是否正确(如 0x08000000
      • Flash 大小是否合理(如 512KB、1MB 等)
      • **代码段(.text)和数据段(.data)是否被正确分配到 Flash 中

    示例 .ld 文件片段:

    MEMORY
    {
        FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x00080000  /* 512KB */
        RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000  /* 128KB */
    }
    

    3. 检查烧录工具配置

    • 使用 STM32CubeProgrammer 或 J-Link Commander 等工具时,检查以下设置:
      • Target Device 是否选择正确
      • Flash Algorithm 是否正确加载
      • Erase Mode 是否为 Full Chip EraseSector Erase(根据需要)

    J-Link Commander 示例命令:

    J-Link > device STM32F407VG
    J-Link > connect
    J-Link > erase
    J-Link > loadfile your_file.hex
    J-Link > verify
    

    4. 检查代码中是否有写入 Flash 的操作

    • 如果你在代码中使用了 __HAL_FLASH_CLEAR_FLAG() 或者 FLASH_EraseSector() 等函数,确保这些操作不会影响到当前正在运行的 Flash 区域(如 Bootloader 或代码所在区域)。

    5. 修改链接脚本以避免冲突

    如果 90000000H 是某个特定的地址(如 SRAM 或外设地址),请确认代码是否被错误地写入到了不该写入的位置。

    修改后的链接脚本示例(确保代码只写入 Flash):

    SECTIONS
    {
        .isr_vector : 
        {
            . = ALIGN(4);
            KEEP(*(.isr_vector))
            . = ALIGN(4);
        } > FLASH
    
        .text : 
        {
            . = ALIGN(4);
            *(.text)
            *(.text.*)
            *(.glue_veneers)
            *(.eh_frame)
        } > FLASH
    
        .data : 
        {
            . = ALIGN(4);
            *(.data)
            *(.data.*)
        } > RAM
    }
    

    🛠️ 总结:

    | 问题类型 | 解决方案 | |----------|----------| | Flash 算法文件错误 | 检查并更换正确的 Flash 算法文件 | | 链接脚本错误 | 确认 Flash 起始地址、大小、段分配 | | 烧录工具配置错误 | 检查 Target Device 和 Flash Algorithm 设置 | | 代码写入非 Flash 区域 | 检查代码是否写入 SRAM 或外设地址 | | 代码中有 Flash 操作 | 确保 Flash 操作不影响当前运行代码 |


    💡 建议:

    如果你使用的是 STM32 系列芯片,推荐使用 STM32CubeProgrammer 工具进行烧录,它会自动检测 Flash 算法,并提供更直观的界面。

    如果你能提供具体的芯片型号(如 STM32F407VG)、使用的开发环境(如 Keil、STM32CubeIDE、IAR)以及 Flash 算法文件名,我可以帮你进一步定位问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月27日