理解不准确。 【若STM32从系统存储区启动的话】,一般通过设置BOOT引脚电平来实现。一旦设置好后,位于系统存储区0x1fff,xxxx的地址的内容就映射到地址0x0000 0000了。因此上电后,内核还是从逻辑地址0那里去取复位ISR的地址,也就是执行的是系统存储区里的复位向量。 【而在flash启动】也是一样,BOOT引脚电平设置好后,位于Flash的0x0800 0000开始的内容就映射到地址0x0000 0000了。上电后,内核从逻辑地址0那里去取复位ISR地址,就是执行Flash低端地址处的复位向量。 |
香水城 发表于 2014-5-23 13:05 是的,明白了。cm3默认的从地址0处是中断向量表。而权威指南中说since the address 0x0 should be boot code是说Cm3设计师认为微控制器设计者(STM32)在0地址到以后的一段地址中放的是启动代码,就是所谓的bootloader。若STM32从系统存储区启动的话,那么中断向量表就会在系统存储区了,此时就要用中断向量偏移寄存器使得向量表重定位。这样才能执行用户的中断程序。而在flash启动就不需要重定位了,因为flash启动,直接映射到地址0,执行的就是用户代码。 感谢香水城的回答。不知上述理解是否正确 。 |
就是说:Cortex-M3内核上电后总是去逻辑地址4的地方取复位向量的地址。 而对于STM32的实现来说,它在0x0800 0000的地方实现了物理的用户flash,在0x2000 0000的地方实现了物理SRAM。 上电时,根据BOOT引脚的电平,会把SRAM或用户Flash或系统Flash(就是出厂前放置bootloader的地方)映射到逻辑0地址。也就是所谓的从SRAM Flash 和bootloader启动。 运行起来之后,vector table的地址可以动态地通过VTOR这个内核寄存器来修改。就是说,程序里可以有多个中断向量表(比如bootloader有自己的一套ISR,升级后的应用程序也有自己的一套ISR)。那么任意时候,究竟哪个中断向量表起作用,即发送中断时内核去哪里获取中断入口地址,则是看这个VTOR指向的地方了。 |