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分区首地址
#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开始的程序并没变化,芯片可能还会锁住,所以正确的操作是“擦除芯片”,这样就不会出问题了。