1.STM32的寻址范围
需要清楚:
- 32位的单片机可以有32根地址线(每根地址线有两种状态:导通或者不导通)
- 单片机内存地址访问的存储单元是按字节编址的(而不是bit)
例如,通过内存编号访问内存地址
而不是通过地址访问内存空间,里面只有一个bit。
再例如:
STM32寻址大小:2^32 = 4G (字节)
STM32寻址范围:0x0000 0000 ~ 0xFFFF FFFF
2.存储器映射
存储器指可以存储数据的设备,本身没有地址信息,对存储器分配地址的过程称为存储器映射
2.1 存储器功能划分
ST将所有的存储器及外设资源都映射在一个4GB的地址空间上(8个块)。其中Block0和Block1以及Block2都是使用重点。
3.寄存器映射
寄存器是单片机内部的控制机构,可以实现对单片机各个功能的控制
3.1寄存器分类
3.2寄存器映射
寄存器是特殊的存储器,给寄存器地址命名的过程,就叫寄存器映射。
主要包括3个步骤:
- 外设寄存器结构体类型定义
- 外设基地址定义
- 寄存器映射(通过将外设基地址强制转换为外设结构体类型指针即可)
例如,对STM32F103内部GPIOA~GPIOG的寄存器映射,就包括两个核心知识点:
- 结构体地址自增;
- 地址强制转换;
在定义GPIO_TypeDef结构体类型时,其成员包括:CRL、CRH等,每个成员是uint32_t类型,也就是4个字节,假设CRL地址是0的话,CRH就是0x04,依次递增。
以GPIOB为例,GPIOB外设的基地址为:GPIOB_BASE(0X4001 0C00),使用GPIO_TypeDef将该地址强制转换为GPIO结构体类型指针:GPIOB。
所以,GPIOB->CRL的地址:GPIOB_BASE(0X4001 0C00),
GPIOB->CRH的地址:GPIOB_BASE + 0X04
3.3寄存器地址计算
把寄存器地址分为三个部分:
- 总线基地址(BUS_BASE_ADDR)
- 外设基于总线基地址的偏移量(PERIPH_OFFSET)
- 寄存器相对外设基地址的偏移量(PEG_OFFSET)
寄存器地址 = 1+2+3