STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程

STM32片内FLASH烧写错误导致ST-LINK烧不进程序的问题解决过程

项目及配置描述

这个问题是在做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后程序运行正常,结果打印如下:

STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程_第1张图片

 

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

STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程_第2张图片

 

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

STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程_第3张图片

 

这个结果,我从网上搜了大量资料,发现可能的原因是芯片休眠和自锁,先要擦除芯片,然后再烧正常的程序即可,网上有说使用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开始的程序并没变化,芯片可能还会锁住,所以正确的操作是“擦除芯片”,这样就不会出问题了。

 

 

你可能感兴趣的:(RT-Thread,bootloader-OTA,bootloader,ota,rtt,stm32)