1、引入
俗称 “引脚”,芯片四周的那些银白色的线是从芯片内部引伸出来的,就是芯片的引脚。
它负责芯片内部的控制单元与外部相应外设的连接。
引脚其实本质上就是一根电线。
芯片:整个系统的核心,相当于人类的大脑,会提供引脚与外部电路相连。
引脚拥有输入/输出功能,比如:
1)引脚可以输入/输出一个电平信号(1/0)
这个电平信号是对于CPU来说的,因为CPU只能识别 0/1
2)引脚可以输入/输出一个高低电压。
因为对于外部电路来说,外部电路的工作是采用的模拟电信号(电压值)。
单片机最小系统组成:
CPU + 供电电路 + 晶振电路 + 复位电路
一个完整的系统的组成:
单片机最小系统组成 + 项目所需要的其它硬件(外设)
2、STM32F4xx GPIO内部结构
GPIO配置功能如下:
(1) 输入功能
CPU可以获取该GPIO口的对应的外部电路输入的一个电平状态。
a. 输入悬空(Input Floating):不接上拉电阻,也不接下拉电阻
上拉电阻:经过一个小阻值的电阻,接入到VDD(VCC)
下拉电阻:经过一个小阻值的电阻,接入到VSS(GND)
每一个GPIO内部都有一个上拉电阻和下拉电阻可以供用户选择。
悬空:就是逻辑器件的输入引脚内部,既不接上拉电阻也不接下拉电阻
IO引脚的电平状态完全由外部电路输入所决定,此时CPU可以通过读取数据的操作获知外部电路的工作状态。
b. 带上拉的输入(Input pull-up):通过上拉电阻,接入VCC
此时,IO引脚没有外部输入信号时,CPU也能获取到一个高电平。
唯有在外部电路输入低电平的时候,CPU才能读取到一个低电平。
c. 带下拉的输入(Input pull-down):通过下拉电阻,接入GND
此时,IO引脚没有外部输入信号时,CPU也能获取到一个低电平。
唯有在外部电路输入高电平的时候,CPU才能读取到一个高电平。
d. 模拟输入(Input Analog)
该引脚被设置为模拟输入时,能够获取到模拟信号,通过AD转化为数字量。
(2) 输出功能
CPU可以往该GPIO口输出一个电平状态。
a. 输出推挽(PP)
CPU可以向外部电路输出高电平也可以输出低电平。
b. 输出开漏(OD)
不输出电平。
CPU写0时,引脚接地。
CPU写1时,悬空(如果用户接了上拉电阻,则CPU在写1的时候,IO口会接到用户的上拉电阻上去)。
(3) 复用功能(AF:Alternate Function)
复用功能是指GPIO口用户其它的外设功能口线。
如: I2C/USART/SPI等。
每一个GPIO口都可以配置成多达16种复用功能。
3. STM32F4xx GPIO引脚简介
GPIO: General Purpose Input Output 通用功能输入输出
GPIO就是从芯片内部印出来的一根功能可以复用的电线。
STM32F4xx 共有144个GPIO引脚。
分为9组,记为GPIOA/GPIOB....GPIOI,简写PA/PB/PC...PI
每组的引脚数量为16个,编号0~15
比如GPIOA:
GPIOA0 PA0
GPIOA1 PA1
...
GPIOA15 PA15
这些GPIO口如果用户想使用他们,就必须先配置他们。
这些GPIO口的功能都有独立的寄存器组来配置他们。
边界地址:指寄存器组的起始地址(基址)和结束地址
外设:该寄存器组对应的硬件控制器
总线:该硬件控制器所处的系统时钟总线。
任何一个硬件控制器想要正常工作的话,都必须实现开启(使能)时钟。而总线就是给硬件控制器提供时钟用的。
4、STM32F4xx GPIO寄存器说明
每个通用 I/O 端口包括
1)4 个 32 位配置寄存器
GPIOx_MODER: 功能模式选择寄存器
偏移地址:0x00
基址 + 偏移地址 = 寄存器地址
比如:GPIOF_MODER 的地址 0x4002 1400 + 0x00
该寄存器用来控制GPIOx(x = A/B/C...I)组的16个GPIO引脚的模式(模式:输入/输出/复用/模拟)
每一个GPIO口占用2个bit,编号为y(y=0...15)的GPIO引脚在该寄存器中的bit位为:GPIOF_MODER[2y+1:2y]
其具体的配置如下:
GPIOF_MODER[2y+1:2y] 模式
00 输入模式
01 通用输出模式
10 复用功能模式
11 模拟模式
GPIOx_OTYPER: Output Type Register 输出类型选择寄存器
偏移地址:0x04
该寄存器用来配置GPIOx(x=A/B...I)组的16个GPIO引脚的输出类型。
每一个GPIO引脚占1个bit,编号为y(y=0..15)的GPIO引脚在该寄存器中的bit位为: GPIOx_OTYPER[y]
其具体的配置如下:
GPIOx_OTYPER[y] 输出类型
1 输出开漏
0 输出推挽
GPIOx_OSPEEDR: 端口输出速度寄存器
偏移地址:0x08
该寄存器用来配置GPIOx(x=A/B...I)组的16个GPIO引脚的输出速率。
每一个GPIO引脚占2个bit,编号为y(y=0..15)的GPIO引脚在该寄存器中的bit位为:GPIOx_OSPEEDR[2y + 1:2y]
其具体的配置如下:
GPIOx_OSPEEDR[2y + 1:2y] 速率
00 2 MHz(低速)
01 25 MHz(中速)
10 50 MHz(快速) <-------主要用的
11 30 pF 时为 100 MHz(高速)(15 pF 时为 80 MHz 输出(最大速度))
GPIOx_PUPDR: 端口上拉/下拉寄存器
偏移地址:0x0C
该寄存器用来配置GPIOx(x=A/B...I)组的16个GPIO引脚的上下拉电阻选择。
每一个GPIO引脚占2个bit,编号为y(y=0..15)的GPIO引脚在该寄存器中的bit位为:GPIOx_PUPDR[2y + 1:2y]
其具体的配置如下:
GPIOx_PUPDR[2y + 1:2y] 上下拉选择
00 无上拉或下拉
01 上拉
10 下拉
11 保留
2)2 个 32 位数据寄存器
GPIOx_IDR: 端口输入数据寄存器
偏移地址:0x10
该寄存器用来表示GPIOx(x=A/B...I)组的16个GPIO引脚的输入电平值。
每一个GPIO引脚占1个bit。该寄存器中,位31:16是保留的,位15:0表示x组的16个GPIO引脚的输入电平。
GPIOx_IDR[0] --> GPIOx0的输入电平状态
GPIOx_ODR: 端口输出数据寄存器
偏移地址:0x14
该寄存器用来表示GPIOx(x=A/B…I)组的16个GPIO引脚的输出电平值。
每一个GPIO引脚占1个bit。该寄存器中,位31:16是保留的,位15:0表示x组的16个GPIO引脚的输出电平值。
3)1 个 32 位置位/复位寄存器
GPIOx_BSRR: 端口置位/复位寄存器
偏移地址:0x18
Bit Set 置位 bit置1
Bit Reset 复位 bit置0
该寄存器用来表示GPIOx(x=A/B...I)组的16个GPIO引脚的输出电平值。
其中:
bit31:16为端口复位寄存器
bit15:0为端口置位寄存器
写1有效,写0无效
将GPIOx_BSRR[31:16]置1,表示将GPIOx15~GPIOx0设置为0
将GPIOx_BSRR[15:0]置1,表示将GPIOx15~GPIOx0设置为1
4)1 个 32 位锁定寄存
GPIOx_LCKR: 端口配置锁定寄存器
5)2 个 32 位复用功能选择寄存
GPIOx_AFRH: 复用功能低位寄存器
偏移地址:0x20
GPIOx_AFRL: 复用功能高位寄存器
偏移地址:0x24
GPIOx_AFRH 和 GPIOx_AFRL 两个寄存器是放在一起使用的。
GPIO引脚编号为0~7的引脚的复用功能由GPIOx_AFRL进行配置。
5、STM32F4xx GPIO时钟的使能
-
根据上述寄存器,就可以实现对所有基于GPIO能够完成的功能配置啦。
但是,硬件控制器想要工作,必须要使能时钟
–> 所有的GPIO分组都是处于AHB1时钟总线上
时钟相关的配置,RCC:Reset Clock Control 复位时钟控制。
基址:0x40023800
目的:使能GPIOF组的时钟RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR) 偏移地址:0x30 此寄存器第0位到第8位分别控制GPIOA到GPIOI组时钟的使能,比如: 使能GPIOF组的时钟 RCC_AHB1ENR[5] --> 1
总结:
GPIO使用流程:
a. 使能GPIO分组的时钟(RCC_AHB1ENR)
b. 配置GPIO
1) 配置GPIO功能模式(GPIOx_MODER)
2) 配置GPIO输出类型(GPIOx_OTYPER)
3) 配置输出速率(GPIOx_OSPEEDR)
4) 配置上下拉的选择(GPIOx_PUPDR)
c. 如果配置成了输入模式,则通过GPIOx_IDR可以获取外部电路的工作电平啦。
如果配置成了输出模式,则通过GPIOx_ODR或者GPIOx_BSRR就可以向外部电路输出电平啦。
如果配置成了复用模式,则看复用的是什么功能。