大家好!我在我的项目中使用
STM32L151VDT7X、CubeMX HAL 和 Atollic TrueSTUDIO® for STM32 9.3.0。我需要在空中升级我的固件,所以我制作了“bootloader + image”应用程序:
1)在引导加载程序链接器文件中编辑:
- MEMORY
- {
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K
- FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 0xA100
- FLASH2 (rx) : ORIGIN = 0x8040000, LENGTH = 0
- }
2)在图像链接器文件中编辑:
- MEMORY
- {
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 80K
- FLASH (rx) : ORIGIN = 0x800A100, LENGTH = 192K - 0xA100
- FLASH2 (rx) : ORIGIN = 0x8040000, LENGTH = 192K
- }
3) 创建简单的测试引导加载程序:
- void JumpToApplication(uint32_t VT_Address) {
- __disable_irq();
- HAL_RCC_DeInit();
- HAL_DeInit();
- void (*Int_Entry) (void);
- uint32_t sp = *(uint32_t *)(VT_Address + STACK_POINTER); // STACK_POINTER == 0
- __set_MSP(sp);
- // INT_PROGRAM_START == 4
- Int_Entry = (void(*)())(*(uint32_t *)(VT_Address + INT_PROGRAM_START));
- (*Int_Entry)();
- }
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- JumpToApplication(IMAGE_VECTOR_TABLE); //IMAGE_VECTOR_TABLE == 0x0800A100
- return 0;
4)图像程序中第一个动作:
- void RemapVectorTable(uint32_t VT_Address) {
- __disable_irq();
- SCB->VTOR = VT_Address;
- __enable_irq();
- }
- int main(void)
- {
- //IMAGE_VECTOR_TABLE == 0x0800A100
- RemapVectorTable(IMAGE_VECTOR_TABLE);
- ..
- HAL_Init();
没有引导加载程序的程序工作正常(从 0x8000000 地址开始)。结果“bootloader + image”程序启动、运行,但在
HAL_UART_ErrorCallback点落入 HardFault_Handler。我使用 DMA UART4。没有引导加载程序的程序通过 HAL_UART_ErrorCallback 并继续工作。
HAL_UART_ErrorCallback 或引导加载程序有什么问题?