🗒️从内存映射到STM32启动详解
00 分钟
2024-1-10
2024-1-10
type
status
date
slug
summary
tags
category
password
icon
在此之前,对STM32的启动大概限于不同的boot引脚启动区域不同,其他便如囫囵吞枣一般了。今天来从芯片到编译器来详细看看STM32的启动。
 

存储器映射

STM32MCU基本都基于Cortex-M系列,今天以F1系列Cortex-M3内核的MCU来看。从存储器的角度而言,可分为RAM(随机存储器)和ROM(只读存储器),也可以大致理解为内存和硬盘的关系,处理器需要从硬盘(ROM)中读取代码到RAM中,CPU再从RAM读取代码并运行。
ARM采用哈佛架构,相对于X86价格,ARM将外设寄存器看作内存的一部分,参与内存的统一编码。其外设寄存器也相当于内存地址,可以以访问内存的方式来操作外设寄存器。
对于Cortex-M而言,32位的内存空间为4GB。换算成字节地址而言,就是0X0000,0000~0XFFFF,FFFF。在其4GB的内存空间内,对内存储器进行了映射,将片内或片外的FLASH、RAM、外设寄存器、BOOTBLOCK等进行统一编址。其Cortex-M将存储器映射为8块,分别是代码、SRAM、外设、外部RAM、外部设备、专用外设总线-内部、专用外设总线-外部、特定厂商。其授权的芯片厂商需要按照Cortex-M内核存储器映射设计。
 
Cortex-M3存储器映射
Cortex-M3存储器映射
STM32存储器映射
STM32存储器映射
notion image
 
ST意法半导体根据其将存储器划分为8个块,每个块512MB内存空间,用于不同的用途,不同单片机的存储器映射有所不同,具体需要查阅响应的参考手册。
STM32F1xx存储器映射
存储块
功能
地址范围
Block 0
Code (Flash)
0x0000 0000 ~ 0x1FFF FFFF (512 MB)
Block 1
SRAM
0x2000 0000 ~ 0x3FFF FFFF (512 MB)
Block 2
片上外设
0x4000 0000 ~ 0x5FFF FFFF (512 MB)
Block 3
FSMC Bank1&2
0x6000 0000 ~ 0x7FFF FFFF (512 MB)
Block 4
FSMC Bank3&4
0x8000 0000 ~ 0x9FFF FFFF (512 MB)
Block 5
FSMC 寄存器
0xA000 0000 ~ 0xBFFF FFFF (512 MB)
Block 6
0xC000 0000 ~ 0xDFFF FFFF (512 MB)
Block 7
Cortex M3 内部外设
0xE000 0000 ~ 0xFFFF FFFF (512 MB)
Block 0
存储块
功能
地址范围
Block 0
FLASH 或系统存储器别名区
0x0000 0000 ~ 0x0007 FFFF (512 KB)
Block 0
保留
0x0008 0000 ~ 0x07FF FFFF
Block 0
用户 FLASH, 用于存储用户代码
0x0800 0000 ~ (0x0800 0000 + FLASH SIZE)
Block 0
保留
0x0808 0000 ~ 0x1FFF EFFF
Block 0
系统存储器, 存储出厂 Bootloader
0x1FFF F000 ~ 0x1FFF F7FF (2 KB)
Block 0
选项字节, 配置读保护等
0X1FFF F800 ~ 0x1FFF F80F (16 B)
Block 0
保留
0x1FFF F810 ~ 0x1FFF FFFF
Block 1 RAM块
存储块
功能
地址范围
Block 1
SRAM
0x2000 0000 ~ (0x2000 0000 + RAM SIZE)
保留
0x2001 0000 ~ 0x3FFF FFFF
Block 2 外设寄存器块
存储块
功能
地址范围
Block 2
APB1 总线外设
0x4000 0000 ~ 0x4000 77FF
Block 2
保留
0x4000 7800 ~ 0x4000 FFFF
Block 2
APB2 总线外设
0x4001 0000 ~ 0x4000 3FFF
Block 2
保留
0x4001 4000 ~ 0x4001 7FFF
Block 2
AHB 总线外设
0x4001 8000 ~ 0x4002 33FF
Block 2
保留
0x4002 3400 ~ 0x5FFF FFFF
 
狭义上的寄存器只包括内核相关R0~R15等的寄存器,他们存在于内核之中,不存在于内存,也没有内存地址。
Cortex-M3 R0~R15寄存器组 & 特殊功能寄存器组
Cortex-M3 R0~R15寄存器组 & 特殊功能寄存器组
在单片机中,寄存器也指内部特殊的内存,可以实现对单片机各个功能的控制。GPIO等外设本质上也是内存。
大类
小类
说明
内核寄存器
内核相关寄存器
包含 R0~R15, xPSR, 特殊功能寄存器等
内核寄存器
中断控制寄存器
包含 NVIC 和 SCB 相关寄存器, NVIC 有: ISER, ICER, ISPR, IP 等. SCB 有: VTOR, AIRCR, SCR 等
内核寄存器
SysTick 寄存器
包含 CTRL, LOAD, VAL 和 CALIB 四个寄存器
内核寄存器
内存保护寄存器
可选功能, STM32F103 没有
内核寄存器
调试系统寄存器
ETM, ITM, DWT, IPIU 等相关寄存器
外设寄存器
包含 GPIO, UART, IIC, SPI, TIM, DMA, ADC, DAC, RTC, I/WWDG, PWR, CAN, USB 等各种外设寄存器
 

启动配置

在STM32F10xx系列中,可以通过配置boot引脚,可以选择不同的启动区域。
notion image
 
Block 0
Block 0
上电启动,CPU从地址0x0000 0000开始执行,并从0X0000 0004指向的地址开始执行代码。根据不同的boot引脚,启动地址也有所不同。
从主闪存存储器Falsh memory区域启动,程序代码将从0x0800 0000开始,一般采用JTAG/SWO就是下载到Falsh 0x0800 0000中去。
从系统存储器启动,ST在生产时在其0x1FFF F000内嵌了自举程序,可以在不使用JTAG/SWO的情况下通过UART、CAN等通信接口将映像文件(hex,bin,elf) 下载到主存储器上去。
从内置SRAM中启动,程序将从0x2000 0000启动,其内部Falsh存在寿命问题,对于较小的程序可以烧录到SRAM中进行调试,但掉电后程序丢失。相当于将win10装在内存中,系统掉电,程序消失。
 
 

编译链接

待写……
 

评论
  • Twikoo
  • GitTalk