资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
STM32的启动分析一、 STM32的复位序列当STM32产生复位后,做的第一件事就是读取下列两个32位整数的值:1、 从地址0x0000,0000处取出MSP(主堆栈指针)的初始值放入MSP寄存器中;2、 从地址0x0000,0004处取出复位向量放入PC寄存器中,然后从PC中存取的地址出取指并开始执行。图1:复位序列请注意,这与传统的ARM架构以及其他的单片机完全不同,他们复位后一般是从0x0000,0000地址处取出第一条指令并执行,而一般0x0000,0000都是一条跳转指令。而在STM32中,在0地址处提供的是MSP的初始值,然后紧跟着就是向量表(上电复位时向量表是被默认放在0x04地址处,但是通过修改向量表偏移量寄存器(VTOR)可以将其定义在其他位置)。另外,向量表中的数值是32位的地址,而不是跳转指令,系统会自动将该数值存入PC寄存器中后从该32为地址指向的地址出开始执行,这有点像指针的指针。图2:初始化MSP及PC的初始化的一个范例因为SMT32使用的是向下生长的满栈,所以MSP初始值必须是堆栈内存的末地址加1。举例来说,如果你的堆栈区域在0x20007C00-0x20007FFF之间,那么MSP的初始值就必须是0x20008000。向量表跟随在MSP的初始化之后也就是第2个标目。要注意因为STM32是在Thumb态下执行,所以向量表中每个数值必须把LSB(最低权重位)置1.正是因为这个原因,图2中就是用0x101来表示0x100.当0x100处的指令得到执行后,就正是开始了程序的执行。在这之前MSP是必须的,因为可能第1条指令还没来得及执行,就发生了NMI(不可屏蔽中断)或者其他的Fault,MSP初始化好后就已经为他们的服务例程准备好了堆栈。二、STM32的3种启动模式在STM32中,可以通过BOOT1:0引脚选择三种不同的启动模式,如表1:表1:STM32的三种启动模式根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:1、 从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000,0000),但仍然能够在原有的地址(0x8000,0000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x0000,0000或者0x8000,0000.2、 1、从系统存储器启动:系统存储器被映射到启动空间(0x0000,0000),但仍然能够在原有的地址(0x1FFF,F000)访问它。3、 从内置SRAM启动:只能在0x2000,0000开始的地址区访问SARM。当从内置的SRAM中启动,在应用程序的初始化代码中,必须使用NVIC的异常表和偏移寄存器,从新映射向量表到SRAM之中。二、 STM32的启动代码STM32的启动代码在startup_stm32_hd.s中Reset_Handler LDR R0, =SystemInit BLX R0 LDR R0, =_iar_program_start BX R0
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号