STM32芯片架构简图 STM32F10xx系统框图
一、什么叫存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址分配地址的过程就称为存储器映射。
分配地址后,会使用指针去操作内存地址。
二、什么是寄存器?
有特定功能的内存单元,通常我们会给这个特殊的内存单元取一个名字,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
三、什么叫重映射?
给存储器分配地址的过程叫存储器映射,在分配一个地址叫重映射。
四、通过寄存器访问访问内存单元的几种方式
1、通过绝对地址去访问
让GPIOB端口的16个引脚输出高电平,要怎么实现?
绝对地址=外设起始地址+寄存器偏移地址
比如现在我们要找GPIOB的绝对地址,可以查STM32芯片手册,可以看到起始地址为0x40010C00
然后再找到端口输出数据寄存器(ODR)的偏移地址
物理地址=0x40010C00 + 0x0C=0x40010C0C
要让16个引脚都输出高电平
*(unsigned int *)(0x40010C0C) = 0xFFFF;
2、通过寄存器别名的方式访问内存单元
#defined GPIOB_ODR (unsigned int *)(0x40010C0C) *GPIOB_ODR = 0xFF;
为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面
#define GPIOB_ODR *(unsigned int*)(0x40010C0C) GPIOB_ODR = 0xFF;
GPIOB_ODR & = ~(1<<0); // 让PB0输出低电平 GPIOB_ODR & |= (1<<0) // 让PB0输出高电平