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内核存储器映射设计。
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 FFFFBlock 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等的寄存器,他们存在于内核之中,不存在于内存,也没有内存地址。
在单片机中,寄存器也指内部特殊的内存,可以实现对单片机各个功能的控制。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引脚,可以选择不同的启动区域。
上电启动,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装在内存中,系统掉电,程序消失。
编译链接
待写……