導言
STM32 - Embedded IDE - GCC - 如何在工程中生成.bin格式固件
STM32 - Embedded IDE - GCC - 使用 GCC 鏈接腳本限制 Flash 區域
STM32 - Embedded IDE - GCC - 如何在工程中定義一段 NoInit RAM 內存
STM32 - Embedded IDE - GCC - 如何將編譯得到的.bin固件添加CRC32校驗碼
遷移的GCC的過程碰到不少問題,匯總一下(最惡心的是第二點):
- EIDE插件 + J-LINK + RTT打印log的組合不好用。所以log打印從RTT改到USART2上了。
- 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就不行?
- 只能說,不同編譯器可能產生的細微差異。