STM32的存储器和寄存器映射
一.存储器映射
存储器指可以存储数据的设备,本身没有地址信息,对存储器分配地址的过程称为存储器映射
![](https://i-blog.csdnimg.cn/blog_migrate/a2eb1eb87c0038961dd044921924039b.png)
19根地址线:2的19次方 = 512个地址
16根数据线:16bit = 1kb ,所以1MB数据
1.1存储器功能划分
ST将4GB(2^32)地址空间分成8个块
存储块 | 功能 | 地址范围 |
Block 0 | Code(FLASH) | 0x0000 0000 ~ 0x1FFF FFFF(512MB) |
Block 1 | SRAM | 0x2000 0000 ~ 0x3FFF FFFF(512MB) |
Block 2 | 片上外设 | 0x4000 0000 ~ 0x5FFF FFFF(512MB) |
Block 3 | FSMC Bank1&2 | 0x6000 0000 ~ 0x7FFF FFFF(512MB) |
Block 4 | FSMC Bank3&4 | 0x8000 0000 ~ 0x9FFF FFFF(512MB) |
Block 5 | FSMC寄存器 | 0xA000 0000 ~ 0xBFFF FFFF(512MB) |
Block 6 | 没用到 | 0xC000 0000 ~ 0xDFFF FFFF(512MB) |
Block 7 | Cortex M3内部外设 | 0xE000 0000 ~ 0xFFFF FFFF(512MB) |
1.1.1Block0功能划分
功能 | 地址范围 |
FLASH或系统存储器别名区 | 0X0000 0000 ~ 0x0007 FFFF(512KB) |
保留 | 0X0008 0000 ~ 0x07FF FFFF |
用户FLASH,用于存储用户代码 | 0X0800 0000 ~ 0x0807 FFFF(512KB) |
保留 | 0X0808 0000 ~ 0x1FFF EFFF |
系统存储器,存储出厂Bootloader | 0X1FFF F000 ~ 0X1FFF F7FF(2KB) |
选项字节,配置读保护等 | 0X1FFF F800 ~ 0X1FFF F80F(16B) |
保留 | 0X1FFF F810 ~ 0X1FFF FFFF |
1.1.2Block1(SRAM)功能划分
存储块 | 功能 | 地址范围 |
Block 1 | SRAM | 0X2000 0000 ~ 0x2000 FFFF(64KB) |
保留 | 0X2001 0000 ~ 0x3FFF FFFF |
1.1.3Block2(外设)功能划分
功能 | 地址范围 |
APB1总线外设 | 0X4000 0000 ~ 0x4000 77FF |
保留 | 0X4000 7800 ~ 0x4000 FFFF |
APB2总线外设 | 0X4001 0000 ~ 0x4000 3FFF |
保留 | 0X4001 4000 ~ 0x4001 7FFF |
AHB总线外设 | 0X4001 8000 ~ 0x4002 33FF |
保留 | 0X4002 3400 ~ 0x5FFF FFFF |
二.寄存器映射
寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制
简单来说:寄存器就是单片机内部的控制机构
2.1寄存器的分类
大类 | 小类 | 说明 |
内核寄存器 | 内核相关寄存器 | 包含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等各种外设寄存器 |
2.2寄存器的映射
寄存器是特殊的存储器,给寄存器地址命名的过程,就叫寄存器映射
![](https://i-blog.csdnimg.cn/blog_migrate/f3b0f2a4c860863668c41739a8babae5.png)
2.3寄存器描述解读
![](https://i-blog.csdnimg.cn/blog_migrate/76ac13179850695f1963428d9ec7dbdc.png)
① 寄存器名字
② 偏移量及复位值
③ 寄存器位表
④ 位功能描述
2.4寄存器映射
**#define GPIOA_ODR (unsigned int )(0x4001 080C)
GPIOA_ODR = 0XFFFF;
2.5寄存器地址计算
为了方便编写代码及使用,我们将寄存器地址分为三个部分:
1、总线基地址(BUS_BASE_ADDR)
2,外设基于总线基地址的偏移量(PERIPH_OFFSET)
3,寄存器相对外设基地址的偏移量(REG_OFFSET)
寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET
总线 | 基地址 | 偏移量 |
APB1 | 0X4000 0000 | 0 |
APB2 | 0X4001 0000 | 0X1 0000 |
AHB | 0X4001 8000 | 0X1 8000 |
APB1总线的基地址,也叫外设基地址(PERIPH_BASE)此表的偏移量:是相对外设基地址(PERIPH_BASE)来说的
GPIO外设基地址及偏移量
所属总线 | 外设 | 基地址 | 偏移量 |
APB2 | GPIOA | 0X4001 0800 | 0X800 |
0X4001 0000 | GPIOB | 0X4001 0C00 | 0XC00 |
GPIOC | 0X4001 1000 | 0X1000 | |
GPIOD | 0X4001 1400 | 0X1400 | |
GPIOE | 0X4001 1800 | 0X1800 | |
GPIOF | 0X4001 1C00 | 0X1C00 | |
GPIOG | 0X4001 2000 | 0X2000 |
GPIOA外设基地址及偏移量
所属总线 | 所属外设 | 寄存器 | 地址 | 偏移量 |
APB2 | GPIOA | GPIOA_CRL | 0X4001 0800 | 0X00 |
0X4001 0000 | 0X4001 0800 | GPIOA_CRH | 0X4001 0804 | 0X04 |
GPIOA_IDR | 0X4001 0808 | 0X08 | ||
GPIOA_ODR | 0X4001 080C | 0X0C | ||
GPIOA_BSRR | 0X4001 0810 | 0X10 | ||
GPIOA_BRR | 0X4001 0814 | 0X14 | ||
GPIOA_LCKR | 0X4001 0818 | 0X18 |