|
硬件环境: STM32H750VB+W25Q32JV
旧项目从M4更换到H750.先开发bootloader跳转QSPI地址0x90000200执行正常.后移植application程序时触发了bug.
新建工程点灯即包含Systick中断,正常.一般到此就证明bootloader跳转没问题,是干净的.移植Free RTOS执行正常,可以正常切换任务,此时我还没有意识到问题即将到来.
移植串口失败: 只要串口中断接收到数据就会立即跳转并卡在startup_stam32h7xxx.s的B.位置.也算是移植中常见的bug,一定是移植的时候忘记CV某个中断函数.然后开启debug心路历程
- 对照确认全部中断函数都在.debug查看NVIC寄存器,确认没有遗漏
- 去掉RTOS,删减代码,就留下HAL的初始化和开启串口中断接收.还是存在问题.
- 怀疑只有内核中断是好的,外设中断挂?因此开启外部中断测试,触发外部中断一切正常.
- 尝试将application不偏移,直接在0x08000000执行,没问题
- 怀疑boot代码问题,没有清理干净现场.修改boot功能到初始化后立即跳转app,最简化.还以存在问题.
- keil配置或者SDK问题?从网络上下载可用的H750程序到QSPI执行,开启相同串口接收也触发bug
- 至此开始怀疑人生.省略800字艰辛过程说结论: 我是个XX
故障本质:SCB->VTOR偏移值设定错误
项目中有个需求,在bin的头部存储一些配置和校验信息,用于OTA升级时处理bin文件和执行时校验bin内容.因此application的执行地址要向后偏移一些,项目规定偏移512字节.问题也就出在这里了

这是M7手册的一段.对VTOR设定的偏移地址有要求.即需要将中断数量向上取2的幂才合法.对于之前项目选用的M3和M4内核来说,一般只有100个左右中断向量(16+60+),此时按照512取整来偏移地址就没问题了.
但是H750这颗中断就相对多一点.向量表尺寸0x298,因此需要按照1024取整.
至于为何有的中断可以而串口中断就会报错,内核中断都在向量表前方,测试外部中断也在前部.而出问题的LPUART1_IRQHandler恰好在表尾.导致了无法命中问题.
|
|