基于RTT对STM32L476进行OTA(中)

博客详细记录了在STM32开发中遇到的Bootloader卡在加载阶段的问题,原因在于ISP下载电路对串口和boot0的影响。通过去除R13电阻解决了打印问题,并调整了Flash分区以适应Ymodem协议的OTA更新。在RTThread项目中,修改了配置文件、中断向量表和链接脚本来适应新的分区和压缩后的固件大小。同时,文中还提到了可能出现的烧录区域错误及解决方法,以及如何指定下载地址确保程序正确烧录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前L431一直卡在bootloader那里的问题原因是因为硬件上用了ISP自动下载电路,如下图,实际rtthread不需要这部分电路,使用Ymodem协议下载程序,而且串口还会对boot0造成干扰,导致每次软复位单片机都重启不了,必须断电才行,而供电又是用的USB,所以出现了一直无法打印bootloader上电打印的提示,因为插上USB后再打开USB串口,可能已经打印完了,或者打开串口瞬间给了boot0一个异常电平,导致单片机进入自带的IAP模式

把R13去掉,烧录生成的boot.bin可以正常打印了,如下图

 

一些配置(用RT studio,也可以用ENV工具):

 

项目文件fal_cfg.h改之前

改之后(片内flash   bootloader:128K   APP:64K   download:64K)

 

必须新建一个文件夹放fal_cfg.h等文件,直接添加··\samples\porting路径到IDE里面不管用,如下图,原路径文件名还是打叉,新建ports文件夹,再添加路径就可以

点击工程文件选属性,如下图

修改固件的链接地址 keil文件是link.sct  rtthread studio是link.lds  如下图

然后在主函数下添加:

/**
 * Function    ota_app_vtor_reconfig
 * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR).
*/
#define RT_APP_PART_ADDR 0x8020000
static int ota_app_vtor_reconfig(void)
{
    #define NVIC_VTOR_MASK   0x3FFFFF80
    /* Set the Vector Table base location by user application firmware definition */
    SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

    return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

最后是这样的

ota的时候文件太大,要压缩

还不行,boot.bin大概30多k,就把boot区改为64k

修改#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,        "bl",     "onchip_flash",         0,   64*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "app",     "onchip_flash",   64*1024,  64*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "download", "onchip_flash", 128*1024, 128*1024, 0}, \
}

其中"onchip_flash" 位于drv_flash_l4.c中

const struct fal_flash_dev stm32_onchip_flash = { "onchip_flash", STM32_FLASH_START_ADRESS, STM32_FLASH_SIZE, FLASH_PAGE_SIZE, {NULL, fal_flash_read, fal_flash_write, fal_flash_erase} };

 

出现下图错误:download空间不够大

出现下图错误:78k(压缩后)小于download的128k,但是大于app的64k

因为APP程序有100多K,所以重新分配了一下flash,boot区:48K ,APP区:128K,download区(使用了压缩,压缩后可以到70K,如果不压缩,80K放不下):80K       最终YMODEM方式进行OTA效果:

发现了一个坑,明明修改了app的起始烧录地址,但是有时候还是会随机下载到flash的boot区(如下图):

采用的解决方法下载boot.bin后,仿真app程序可以

相关问题参考  这个问答结贴原因是中断向量表没有修改 但是我已经修改中断向量表了(上面记述有)还有会偶尔出现烧录区域错误的情况,目前失败后还是用仿真代替下载

再或者用工具指定下载地址的方法进行下载,如下图:

修改中断向量表导致启动失败问题  中间也出现过类似程序跑飞的现象,但是后来把烧录区域错误问题解决后就没出现了,这个题主还出现了,OTA升级后要重启的情况,这个就没碰见过了。大胆设想,那个题主会不会是本文第一段话的问题

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大饼酱人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值