2.2.问题分析
现在我们开始来分析这个问题。
我们打开 AN3155 这个应用笔记,这是关于 STM32 Bootloader 所使用的 USART 协议的描述。由于 STM32F091RCT6 中还
是有代码存在的,所以我们直接使用 GO 命令来测试一下跳转的情况。
再将 CN7 的第 5 脚和第 7 脚用跳线帽短接起来,按下 RESET 按键从 System Memory 的 Bootloader 启动。我们使用串口工
具来进行分析,将串口工具配置为:端口号 COM16,波特率 115200,奇偶校验设置为 EVEN,数据位为 8,停止位为 1。打
开连接
我们先发送“ 0x7F”给 STM32,与 Bootloader 确认 USART 口, Bootloader 确认后, 回送 ACK( 0x79),我们可以看到正
常收到 0x79,所以通讯建立。 现在开始测试 GO 命令。 按照 GO 命令的流程,我们发送“0x21 0xDE”启动 GO 命令,
Bootloader 正常回应 ACK( 0x79)。现在要测试跳转到用户代码那边运行用户代码,所以我们发送 Main Flash memory 的地
址 0x0800 0000 和 Checksum( XOR(0x08, 0x00, 0x00,0x00)=0x08),也就是发送“0x08 0x00 0x00 0x00 0x08”,这个时
候, Bootloader 也正常地回应了 ACK( 0x79)。那么看起来,程序是正常跳转了,可是为什么就是看不到运行用户代码而能
看到的 LD2 闪烁呢。看起来, 很有可能会是从 Bootloader 跳转到用户代码后,在用户代码执行过程中出错了, 导致复位,并
回到了 Bootloader 程序。那么,从 Bootloader 跳转到用户代码之后执行出错的最可能原因就是向量表设置不对。我们从
AN3155 中看到这么一句话:“ The Jump to the application works only if the user application sets the vector table correctly
to point to the application address.”也就是说,我们必须在用户代码中设置正确的向量表。所以我们回到 GPIO_IOToggle 的
例程, 加入代码将向量表从 Bootloader 修改回用户代码的向量表。
|