一、存储器及存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程称为存储器映射,如果再分配一个地址就叫重映射(具体地址分配参考芯片数据手册及中文参考手册)。
二、寄存器及寄存器映射
(一)寄存器
通过给有特定功能的内存单元起一个别名,这个别名就是我们所说的寄存器。换句话说,寄存器就是一些有特定功能的内存单元。
(二)寄存器映射
给已经分配好地址的有特定功能的内存单元起别名的过程就叫寄存器映射。
(三)访问STM32寄存器
访问STM32寄存器也就是操作STM32的内存单元,根据C语言指针的特点,可以使用指针来操作STM32的内存单元。
以GPIO外设为例
要让STM32的GPIOC的第0管脚输出低电平。
首先我们要知道GPIOC挂接在哪个总线上,需要知道其地址,STM32总线地址如下:
所以使用C语言宏可以定义外设基地址:
#define PERIPH_BASE ((unsigned int)0x40000000)
然后分别定义APB2总线基地址:
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
然后还需要知道端口外设地址,同样使用C语言宏定义其端口地址:
# define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
有了外设端口地址后,还需要知道GPIOC端口的寄存器地址,如图:
同样使用C语言宏定义其端口寄存器地址:
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
寄存器具体的功能可以参考STM32F1芯片手册。
控制 GPIOC 引脚 0 输出低电平(即通过BSRR 寄存器的 BR0 置 1)
GPIOC_BSRR = (0x01<<(16+0));
控制 GPIOC 引脚 0 输出高电平(即通过BSRR 寄存器的 BS0 置 1)
GPIOC_BSRR = 0x01<<0;
读取GPIOC端口所有引脚的电平(读 IDR 寄存器)
unsigned int temp;
temp = GPIOC_IDR;