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就不行?

  • 只能说,不同编译器可能产生的细微差异。
相关推荐
chem41115 小时前
STM32CubeMX Linux 开发环境搭建
stm32·单片机·linux系统
无敌贵点大王15 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
恶魔泡泡糖18 小时前
stm32F103C8T6标准库串口接收之中断方式2
stm32·单片机·嵌入式硬件
充哥单片机设计18 小时前
【STM32开源项目】智能小区充电桩
stm32·单片机·嵌入式硬件·毕业设计·小区充电桩·智能小区充电桩
充哥单片机设计20 小时前
【STM32开源项目】智能语音台灯
stm32·单片机·嵌入式硬件·毕业设计·单片机设计·智能语音台灯
Brilliantwxx1 天前
【STM32】 SPI阻塞式通信与HAL源码 (源码分析)
stm32·单片机·嵌入式硬件
WWJA王文举1 天前
Bootloader、App 和升级分区之间是什么关系?
stm32·freertos·嵌入式开发·在线升级
LCG元1 天前
STM32F103 NTC 热敏电阻测温实战:分压网络设计、Steinhart-Hart 标定与 ADC 采样优化实测
stm32·单片机·嵌入式硬件
怀民民民1 天前
嵌入式软件学习路线与项目实践记录:STM32、FreeRTOS、Linux 与 OpenMV
stm32·freertos·嵌入式软件·嵌入式linux·openmv
辰域电子1 天前
STM32项目开源:实验室消防预警控制系统(代码 + 原理图 + 仿真)
stm32·单片机·嵌入式硬件·开源·proteus