单片机学习小组
直播中

张艳

7年用户 1605经验值
私信 关注

STM32片内FLASH烧写错误导致ST-LINK烧录不进程序怎么解决?

STM32片内FLASH烧写错误导致ST-LINK烧录不进程序怎么解决?

回帖(1)

张玲玲

2022-1-27 09:33:58
项目及配置描述
这个问题是在做bootloader OTA测试时出现的,其中bootloader由http://iot.rt-thread.com/生成的STM32F103VExx用bootloader;
分区表配置如下:

分区名
所处设备
偏移地址
大小
app
片内flash
0x40000
128kb
download
片内flash
0x20000
128kb
F1 系列片内 Flash 的地址是从 0x8000000 开始的。填写 app 分区偏移地址为 0x20000 时,表示 app 分区实际从片内 Flash 的 0x8020000 地址开始。由于 Bootloader 存储在 0x8000000 起始的地址中,因此在进行分区配置时要为 Bootloader 固件预留足够的空间,例如偏移地址为 0x8000,表示为其预留了 32K 空间。
app固件使用RT-Thread Studio 1.0.6制作,固件包含 OTA 下载器功能,需要用到两个软件包ota_downloader latest和fal v0.5.0,ota_downloader使能Ymodem OTA,fal分区表配置如下:

#define RT_APP_PART_ADDR 0x08040000 //app分区首地址
/* partition table */
#define FAL_PART_TABLE                                                               
{                                                                                    
    {FAL_PART_MAGIC_WORD,        "bl",     "stm32_onchip",         0,   128*1024, 0},
    {FAL_PART_MAGIC_WORD,       "app",     "stm32_onchip",   256*1024,  128*1024, 0},
    {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME,         0, 1024*1024, 0},
    {FAL_PART_MAGIC_WORD,  "download", "stm32_onchip", 128*1024, 128*1024, 0},
}
bootloader分区“bl” -- 偏移地址0,大小128kb,
app分区“app” -- 偏移地址256*1024=0x40000,大小128kb,
download待升级固件分区“download” -- 偏移地址128*1024=0x20000,大小128kb

烧写描述
使用STM32 ST-LINK Utility v3.1.0分别烧写bootloader和app固件,烧写起始地址分别为0x08000000和0x08040000

问题描述
烧写bootloader后程序运行正常,结果打印如下:

接着烧写app固件,从地址0x08040000烧写,打印结果如下:

程序卡在这里,之后就发现ST-LINK连接不上了,结果如下:


这个结果,我从网上搜了大量资料,发现可能的原因是芯片休眠和自锁,先要擦除芯片,然后再烧正常的程序即可,网上有说使用FlyMcu按复位键重新烧程序的,有说在keil下在setting里面Debug选项中,connect & reset options 中connect 选择with Pre-reset来解决的,这几种方法我都试过,不可行,首先这些方法的前因后果描述都不够明确,其次使用flymcu需要基于串口ISP一键下载,需要用到“复位”操作,第二种方法也需要用到复位操作,此时我发现问题的关键在能够使MCU“复位”,但我的板子是量产产品没预留复位按键,只能手动改了,而且ST-LINK Utility报错也有提示让在“connect under reset”模式下尝试解决,于是设置成“connect under reset”后按“复位”惊喜发现ST-LINK连上了,但提示芯片在复位模式下“Core is held in reset”让切换到“normal”或“hot plug”模式,意思就是好了呗,果断切到“normal”模式下,果然,好了!但此时一定要注意,因为我出错是在0x08040000烧写程序出错的,如果此时只从0x08000000烧写程序,而0x08040000开始的程序并没变化,芯片可能还会锁住,所以正确的操作是“擦除芯片”,这样就不会出问题了。

举报

更多回帖

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