在电子设备的开发与应用中,微控制器(MCU)的稳定性和兼容性至关重要。AT32F403A 这款微控制器虽然采用了 M4 内核,但具备与 Sxx32F103 兼容的特性,这意味着可以将 cube 生成的 103 程序直接烧录到 403a 上运行,为开发者提供了便利。
近,在一块使用 AT32F403A 的板子上,开发人员设计了具备 ISP 功能的电路,将 ISP 脚连接到一个按键上。其设计目标是,若在上电前按下 ISP 按键,板子就能进入 ISP 状态,从而可通过串口对 MCU 进行程序升级。

然而,在实际使用过程中,却出现了问题。当程序运行时按下 ISP 按键,程序会出现跑飞的情况,这与初的设计不符。通过调试器跟踪发现,按下 ISP 键后,程序会跑到地址 0 开始的位置。
进一步的测试发现,使用 AT32_Work_Bench 生成的工程编写测试程序时,ISP 按键功能正常;但使用 STM32CUBEMX 生成的工程编写测试程序时,就会出现程序跑飞的问题。这表明问题可能并非出在 MCU 的兼容性上,而是软件对中断向量表的设置存在缺陷。

开发人员仔细比对了两个工程中的 startup.C 程序,发现 SCB->VTOR 设置似乎存在问题。经过深入研究,终找到了解决办法:在 Cube 生成的程序中,只需在 SystemInit 文件中修改 SCB->VTOR = FLASH_BASE,就能解决上电后改变 BOOT0 引脚状态导致程序跑飞的问题。