目录
1.STM32的寻址范围?
2.存储器映射
3.存储器功能划分(以STM32F1为例)
4.寄存器映射
1.STM32的寻址范围?
1.32位单片机有32根地址线,每根地址线有两种状态,导通或者不导通。
2.单片机内存地址访问的存储单元是按字节编址的,而不是bit。
比如我们要访问0x01这个地址,访问的其实是一个字节的空间,而不是一个bit的空间。
地址线 | 地址编号 | 地址编号数 |
1 | 0,1 | 2 |
2 | 00,01,10,11 | 4 |
3 | 000,001,010,011,100,101,110,111 | 8 |
...... | .............. | ....... |
n | ....... | 2^n |
比如,现在有一根地址线,那么这一根地址线就有两种状态,导通或者不导通,就可以访问两个字节的地址空间,那么有两根地址线的话就有四种状态,两根都不导通,第一根导通第二根不导通,第一根不导通第二根导通,两个呢都导通,所以我们有n根地址线的话就有2的n次方种状态。
STM32寻址大小:2^32次方 = 4G(字节)
STM32寻址范围: 0x0000 0000 ~ 0xFFFF FFFF
2.存储器映射
存储器指的是可以存储数据的设备,存储器本身没有地址信息,对存储器分配地址的过程称为存储器映射。
地址范围:0~512K
映射1:0K~512K
映射2:1K~512K+1
映射3:100K~612K
映射4:512K~1024K
3.存储器功能划分(以STM32F1为例)
ST将2^32次方地址空间划分成8个块
存储块 | 功能 | 地址范围 |
Block 0 | Code(GLASH) | 0x0000 0000 ~ 0x1FFFF FFFF(512MB) |
Block 1 | SRAM | 0x2000 0000 ~ 0x3FFFF FFFF(512MB) |
Block 2 | 片上外设 | 0x4000 0000 ~ 0x5FFFF FFFF(512MB) |
Block 3 | FSMC Bank1&2 | 0x6000 0000 ~ 0x7FFFF FFFF(512MB) |
Block 4 | FSMC Bank3&4 | 0x8000 0000 ~ 0x9FFFF FFFF(512MB) |
Block 5 | FSMC寄存器 | 0xA000 0000 ~ 0xBFFFF FFFF(512MB) |
Block 6 | 保留 | 0xC000 0000 ~ 0xDFFFF FFFF(512MB) |
Block 7 | Cortex M3内部外设 | 0xE000 0000 ~ 0xFFFFF FFFF(512MB) |
我们重点学习前三个块,下面就介绍前三个块分别有什么内容,以及对应的地址是多少。
Block0 (FLASH) 功能划分:
存储块 | 功能 | 地址范围 |
Block 0 | FLASH或系统存储器别名区 | 0x0000 0000 ~ 0x0007 FFFF (512KB) |
保留 | 0x0008 0000 ~ 0x07FF FFFFc | |
用户FLASH,用于存储用户代码 | 0x0800 0000 ~ 0x0807 FFFF (512KB) | |
保留 | 0x0808 0000 ~ 0x1FFF FFFF | |
系统存储器,存储出厂Bootloader | 0x1FFF F000 ~ 0x1FFF F7FF (2KB) | |
选项字节,配置读保护等 | 0x1FFF F800 ~ 0x1FFF F80F (16B) | |
选项字节,配置读保护等 | 0x1FFF F810 ~ 0x1FFF FFFF |
Block 1 (SRAM) 功能划分:
存储块 | 功能 | 地址范围 |
Block 1 | SRAM | 0x2000 0000 ~ 0x2000 FFFF (64KB) |
保留 | 0x2001 0000 ~ 0x3FFF FFFF |
Block 2 (外设) 功能划分:
存储块 | 功能 | 地址范围 |
Block 2 | 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 |
4.寄存器映射
寄存器基础知识
寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制
简单来说:寄存器就是单片机内部的控制机构
STM32寄存器分类
大类 | 小类 | 说明 |
内核寄存器 | 内核相关寄存器 | 包含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等各种外设寄存器 |
寄存器映射(F1为例)
寄存器是特殊的寄存器,给寄存器地址命名的过程,就叫做寄存器映射
寄存器描述解读
摘自:STM32F10xxx参考手册_V10(中文版)
寄存器映射举例
直接操作寄存器
*(unsigned int *)(0x4001 080c) = 0XFFFF;
定义一个名字后再操作
#define GPIOA_ODR *(unsigned int *)(0x4001 080c)
GPIOA_ODR = 0XFFFF;
寄存器地址计算
为了方便编写代码及使用,我们将寄存器地址分为三个部分:
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 |
摘自:STM32F103xCDE数据手册
APB1总线基地址也叫外设基地址(PERIPH__BASE)
此表的偏移量:是相对外设基地址(PERIPH_BASE)来说的
参考资料:STM32F10xxx参考手册_V10(中文版).pdf 2.3小节
GPIO外设基地址偏移量
所属总线 | 外设 | 基地址 | 偏移量 |
APB2 0X4001 0000 | GPIOA | 0X4001 0800 | 0X800 |
GPIOB | 0X4001 0C00 | 0XC00 | |
GPIOC | 0X4001 1000 | 0X1000 | |
GPIOD | 0X4001 1400 | 0X1400 | |
GPIOE | 0X4001 1800 | 0X1800 | |
GPIOF | 0X4001 1C00 | 0X1C00 | |
GPIOG | 0X4001 2000 | 0X2000 |
此表的偏移量:是相对APB2外设基地址(APB2PERIPH_BASE)来说的
GPIOA外设基地址及偏移量
所属总线 | 所属外设 | 寄存器 | 地址 | 偏移量 |
APB2 0X4001 0000 | GPIOA 0X4001 0800 | GPIOA_CRL | 0X4001 0800 | 0X00 |
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 |
此表的偏移量:是相对GPIOA外设基地址(GPIOA_BASE)来说的
GPIOA_ODR寄存器地址计算过程:
1.获取外设挂载在哪个总线上面?查:系统结构图
2.获取总线基地址,APB2总线基地址:0X4001 0000
3.获取外设地址偏移量,GPIOA相对APB2总线偏移量是:0X800
4.获取寄存器地址偏移量,ODR相对GPIOA外设基地址的偏移量是:0X0C
寄存器地址=BUSBASEADDR+PERIPHOFFSET+REGOFFSET
GPIOA_ODR=0X4001 0000+0X800+0X0C=0X4001 080C
使用结构体,可以很方便的完成对寄存器的映射:
typedef struct
{
_IO uint32_t CRL;
_IO uint32_t CRH;
_IO uint32_t IDR;
_IO uint32_t ODR;
_IO uint32_t BSRR;
_IO uint32_t BRR;
_IO uint32_t LCKR;
}GPIO_TypeDef;
GPIOA_BASE: 0X4001 0800
#define GPIOA ((GPIO_Typedef*)GPIOA_BASE)
&GPIOA->CRL: 0X4001 0800
&GPIOA->CRL: 0X4001 0804
&GPIOA->CRL: 0X4001 0808
&GPIOA->CRL: 0X4001 080C
实际应用:
GPIOA->ODR = 0XFFFF;
//详见:stm32f103xe.h,725行开始
stm32f103xe.h主要组成部分
主要组成部分 | 说明 |
中断编号定义 | 定义IRQn_Type枚举类型,包含STM32F103内部所有中断编号(中断号),方便后续编写代码 |
外设寄存器结构体类型定义 | 以外设为单位,使用结构体类型定义每个外设所有寄存器,方便寄存器映射 |
寄存器映射 | 1.定义总线地址和外设基地址 文章来源:https://www.toymoban.com/news/detail-856174.html 2.使用外设结构体类型定义将外设基地址强制转换成结构体指针,完成寄存器映射文章来源地址https://www.toymoban.com/news/detail-856174.html |
寄存器位定义 | 定义外设寄存器每个功能位的位置及掩码 |
外设判定 | 判断某个外设是否合法(即是否存在该外设) |
到了这里,关于STM32存储器映射以及寄存器映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!