[STM32F4] STM32F4 上的boot加载程序问题

[复制链接]
125|20
solty 发表于 2026-9-11 15:25 | 显示全部楼层
检查boot程序的编译优化等级。如果开了高等级优化,编译器可能认为appEntry()后面的while(1)是死代码而优化掉,但更关键的是可能优化掉设置MSP和VTOR的语句。
spicy 发表于 2026-9-11 17:08 | 显示全部楼层
用调试器单步跟踪时,在appEntry()这一行设置断点,然后按步进进入。如果直接跑飞而不是进入APP的Reset_Handler,说明APP的中断向量表前两个字不是有效的栈顶和入口地址。
stormwind123 发表于 2026-9-11 19:26 | 显示全部楼层
确认APP程序的烧录方式。如果用Keil直接下载APP,需要确保下载地址是0x08008000;如果用外部工具烧录hex文件,要确认hex文件里的地址信息是否正确。
七毛钱 发表于 2026-9-11 21:13 | 显示全部楼层
在跳转前调用HAL_RCC_DeInit()复位RCC时钟配置,让APP程序可以从干净的时钟状态开始初始化,避免boot和APP之间时钟配置冲突。
今天会画卧蚕吗 发表于 2026-9-11 22:55 | 显示全部楼层
APP程序里的RCC_PLLConfig参数需要根据实际晶振频率核对。你用的是12MHz晶振配336/2/7得到168MHz,如果实际晶振不是12MHz,PLL配置错误会导致APP运行频率不对。
内政奇才 发表于 2026-9-12 10:18 | 显示全部楼层
如果boot程序用了FreeRTOS或其他RTOS,跳转前必须先停止调度器并删除所有任务,否则RTOS的SysTick和PendSV中断会干扰APP的正常运行。
又见江南雨 发表于 2026-9-12 10:25 | 显示全部楼层
跳转前必须关闭所有中断和外设时钟。boot程序里如果开了SysTick、USART等中断,跳转后这些中断仍然会触发,但中断向量表已经指向APP,会导致程序跑飞。
才没有脸红 发表于 2026-9-12 12:08 | 显示全部楼层
跳转前要调用__disable_irq()关闭全局中断,然后在APP的main函数开头再调用__enable_irq()重新开启,否则APP里无法响应任何中断。
没有太阳的晴天 发表于 2026-9-12 13:19 | 显示全部楼层
在跳转前需要调用HAL_DeInit()或手动关闭SysTick定时器,SysTick->CTRL = 0;和SysTick->LOAD = 0;这两句很关键,否则SysTick中断会在APP里继续触发。
故里说长安 发表于 2026-9-12 16:40 | 显示全部楼层
APP程序的链接脚本需要修改。在Keil中要把ROM起始地址改为0x08008000,否则编译出来的APP代码仍然从0x08000000开始链接,跳转后执行的是错误地址的代码。
海滨消消 发表于 2026-9-12 18:02 | 显示全部楼层
APP程序的向量表偏移量设置要正确。在APP的system_stm32f4xx.c中,VECT_TAB_OFFSET应该设为0x8000,或者在main函数开头调用SCB->VTOR = 0x08008000;。
甜心puppy 发表于 2026-9-12 20:35 | 显示全部楼层
检查APP程序的起始地址处是否真的有合法的栈顶指针和复位向量。用调试器查看0x08008000和0x08008004两个地址的内容,栈顶应该是0x200xxxxx,复位向量应该是0x08008xxx。
等凌晨日出 发表于 2026-9-12 20:38 | 显示全部楼层
boot程序在跳转前要把所有用过的外设恢复到复位状态,特别是RCC配置。APP里调用了RCC_DeInit(),但如果boot里已经把时钟配到168MHz,APP再配一次可能出问题。
茉璃夏 发表于 2026-9-12 22:00 | 显示全部楼层
跳转前最好执行一次NVIC->ICER清除所有中断使能位,再执行NVIC->ICPR清除所有挂起中断标志,确保没有遗留的中断请求。
豌豆爹 发表于 2026-9-13 17:01 | 显示全部楼层
__set_MSP(appStack)设置主栈指针后,紧接着调用appEntry(),但此时编译器可能会在两条语句之间插入栈操作,导致栈指针被覆盖,建议用内联汇编确保顺序。
进入猫次元 发表于 2026-9-13 12:12 | 显示全部楼层
检查APP程序是否在main函数之前就使能了看门狗。如果boot里开了独立看门狗,跳转到APP后没有及时喂狗,看门狗会复位整个系统,表现为系统工作异常。
Bowclad 发表于 2026-9-11 13:37 | 显示全部楼层
VTOR设对没?APP启动代码读对地址了没?别光看表面,底层细节得注意。
EmmaTT 发表于 2026-9-12 14:00 | 显示全部楼层
看样子你的VTOR设置没问题,APP的VECT_TAB_OFFSET也对了。问题可能出在APP的初始化部分,检查下 startup.S文件,确保.data和.bss段地址正确,还有C运行环境是否正确初始化。
ForgottenRealm 发表于 2026-9-14 11:26 | 显示全部楼层
VTOR设置要和APP一致,检查APP的VECT_TAB_OFFSET是否为0x8000,同时确认RCC复位到默认状态,避免时钟配置冲突。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部