问题
什么是寄存器?
什么是存储器映射?
什么是寄存器映射?
STM32架构
程序存放在FLASH中。const的常量存放在FLASH中,变量(全局、静态变量)存放在SRAM中。
System总线主要读取寄存器。
AHB(高速)总线上挂着SDIO、复位和始终控制RCC,通过桥接又分出APB1(低速总线)和APB2(高速总线),两条总线分别挂着一些外设
FSMC用于驱动液晶屏
学习重点是AHB1、2上的外设
存储器映射
存储器本身不具有地址信息,给存储器分配地址的过程就成为存储器映射,再分配一个地址叫重映射。
寄存器映射
给有特定功能的内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
总线基地址(AHB、APB1、APB2)
基地址由首地址 + 相对外设基地址的偏移 = 其他寄存器的绝对地址
GPIOX基地址
GPIOB端口的寄存器列表
C语言对寄存器的封装(以GPIO外设为例)
/* 使用结构体封装寄存器列表 */
typedef unsigned int uint32_t; // 无符号32位变量
typedef unsigned short int uint16_t; /* 无符号16位变量
short = short int
= signed short int = 2Byte */
// GPIO 寄存器列表
typedef struct {
uint32_t CRL; // GPIO端口配置低寄存器 地址偏移:0x00
uint32_t ORH; // GPIO端口配置高寄存器 地址偏移:0x04
uint32_t IDR; // GPIO数据输入寄存器 地址偏移:0x08
uint32_t ODR; // GPIO数据输出寄存器 地址偏移:0x0C
uint32_t BSRR; // GPIO位设置/清楚寄存器 地址偏移:0x10
uint32_t BRR; // GPIO端口位清楚寄存器 地址偏移:0x14
uint32_t LCKR; // GPIO端口配置锁定寄存器 地址偏移:0x18
} GPIO_TypeDef;
/* --------------------------------------------------------------------*/
// 使用 GPIO_TypeDef 把地址强制转换成指针
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOA_BASE)
......(A-H)
// 使用定义好的宏直接访问
// 访问GPIOA端口的寄存器
GPIOA->BSRR = 0xFFFF;
GPIOA->CRL = 0xFFFF;
GPIOA->ODR = 0xFFFF;
uint32_t temp;
temp = GPIOA->IDR; // 读取 GPIO_IDR 寄存器的值到变量temp中
GPIO简介
基本框图
该图从最右端看起,最右端就是代表 STM32 芯片引出的 GPIO 引脚,其余部件都位于芯片内部。
框图详解可看《零死角玩转STM32——F103指南者》——第八章的GPIO简介
框图刨析——GPIO的八种工作模式
代码 8-1 GPIO 8 种工作模式
typedef enum
{
GPIO_Mode_AIN = 0x0, // 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
GPIO_Mode_IPD = 0x28, // 下拉输入
GPIO_Mode_IPU = 0x48, // 上拉输入
GPIO_Mode_Out_OD = 0x14, // 开漏输出
GPIO_Mode_Out_PP = 0x10, // 推挽输出
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
} GPIOMode_TypeDef;
输出模式——4种
-
推挽/开漏
在输出模式中,推挽模式时双 MOS 管以轮流方式工作,输出数据寄存器 GPIOx_ODR可控制 I/O 输出高低电平。开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O输出高阻态或低电平。输出速度可配置,有 2MHz\10MHz\50MHz 的选项。输出速度指 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。
在输出模式时,施密特触发器是打开的,即输入、输出可用,通过输入数据寄存器 GPIOx_IDR可读取 I/O 的实际状态。 -
复用功能(推挽/开漏)
复用功能模式中,输出使能,输出速度可配置,可工作在开漏或推挽模式,但是输出信号源于其它外设,输出数据寄存器 GPIOx_ODR 无效,输入可用。通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。通过对 GPIO 寄存器写入不同的参数,就可以改变 GPIO 的工作模式。
要了解具体寄存器时一定要查阅《STM32F10X-中文参考手册》 中对应外设的寄存器说明。在 GPIO 外设中,控制端口高低控制寄存器 CRH 和 CRL 可以配置每个 GPIO 的工作模式和工作的速度,每 4 个位控制一个 IO,CRH 控制端口的高八位,CRL 控制端口的低 8 位。
1. 推挽输出(Push-Pull,PP)
- 可以输出高低电平,用于连接数字器件。高电平由VDD(3.3V)决定,低电平由VSS(0V)决定。
- 推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候另外一个截止。优点:开关效率高、电流大、驱动能力强。
- 输出高电平时,电流输出到负载,叫灌电流,可以理解成推。输出低电平时,负载电流流向芯片,叫拉电流,即挽。
2. 开漏输出(Open-Drain,OD)
推挽输出是直接链接VDD(3.3V)和Vss(0V)进行输出,开漏输出则不同,它只连接了我们的Vss(0V),如果模式为开漏输出的话,正常情况他只能输出低电平,无法输出高电平。
- 正常情况只输出低电平。
- 如果要输出高电平,则需要外接上拉电阻。(该模式的好处是,高电平将会是Vcc的电压,是我们可以控制的电压,从而实现了电平转换的效果)
- 开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。
3. 复用推挽/开漏输出(Alternate Function,AF)
这两个放在一起,GPIO引脚除了作为输入/输出引脚使用外,还可以作为片上外设(USART、I2C、SPI等)专用引脚,即一个引脚可以有多种用途,但同一时刻一个引脚只能使用复用功能中的一个。当引脚设置为复用功能时,可选择复用推挽输出模式或复用开漏输出模式,在设置为复用开漏输出模式时,需要外接上拉电阻。
输入模式——4种(模拟/浮空/上拉/下拉)
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器 GPIOx_IDR读取 I/O 状态。其中输入模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用的是这个模式。模拟输入则用于 ADC 采集。
1. 上拉输入
外部没有信号传入时,默认为高电平,该模式的典型应用就是外接按键,当没有按键按下时,引脚为确定的高电平,当按键按下时,引脚电平被拉为低电平。
2. 下拉输入
外部没有信号传入时,默认为低电平。
3. 浮空输入
此时I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平,引脚就输入什么电平,芯片复位上电后,默认为浮空输入模式。
4. 模拟输入
引脚信号直接链接模拟输入,实现对外部信号的采集,可以收集0~Vss的电压值。
GPIO输出初始化顺序
- 选定具体的GPIO
- 配置GPIO工作模式(CRL和CRH寄存器)
- 控制GPIO输出高低电平(ODR、BRR和BSRR)