STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践

导言


STM32 - Embedded IDE - GCC - 如何在工程中生成.bin格式固件
STM32 - Embedded IDE - GCC - 使用 GCC 链接脚本限制 Flash 区域
STM32 - Embedded IDE - GCC - 如何在工程中定义一段 NoInit RAM 内存
STM32 - Embedded IDE - GCC - 如何将编译得到的.bin固件添加CRC32校验码

迁移的GCC的过程碰到不少问题,汇总一下(最恶心的是第二点):

  1. EIDE插件 + J-LINK + RTT打印log的组合不好用。所以log打印从RTT改到USART2上了。
  2. booloader程序使用GCC编译器时,出现跳转App前进入HardFault_Handler()。奇怪的是用Keil的ARMCC编译App程序话,可以稳定地成功跳转。换GCC编译的App程序时,跳转必然失败,然后进入HardFault_Hanler()中断。

OTA升级过程:

项目地址:

github: https://github.com/q164129345/MCU_Develop/tree/main/bootloader14_stm32f103_move_to_vscode_eide

gitee(国内): https://gitee.com/wallace89/MCU_Develop/tree/main/bootloader14_stm32f103_move_to_vscode_eide

一、修改bootloader程序


booloader程序使用GCC编译器时,出现跳转App前进入HardFault_Handler()。奇怪的是用Keil的ARMCC编译的的App程序话,可以稳定地成功跳转。换GCC编译的App程序时,跳转必然失败,然后进入HardFault_Hanler()中断。

如上图所示,解决方案很简单,只需要将函数IAP_JumpToApp()里的代码SCB->VTOR = AppAddr注释掉即可。

原因分析:

  • 中断时机冲突:在 Bootloader 中设置 SCB->VTOR 后,CPU 立即使用 APP 向量表,但如果此时有中断(调试器相关),就会导致向量表混乱和 HardFault。

为什么在Keil环境可以,换成GCC就不行?

  • 只能说,不同编译器可能产生的细微差异。
相关推荐
Zw-awa1 天前
从 CPU 搬运到自动搬运:DMA、空闲中断和两块缓冲
stm32
无敌贵点大王1 天前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件
庙堂龙吟奈我何1 天前
二进制和十六进制
stm32·单片机
TST-魚爷1 天前
小型视频会议室音频踩坑:一体化拾音扩音方案实测分享(易视讯)
stm32·电脑·音视频·钉钉·腾讯会议·zoom会议
十八岁牛爷爷1 天前
STM32H7 长时间运行后 HTTP 断连:从“串口还活着”到 TX 描述符错账
stm32·单片机·嵌入式硬件
Lxx_Zw1 天前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·stm32·单片机·嵌入式硬件
糖糖单片机设计1 天前
基于 STM32 + LU-ASR01 的智能台灯
stm32·单片机·嵌入式硬件·51单片机·语音识别
起个网名真难~2 天前
STM32F103_Bootloader_从零到UART升级成功_博客原稿
stm32·单片机·嵌入式硬件
小李不想当小白2 天前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
Zw-awa2 天前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
stm32