ST意法半导体
直播中

李涛

7年用户 1368经验值
私信 关注
[问答]

当定时器中断发生时,带有自己引导加载程序的项目进入“b Infinite_Loop”是为什么?

我已经为 STM32G030K8 编写了自定义引导加载程序 + 最终用户应用程序。
当我单独运行引导加载程序时,引导加载代码按预期工作
当我从地址 0x0800000 运行用户应用程序时,代码工作正常。
但是在我进行更改以能够构建和调试引导加载程序 + 最终用户应用程序之后,有些事情出错了......
  • 所做的更改是
1) 在最终用户应用程序 system_stm32g0xx.c 中,我更改了 vect 选项卡偏移量   
#define VECT_TAB_OFFSET 0x00005800U
2) 在最终用户应用程序 STM32G030K8TX_FLASH.ld 中,我更改了原始 FLASH (rx):ORIGIN = 0x8005800,LENGTH = 40K
3) 在引导程序应用程序 STM32G030K8TX_FLASH.ld 中,我更改了长度
闪存 (rx):原点 = 0x8000000,长度 = 22K
(2k用于向flash写入数据)
  • 在调试设置中

当我使用上述设置运行调试器时,调试器从最终用户应用程序的 main(void) 开始?我希望调试器会在引导加载程序的主程序中启动。
但是当我按下复位芯片按钮时,调试器跳转到引导加载程序的第一行(如预期的那样)。
此时调试器开始运行引导加载程序,并按设计跳转到最终用户主循环,因此引导加载程序完成了我需要做的事情。
在最终用户应用程序主循环中,我可以逐步执行所有操作,直到触发第一个计时器 16 中断,当发生这种情况时,代码将在 b 无限循环中运行...
  • /**
  • * @brief  This is the code that gets called when the processor receives an
  • *         unexpected interrupt.  This simply enters an infinite loop, preserving
  • *         the system state for examination by a debugger.
  • *
  • * @param  None
  • * @retval None
  • */
  •   .section .text.Default_Handler,"ax",%progbits
  • Default_Handler:
  • Infinite_Loop:
  •   b Infinite_Loop
  •   .size Default_Handler, .-Default_Handler
中断向量似乎位于错误的地址。我错过了什么?









回帖(1)

张艳

2022-12-15 11:31:45
发现问题,似乎我需要在 system_stm32g0xx.c 中取消注释这一行


  • /* #define USER_VECT_TAB_ADDRESS */

取消注释此行时,VTOR 注册表将更新为 VECT_TAB_OFFSET 值。
我之前在 G4 系列中创建了引导加载程序和用户应用程序,在那些项目中我不需要取消注释这一行。
举报

更多回帖

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