| STM32F7 的复位序列 前面讲的那些情况,现在在 STM32F7 中有些不一样了。在 ARM Cortex-M7 的 Generic User Guide 中,有一段如下描述:
 “On system reset, the vector table is at the address configured at implementation, typically 0x00000000. ”从这段话,我们可
 以看出,在 M7 中,复位后向量表的位置不是固定在地址 0 处,而是可以由各个芯片厂商自己定义。
 对于 STM32F7 来说,它是由 BOOT_ADD0[15:0]和 BOOT_ADD1[15:0]这两个 option bytes 决定的。
 
   Boot 脚 = 0 时,由 BOOT_ADD0 [15:0] 的值决定,ST 默认值为 0x0020 0000。这是 ITCM-FLASH 的起始地址(通过 ART
 加速器,访问 FLASH); Boot 脚 = 1 时,由 BOOT_ADD1 [15:0] 的值决定,ST 默认值为 0x0010 0000。这是系统 Bootloader 的起始地址。
 * 如果对 BOOT_ADDx 写入的地址值超出了存储器映射的范围或者到了保留地址空间,系统将自动转为下面的值:
 BOOT_ADD0 = 0x0020 0000;
 BOOT_ADD1 = 0x0000 0000(和出厂时 ST 默认的值 0x0010 0000 不一样)
 也就是说,只要你配置好了 boot address, ST 的硬件会自动修改向量表的偏移地址寄存器 VTOR,使之与 boot address 相匹
 配。不需要再通过软件修改 VTOR 寄存器。
 回到本文开始的那个问题。所以对于 STM32F7 来说,默认状态下,复位后它并不是从 0 地址从开始执行,而是从 0x0020
 0000 或者 0x0010 0000 开始执行,所以与 ITCM-RAM 从 0 地址处开始并不冲突。如果你非要将向量表放在 0 地址开始的位
 置(修改 VTOR 寄存器),也不是不可以。只是这是,如果你还要在 ITCM-RAM 里面跑别的程序的话,就要注意向量表不要
 与其他程序的地址重叠了。
 |