1. 什么是寄存器
给有特定功能的内存单元取一个别名,这个别名就是常说的寄存器;
STM32F103C8T6 数据手册
数据手册第四节“Memory mapping”查看寄存器的地址;
中文参考手册
- 第2.3节“存储器映像”
- 第8.2节“GPIO寄存器描述”
1.1 存储器映射
存储区本身不具有地址信息,**它的地址是由芯片厂商或用户分配,给存储器分配地址的过程**成为存储器映射。
1.2 寄存器映射
通过绝对地址访问内存单元时,需对“地址”进行强制类型转换、更改类型为指针。
1 2
| *(unsigned int*)(0x40010C0C) = 0xFFFF
|
通过寄存器别名方式访问内存单元
1 2
| #define GPIOB_ODR (unsignedint*)(0x40010C0C) * GPIOB_ODR = 0xFF;
|
为方便操作,把指针操作“*****”也定义到寄存器别名里面
1 2
| #define GPIOB_ODR *(unsignedint*)(0x40010C0C) GPIOB_ODR = 0xFF;
|
外设从APB1总线开始
定义各个寄存器为结构体成员,每个端口的[基地址赋值给结构体](#1.5 使用结构体封装寄存器列表),
根据总线地址与偏移地址可以得到寄存器的绝对地址
1.3 GPIO端口置位/复位寄存器说明
(GPIOx BSRR)(x=A…E) 意为该寄存器名为“GPIOx BSRR”其中“x”可以为A-E,也就是说这个寄存器说明适用于GPIOA、GPIOB至GPIOE,这些GPIO端口都有这样的一个寄存器。
- 找到总线的基地址
- 加上某个外设的偏移地址,可找到某个外设的基地址
- 找到寄存器相对于外设基地址的偏移地址
- 用C语言的指针操作访问寄存器的绝对地址
1.4 总线和外设基址宏定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #define PERIPH_BASE ((unsigned int)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) #define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
#define GPIOB_CRL (GPIOB_BASE+0x00) #define GPIOB_CRH (GPIOB_BASE+0x04) #define GPIOB_IDR (GPIOB_BASE+0x08) #define GPIOB_ODR (GPIOB_BASE+0x0C) #define GPIOB_BSRR (GPIOB_BASE+0x10) #define GPIOB_BRR (GPIOB_BASE+0x14) #define GPIOB_LCKR (GPIOB_BASE+0x18)
|
1 2 3 4 5 6 7 8 9 10 11
| #define PERIPH_BASE ((sunsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOB_ODR *(unsignedint*)(GPIOB_BASE+0x0C)
GPIOB_ODR &= ~(1<<0);
GPIOB_ODR |=(1<<0);
|
1 2 3 4 5 6 7 8 9 10 11
|
GPIOB_ODR |= (1<<10);
GPIOB_ODR &= ~(1<<10);
|
运用“或”运算进行相加,
使得之前的位不会得到改变。
给第10位赋1,取反后,第10位为0其他位为1,
进行与运算,0&0=0,1&0=1,使其他位不变。
1.5 使用结构体封装寄存器列表
1 2 3 4 5 6 7 8 9 10 11 12 13
| typedef unsigned int uint32_t typedef unsigned short int uint16_t
typedef struct { uint32_t CRL uint32_t QRH uint32_t IDR uint32_t QDR uint32_t BSRR uint32_t LCKR }GPIO_TypeDef
|
1 2 3 4 5 6 7 8
| GPIO_TypeDef * GPIOx; GPIOx = GPIOB_BASE; GPIOx->IDR = 0xFFFF; GPIOx->ODR = 0xFFFF;
uint32_t temp temp = GPIOx->IDR;
|
1.6 定义GPIO端口基地址指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE) #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE) #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE) #define GPIOD ((GPIO_TypeDef *)GPIOD_BASE) #define GPIOE ((GPIO_TypeDef *)GPIOE_BASE) #define GPIOF ((GPIO_TypeDef *)GPIOF_BASE) #define GPIOG ((GPIO_TypeDef *)GPIOG_BASE) #define GPIOH ((GPIO_TypeDef *)GPIOH_BASE)
GPIOB->BASRR = 0xFFFF; GPIOB->CRL = 0xFFFF; GPIO->ODR = 0xFFFF;
uint32_t temp; temp = GPIOB->IDR;
GPIOA->BSRR = 0xFFFF; GPIOA->CRL = 0xFFFF; GPIOA->ODR = 0XFFFF;
uint32_t temp; temp = GPIOA->IDR
|
参考网站:
【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili
暂时就这样,持续更新ing...