本文共 3144 字,大约阅读时间需要 10 分钟。
目录
GPIO是通用型输入输出的简称,简单的说其实就是STM32单片机额的可控制引脚STM32的GPIO引脚与外部设备连接起来,实现外部通信,控制以及数据采集的功能;GPIO被分为很多组,每组有16个引脚编号为0~15,例如STM32G030C8来说,引脚分为了GPIOA,GPIOB,GPIOC,GPIOD,GPIOF,以及其他引脚;所有的GPIO引脚都具备基本输入输出功能。
最基本的输出功能由STM32控制引脚输出高、低电平,实现开关控制;
最基本的输入功能是检测外部电平,通过引脚上电平的高低来确定按键是否被正常按下。
STM32芯片GPIO接口内部原理
注释:
I/O引脚:接收外部发出的信号或者向外部发出信号
保护二极管:
VDD:用来限制IO引脚输入或输出过高电压,当输入或输出电压过高时,保护二极管VDD则导通
VSS:同VDD,但是他的作用是当输入或输出电压过低时,保护二极管VSS导通
上下拉电阻:
当VDD开关处于闭合状态,VSS开关处于打开状态时,整个电路处于上拉输入状态
当VDD开关处于打开状态,VSS开关处于闭合状态时,整个电路处于下拉输入状态
当VDD开关处于打开状态,VSS开关处于打开状态时,整个电路处于浮空输入状态
通常情况下设置模拟输入模式或者复用功能输入模式,VDD开关和VSS开关均设置为打开状态
P-MOS、N_MOS:
P-MOS、N-MOS在这里用于控制输出状态,分别为开漏输出和推挽输出
当电路处于推挽输出状态时P-MOS、N-MOS均处于有效电路,且P-MOS 输出0时电路导通, N-MOS 输出1时导通,反之不成立
当电路处于开漏输出状态时P-MOS处于失效状态,且N-MOS输出1时处于导通状态
typedef enum { GPIO_Mode_AIN = 0x00, // 模拟输入 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;
在输入模式时,施密特触发器打开,输出被禁止,可以挺过输入数据寄存器GPIOx_IDR读取I/O状态,其中输入模式可以氛围上拉、下拉、浮空和模拟输入中,上下拉输入这里就不再解释了;所谓浮空输入就是指输入的电平是不确定的,完全由外部输入所决定,一般外接按键时使用的便是这种输入模式;模拟输入一般使用于ADC采集
输出模式状态下,可以使用输入模式进行输入,二者是不冲突的,在输出模式下,推挽模式时两个MOS管以轮流的方式进行工作,输出寄存器GPIOx_ODR可以控制I/O输出高低电平;当处于开漏模式下,只有N-MOS管处于工作状态输出数据寄存器可以控制I/O输出高阻态或低电平,输出速度可以配置为Low,Higth等四个选项,输出频度越高,则芯片的功耗越大
偏移地址:0x34
复位值:0x0000 0000
位[31,6]:复位值,必须保持最初始的值
第5位:GPIOFEN:IO端口F使能
第4位:GPIOFEN:IO端口E使能
第3位:GPIOFEN:IO端口D使能
第2位:GPIOFEN:IO端口C使能
第1位:GPIOFEN:IO端口B使能
第0位:GPIOFEN:IO端口A使能
注:这些位是用来设置和清空对应GPIO引脚的分组的
偏移地址: 0x00
复位值:
● 0x2800 0000 端口 A
● 0x0000 0000 其他口
位 2y+1:2y MODERy[1:0]: 端口 x 配置位 (y = 0..15)
这些位可由软件写来配置 I/O 口模式。
00: 输入模式 ( 复位状态 ) 01: 通用输出模式 10: 复用功能模式 11: 模拟模式
偏移地址:0x04
复位值: 0x0000 0000
位 31:16 保留,必须保持为复位值。
位 15:0 OTy[1:0]: 端口 x 的配置位 (y = 0..15) 这些位可由软件写来配置 I/O 口的输出类型。
0: 推挽输出 ( 复位状态 ) 1: 开漏输出
偏移地址:0x08
复位值: 0x0000 0000
位 2y+1:2y OSPEEDRy[1:0]: 端口 x 配置位 (y = 0..15) 、
这些位要由软件写来配置 I/O 口的速度。
x0: 低速 01: 中速 11: 高速
偏移地址:0x0C
复位值:
● 0x2400 0000 端口A
● 0x0000 0000 其它端口
位 2y+1:2y PUPDRy[1:0]: 端口 x 配置位 (y = 0..15) 这些位由软件写来配置 I/O 口的上拉或下拉。
00: 无上拉和下拉 01: 上拉 10: 下拉 11: 保留
偏移地址:0x10
复位值: 0x0000 XXXX (X 表明不定 )
位 31:16 保留,必须保持为复位值。
位 15:0 IDR[15:0]: 端口输入数据 这些位只读。
它们包含相应 I/O 口的输入值。
偏移地址:0x14
复位值: 0x0000 0000
位 31:16 保留,必须保持为复位值。
位 15:0 ODR[15:0]: 端口输出数据 这些位可由软件读写。
偏移地址:0x18
复位值: 0x0000 0000
位 31:16 BRy: 端口 x 复位位 y(y = 0..15) 这些位只写。读这些位时返回 0x0000 数值。
0: 对相应的 ODRx 位无影响 1: 复位相应的 ODRx 位
注: 若 BSx 和 BRx 同时设置 , BSx 有优先权。
位 15:0 BSy: 端口 x 设置位 y (y= 0..15) 这些位只写。读这些位时返回 0x0000 数值。
0: 对相应的 ODRx 位无影响 1: 置位相应的 ODRx 位
偏移地址:0x28
复位值: 0x0000 0000
位 31:16 保留 位 15:0 BRy: 端口 x 复位位 y (y= 0 .. 15) 这些位为只写位。
读这些位的返回值为 0x0000
0: 对相应的 ODRx 位无影响 1: 复位相应的 ODRx 位
转载地址:http://tbpowy.baihongyu.com/