RT-Thread论坛
直播中

李军

8年用户 1300经验值
私信 关注
[问答]

使用RT-Thread+ST-link烧录程序到STM32F4没有报错但是程序没有烧录进去是怎么回事?

前提:板子上的程序是自己学习的程序,会一直输出hello
项目代码是不会持续输出hello的,项目代码可以编译通过,并且点击下载也提示下载完成。
但是下载完成之后打开串口输出,还是会一直有hello输出出来,感觉系统并没有被烧录上去
这种是哪里的问题呢

回帖(1)

戚歆敦

2025-3-25 17:52:26

根据问题描述,以下是可能的原因及逐步解决方案:




1. 检查启动模式(BOOT引脚配置)



  • 问题:STM32的启动模式由BOOT0和BOOT1引脚决定。若BOOT0为高电平,芯片会从系统存储器(内置Bootloader)启动,而非用户程序。

  • 解决

    • 确认硬件上BOOT0引脚接地(低电平),确保从主FLASH(0x08000000)启动。

    • 检查BOOT1引脚状态(通常悬空或接地)。





2. 确认烧录地址和链接脚本



  • 问题:程序可能烧录到错误的FLASH地址。

  • 解决

    • 检查IDE(如Keil、IAR或STM32CubeIDE)中的烧录配置,确保起始地址为 0x08000000

    • 确认链接脚本(如.ld文件)中FLASH的起始地址是否正确。





3. 执行全片擦除



  • 问题:旧程序残留在FLASH中,未被完全擦除。

  • 解决

    • 在烧录工具中勾选 “Full Chip Erase”“Mass Erase” 选项,确保烧录前彻底擦除FLASH。

    • 使用STM32CubeProgrammer手动擦除FLASH:
      STM32_Programmer_CLI -c port=SWD -e all





4. 检查FLASH写保护



  • 问题:FLASH被写保护,导致无法写入。

  • 解决

    • 使用STM32CubeProgrammer连接芯片,检查读保护状态:
      STM32_Programmer_CLI -c port=SWD -ob displ

    • 如果存在保护,解除保护:
      STM32_Programmer_CLI -c port=SWD -ob nwrp 0





5. 验证程序实际烧录结果



  • 问题:烧录工具未报错,但程序未实际写入。

  • 解决

    1. 使用STM32CubeProgrammer读取FLASH内容:
      STM32_Programmer_CLI -c port=SWD -r 0x08000000 1024 read_data.bin

    2. 对比read_data.bin与编译生成的.bin.hex文件,确认内容一致。





6. 检查复位和时钟配置



  • 问题:程序未运行可能是由于复位后未正确初始化。

  • 解决

    • 手动复位板子(按下复位按钮)。

    • 检查新程序的时钟配置(如HSE/LSE是否匹配硬件晶振)。





7. 排查硬件连接问题



  • 问题:ST-Link连接不稳定或接触不良。

  • 解决

    • 重新拔插ST-Link与开发板的SWD接口。

    • 尝试更换ST-Link或使用其他烧录工具(如J-Link)。





8. 检查程序入口和中断向量表



  • 问题:中断向量表未正确指向新程序。

  • 解决

    • 确认RT-Thread的启动文件(如startup_stm32f4xx.s)中中断向量表地址为 0x08000000

    • 在代码中显式设置向量表偏移(适用于RT-Thread):
      SCB->VTOR = FLASH_BASE; // 确保指向FLASH起始地址





9. 更新工具链和驱动



  • 问题:ST-Link驱动或IDE版本过旧。

  • 解决

    • 更新ST-Link驱动至最新版本(从ST官网下载)。

    • 更新IDE(如Keil、STM32CubeIDE)到最新版本。





最终验证步骤



  1. 使用STM32CubeProgrammer烧录.hex.bin文件,观察是否成功。

  2. 烧录后读取FLASH内容,确认新程序已写入。

  3. 确保BOOT0为低电平时上电,手动复位后观察串口输出。


如果以上步骤均无误,问题应已解决。若仍无法解决,可能是硬件故障(如FLASH损坏),建议更换芯片测试。

举报

更多回帖

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