ST意法半导体
直播中

张昂笙

9年用户 1109经验值
私信 关注
[问答]

STM32L151 HAL_UART_ErrorCallback或引导加载程序有什么问题?

大家好!我在我的项目中使用 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 或引导加载程序有什么问题?









回帖(1)

张玲

2023-1-31 15:40:52
仔细检查 VTOR 实现,是否需要 512 字节边界以适应表的大小。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分