之前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升级后要重启的情况,这个就没碰见过了。大胆设想,那个题主会不会是本文第一段话的问题