STM32的启动方式

在前面讲解的STM32启动代码章节了解到CM-4内核在离开复位状态后的工作过程如下,见图 21:

  1. 从地址0x00000000处取出栈指针MSP的初始值,该值就是栈顶的地址。
  2. 从地址0x00000004处取出程序指针PC的初始值,该值指向复位后应执行的第一条指令。

图 1 复位序列

上述过程由内核自动设置运行环境并执行主体程序,因此它被称为自举过程。

虽然内核是固定访问0x00000000和0x00000004地址的,但实际上这两个地址可以被重映射到其它地址空间。以STM32F429为例,根据芯片引出的BOOT0及BOOT1引脚的电平情况,这两个地址可以被映射到内部FLASH、内部SRAM以及系统存储器中,不同的映射配置见表 21。

表 21 BOOT引脚的不同设置对0地址的映射

BOOT1 BOOT0 映射到的存储器 0x00000000 0x00000004
x 0 内部FLASH 0x08000000 0x08000004
1 1 内部SRAM 0x20000000 0x20000004
0 1 系统存储器 0x1FFF0000 0x1FFF0004

内核在离开复位状态后会从映射的地址中取值给栈指针MSP及程序指针PC,然后执行指令,我们一般以存储器的类型来区分自举过程,例如内部FLASH启动方式、内部SRAM启动方式以及系统存储器启动方式。

  1. 内部FLASH启动方式

当芯片上电后采样到BOOT0引脚为低电平时, 0x00000000和0x00000004地址被映射到内部FLASH的首地址0x08000000和0x08000004。因此,内核离开复位状态后,读取内部FLASH的0x08000000地址空间存储的内容,赋值给栈指针MSP,作为栈顶地址,再读取内部FLASH的0x08000004地址空间存储的内容,赋值给程序指针PC,作为将要执行的第一条指令所在的地址。具备这两个条件后,内核就可以开始从PC指向的地址中读取指令执行了。

  1. 内部SRAM启动方式

类似地,当芯片上电后采样到BOOT0和BOOT1引脚均为高电平时,0x00000000和0x00000004地址被映射到内部SRAM的首地址0x20000000和0x20000004,内核从SRAM空间获取内容进行自举。

在实际应用中,由启动文件starttup_stm32f429_439xx.s决定了0x00000000和0x00000004地址存储什么内容,链接时,由分散加载文件(sct)决定这些内容的绝对地址,即分配到内部FLASH还是内部SRAM。(下一小节将以实例讲解)

  1. 系统存储器启动方式

当芯片上电后采样到BOOT0引脚为高电平,BOOT1为低电平时,内核将从系统存储器的0x1FFF0000及0x1FFF0004获取MSP及PC值进行自举。系统存储器是一段特殊的空间,用户不能访问,ST公司在芯片出厂前就在系统存储器中固化了一段代码。因而使用系统存储器启动方式时,内核会执行该代码,该代码运行时,会为ISP提供支持(In System Program),如检测USART1/3、CAN2及USB通讯接口传输过来的信息,并根据这些信息更新自己内部FLASH的内容,达到升级产品应用程序的目的,因此这种启动方式也称为ISP启动方式。

results matching ""

    No results matching ""