这次小编带来的是一些嵌入式基础理论概念,若有不正确的地方,欢迎一起探讨。
1.GPIO的基础知识
1.1GPIO的基本概念
1.1.1 GPIO是什么
GPIO即General Purpose Input/output,通用输入输出出口。是MCU的一个 内部结构,用来做输入输出的控制电路。
输入输出的本质就是输入输出高低电平,更严谨的来说就是可软件配置的外部引脚电路。从而达到获取外设信息,控制外设的目的。
输入的原因:这些高低电平,在上层语言层解释就是0/1,在下层硬件外设角度,就会被视为MCU控制外设的手段。
输出的原因:单片机的核心作用是“控制”,控制相关外设,就必须先获取外设相关的数据,然后根据外设状态数据变化,再通过输出控制外设或者报告给用户等。
复用GPIO:同一个物理引脚,通过多路选择器 MUX 切换控制权,交给片上外设(UART、SPI、I2C、PWM、CAN 等)接管,不再由 GPIO 寄存器控制高低电平。
需要复用GPIO的原因:引脚数量有限;减轻CPU负担。
1.1.2 GPIO Port与Pin的概念
Port:端口的意思,Port原意为“港口”,在计算机科学中引申为“数据交换的入口或出口”,现代微控制器(eg.STM32)继承了这一概念,将这一组GPIO引脚称为“GPIO Port”(eg.GPIOA,GPIOB),因为他们本质上是芯片与外部世界的“数据交换接口”。
Pin:就是引脚的意思。
之所以称为“GPIO Port”而不是“GPIO Group”是因为Group只能体现分组概念,体现不出来数据交换概念。Port在计算机领域,就有数据交换的概念之分。
1.1.3 GPIOA,GPIOB,GPIOC等端口
每组GPIO是一个独立外设,有自己的寄存器,每组端口最多包含16哥引脚:Px0~Px15(x=A/B/C/D...)
GPIOA、GPIOB、GPIOC 在存储器上映射到不同的基地址,所以操作 GPIOB 不会影响 GPIOA。
1.1.4 PA0,PA1,PB0等引脚编号
含义:PAx:Port A,第 x 号引脚,属于 GPIOA 端口;
PBx:Port B,第 x 号引脚,属于 GPIOB 端口;
PCx:Port C,第 x 号引脚,属于 GPIOC 端口;
逻辑引脚名(PA0、PB0):软件、原理图上用的名字,和寄存器对应。
芯片物理引脚号(Pin1、Pin2…):芯片封装上的引脚序号,和 PA0 没有数字上的对应关系。
PA0、PA1、PB0 是端口 + 组内序号的逻辑引脚名称,用来把代码里的寄存器位和芯片硬件引脚对应起来。
1.1.5 GPIO与MCU芯片引脚的对应关系
PA0/PA1/PB0 是逻辑引脚名;逻辑引脚通过芯片内部金属走线,固定连接到芯片封装上的物理引脚(Pin),这个映射关系由芯片厂商定义,写在芯片数据手册的引脚表中。
三层关系:软件层:GPIOA/GPIOB(端口外设),有一套寄存器;
逻辑引脚:PA0、PA1、PB0,对应端口寄存器的某一位;
硬件层:芯片物理引脚 Pin n,芯片外壳上的焊盘引脚;
GPIO并不是一个单独的“功能”,而是 MCU 与外部世界进行数字信号交互的基础接口。
1.2GPIO的内部结构
1. 2.1输入通道
引脚外部电平 → 保护二极管 → 上拉 / 下拉电阻 →施密特触发器(把模拟电平整形为标准数字 0/1) → 输入数据寄存器 IDR
施密特触发器:消除电平抖动,防止噪声误判高低电平。
1.2.2输出通道
输出数据寄存器 ODR(或者复用外设信号) → 输出驱动电路(PMOS+NMOS 管) → 芯片外部引脚。
1.2.3输入数据寄存器 IDR(GPIOx_IDR)
只读寄存器
每一位对应一个引脚:bit0 对应 PA0
作用:读取引脚当前外部电平,高电平读 1,低电平读 0。
IDR 反映的是芯片引脚上真实电平,不是 ODR 的值。
1.2.4输出数据寄存器 ODR(GPIOx_ODR)
可读写寄存器
写 1:让引脚输出高;写 0:让引脚输出低。
写 ODR 只是设置输出电平,最终引脚电平还要看输出驱动电路。
1.2.5上拉电阻 / 下拉电阻(片内)
由寄存器 PUPDR 控制开关:
上拉电阻:接通后,引脚默认被拉到 VCC。引脚悬空时电平为高。
下拉电阻:接通后,引脚默认被拉到 GND。引脚悬空时电平为低。
关闭:浮空(高阻态),悬空引脚电平不确定,容易受干扰。
1.2.6输出驱动电路(PMOS + NMOS 两个 MOS 管)
两种模式:
推挽输出:PMOS 和 NMOS 配合。输出高时 PMOS 导通;输出低时 NMOS 导通。驱动能力强,适合驱动 LED。
开漏输出:只使用 NMOS,PMOS 永远断开。输出 1 时引脚高阻;输出 0 时拉低。适合 I2C 这类总线。
1.2.7复用功能
GPIO 引脚可以把控制权交给片上外设(USART、SPI、TIM、ADC):
复用输出:引脚不再受 ODR 控制,由外设输出信号(如串口 TX)
复用输入:外部信号送入外设(串口 RX)
配置 MODER 为复用模式,再通过 AFR 寄存器选择具体复用功能。
2.GPIO的工作模式
2.1输出模式
通用,就是通常使用,指的是ARM-CPU直接控制GPIO输出。
复用,就是重复使用,指的是MCU内部的片上外设,复用GPIO进行输入输出。
复用器是从多组输入信号中,选择一个作为有效输入。GPIO到底是被ARM-CPU直接使用,还是被其他片上外设使用,达到复用效果,就有他说了算。
输出控制电路:接受内部逻辑电平,直接驱动输出级MOS管的栅极,控制其通断,从而将弱信号转换为具有足够驱动能力的外部输出电平。
补充:要理解GPIO输出先要理解P-MOS和N-MOS。
MOS:MOSFET,金属氧化物半导体场效应管。
P-MOS:P沟道金属氧化物半导体。
N-MOS:N沟道金属氧化物半导体。
P-MOS和N-MOS的本质是一个开关。
2.1.1通用推挽输出
核心思想:交替闭合或者开启P-MOS和N-MOS即可。
输出数据寄存器写1,闭合P-MOS,断开N-MOS,输出高电平。
输出数据寄存器写0,断开P-MOS,闭合N-MOS,输出低电平。
本质是交替闭合断开,P-MOS和N-MOS开关,让外部引脚接入VDD或者接地,进而对外呈现出高电压和低电压,然后因为电路通路,形成有输出电流(推)和吸收(挽)电流的效果。
2.1.2通用开漏输出
核心思想:去掉P-MOS,让P-MOS永远关闭。
在开漏模式下,MCU针对特定引脚的输出,都是该引脚对应的N-MOS的漏记输出。
向输出数据寄存器写1,最终表示的是N-MOS断开。
向输出数据寄存器写0,表示N-MOS管闭合。
输出数据寄存器写0,N-MOS闭合,输低电平;
输出数据寄存器写1,N-MOS断开,输出高阻抗;所谓高阻抗,就是MCU和外部针脚彻底断开,相当于开路,或者N-MOS D漏极和外部引脚互相悬空。
开漏模式,输出只能输出低电平和高阻抗,无法输出高电平。
2.1.3复用推挽输出
核心思想:引脚输出控制权,从 GPIO 的 ODR 寄存器交给片上外设;输出驱动电路仍然是 PMOS+NMOS 推挽结构,高低电平都具备强驱动能力。
2.1.4复用开漏输出
核心思想:引脚输出控制权交给片上外设,不再受 ODR 寄存器控制;输出驱动采用开漏结构,输出低电平时导通拉低,输出高电平时为高阻态。
2.2输入模式
2.2.1浮空输入
断开下拉电阻开关,断开上拉电阻开关。
2.2.2上拉输入
闭合上拉电阻开关,断开下拉电阻开关。
开关在MCU内部,可以通过MCU提供的配置寄存器选择闭合还是断开某一个开关。
2.2.3下拉输入
闭合下拉电阻开关,断开上拉电阻开关。
2.2.4模拟输入
关闭该引脚的数字输入输出电路(施密特触发器、上下拉电阻、输出驱动全部关闭),把外部连续变化的模拟电压直接送入 ADC 模数转换模块,用来采集电压信号。
以上就是小编本期带来的内容。若有不当之处,欢迎指正。