STM32系列单片机的启动流程

“请注意M3系列内核与早期的ARM9/ARM11的启动动作不同”

一、Cortex-M3的基本启动动作

STM32基于ARM的Cortex-M3内核设计,Cortex-M3在复位释放后,自动将0x00000000地址存储的4个字节的数据读入栈指针MSP作为栈顶指针,自动将0x00000004地址存储的4个字节的数据读入程序指针PC作为起始执行地址,中断向量偏移量寄存器此时为全0,即无偏移,指向0x00000000地址。

 

二、STM32的启动模式

STM32支持3种启动模式,由复位释放后的一段时间内锁存到的Boot[1:0]数据决定,Boot[1:0]=x0时,为普通模式(从片内Flash启动);Boot[1:0]=01时,为ISP模式(从系统存储器启动,载入ISP Bootloader);Boot[1:0]=11时,为RAM启动模式(从RAM启动)。

当STM32为Flash启动模式时,0x08000000起始的Flash空间被映射到0x0地址。复位后,MSP获取到的0x00000000地址存放的栈顶指针实际为0x08000000(Flash空间起始地址)所存放的数据,PC获取到的0x00000004地址存放的代码执行起始地址实际为0x08000004所存放的数据。因而程序的运行由Flash内存储的数据控制。

当STM32为RAM启动模式时,0x20000000起始的RAM空间被映射到0x0地址。复位后过程与Flash启动类似。

当STM32为ISP模式时,系统存储器的空间被映射到0x0地址。复位后过程与以上Flash启动类似。

 

三、STM32的启动解析及中断向量配置

以上的启动过程会带来一个问题,由于中断向量表中存放的是绝对地址信息,而不是如其它MCU或ARM早期架构中的相对偏移跳转指令,因而烧写文件将与启动模式相关,即同样的烧写文件不可能既可以在Flash中运行又在RAM中运行。例如,在Flash启动时,0x00000004(0x08000004地址映射)存储的内容一般应为0x08000100,此信息为程序的初始运行地址(0x08000000-0x08000100用于存放中断向量表);若同样的文件被烧入RAM中,在启动时PC指针载入了0x08000100并从此处开始执行,则会由于Flash中没有程序文件而无所运行。因而对于同样的源代码,当使用不同的启动模式时,需在编译器中进行配置,告知编译器复位后运行的初始起址,则编译器会根据启动模式的不同对生成的烧写文件添加不同的地址偏移以适应对应的启动模式。

同时在执行程序中一般会对中断向量偏移量寄存器进行配置,使中断向量表指向其实际存放的位置而不是初始地址0x00000000(如Flash启动时应配置使其指向0x08000000);但由于实际的代码存放空间总是会被映射到0x00000000地址,因而不对中断向量偏移量寄存器进行配置使保持全0的初始中断向量查找亦不会出错。但根据实际情况对其进行配置是一种良好的使用习惯。

你可能感兴趣的:(单片机,编程,STM32,单片机,编程,指针,内核)