目录
视角问题
片上外设
板级外设
GPIO是什么?
问题1:这里面的输入输出是什么?——高低电平
问题2:为什么要称作为通用?
GPIO引脚与域IO
GPIO外部引脚(stm32f103zet6)
从外部视角看引脚
GPIO和针脚(pin)的数量关系
GPIOA中一个硬件电路的位置和内部结构
I/O端口保护
二极管的说明
电源符号中VCC、VDD、VEE、VSS、VBAT的区别
端口钳位保护
编辑
GPIO的工作模式
输出模式
通用推挽输出(push-pull Output)
通用开漏输出(漏极输出开路)
复用推挽输出
复用开漏输出
GPIO寄存器
寄存器和GPIO的底层原理
寄存器的配置信息说明
点亮LED
配置步骤
点亮的原理
调用HAL库的原理
GPIO输出/输入速度的理解
视角问题
在讲GPIO之前,先建立一下宏观的认识——我们以怎样的视角去看GPIO?
片上外设
MCU的片上外设
MCU实物
在入门阶段说过,GPIO是在MCU的内部的,他是受到ARM CPU所控制的,那么在MCU内部的设备例如(GPIO、I2C、SPI等),这些我们统一称为核外外设或片上外设("片"是MCU)。
板级外设
板级外设就是在MCU外部的是用来配合我们完成特定功能或者项目需要所设定的。例如(LED灯,蜂鸣器和继电器,数码管等等)
总结:片上外设类似于控制器通过针脚和内部导线去控制板级外设工作,片上外设受ARM CPU(开发者)控制。
GPIO作为我本人在stm32学的第一个片上外设,建立一个视角问题尤为重要。
GPIO是什么?
GPIO的全称是general purpose input/out——通用输入/输出,在MCU内容用来做输入输出的控制电路。
问题1:这里面的输入输出是什么?——高低电平
输入输出高低电平是为了采集板级外设的信息和控制板级外设的目的。
为什么要输出?这些高低电平,在上层语言层解释就是0/1,在下层硬件外设角度,就会被视为MCU控制外设的手段,比如,输出高电平,会被LED解释为要求点亮LED,会被电机解释成为电机正转,会被串口接收方解释为传送1等等,输出低电平,则反之。
单片机的核心作用是“控制“, 控制相关外设,就必须先获取外设相关的数据,比如需要知道开关是否被闭合,传感器是否感受到数据变化,设备是否处于休眠等,然后根据外设状态数据变化,在通过输出,控制外设或者报告给用户等。
问题2:为什么要称作为通用?
顾名思义,就是可以让多个外设使用。
我们知道GPIO是用来输入输出高低电平的,如果MCU的其他外设都要输入输出高低电平,如果都单独设置的话就会增加复杂度,因此其他外设使用GPIO进行输入输出,这就是复用GPIO。
GPIO引脚与域IO
GPIO外部引脚(stm32f103zet6)
注意:针脚,引脚,管脚都是说MCU的金属针脚。可编程引脚,即普通引脚⼀共 112 个,分别是 PAx~PGx ,其中x是 [0, 15] ,每个分类是16个引脚。
从外部视角看引脚
我们前面提到了一个视角问题,这只是对总体外设的视角。下面是对GPIO的视角——GPIO是怎么和外围器件产生联系?
下面举两个输入输出的例子。
输入:采集信息
先说明:VDD可以看成是正极,GND是接地。
当按下按键,GPIO接地,他会接收到低电平。
松开按键,GPIO接正极,接收到高电平。
输出:控制外设
GPIO 输出低电平, VDD 反向导通,小灯泡点亮
GPIO 输出高电平,小灯泡左右电压⼀致, 没有电压差,就没有电流,小灯泡熄灭
注意:避免思维定式, GPIO 不⼀定输出高电平,就会“有效”,比如输出高电平,无法点亮
小灯泡⼀样。
总结:GPIO的输入是采集外设信息的过程,输出是控制外设的过程。
回到问题
MCU 芯片上的这些 GPIO 管脚又是怎么和外围器件产生关联的呢?
MCU 上面的引脚,通常会外接各种外设,比如:LED灯、按键,蜂鸣器, EEROM 等
等,而未来 MCU 内部会有对应的输⼊输出寄存器,向对应的寄存器写或者读取对应的寄
存器,就可以从引脚中输出高低电平,或者获取引脚高低电平。
GPIO和针脚(pin)的数量关系
MCU内部
可以看到MCU内部又A-G类型的GPIO引脚,这个引脚当中一组分为16个,A-G一共112个。
他和MCU外部的针脚是一一对应的关系,他在MCU外部所对应的就是PAx--PGx。
可以从原理图上面得到验证
1. 所有的 GPIO 控制器,都是挂接在 APB2 桥设备上的
2. 为了管理⼀个⼀个的 pin (引脚), MCU 把 pin 划分成为了组,叫做 GPIO Port ,
STM32F103ZET6 ⼀共 7 组,分别是 GPIOA~GPIOG
3. 每⼀个 GPIOX (X范围 [A-G] ), 都管理 [0, 15] 个 Pin
4. MCU 管理 GPIO Pin 的⽅式,是层状的,多叉树型结构
因此学习GPIO我们只需要把一组GPIO的一共针脚理解好,这非常关键。
GPIOA中一个硬件电路的位置和内部结构
GPIO的输入和输出的结构是不一样的。
当GPIO要输入的时候,会使用上部分的电路图,输出的时候使用下部分,输入和输出不能同时进行,他们是相互独立的。
I/O端口保护
二极管的说明
二极管是单向导电的电子元件,只允许电流从正极流进,负极流出,反之则阻断。
电源符号中VCC、VDD、VEE、VSS、VBAT的区别
| 符号 | 通俗理解 | STM32F103ZET6 |
|---|---|---|
| VCC | 接入电路/外设的电压(比如给传感器供5V) | STM32本身没有这个脚,它用来给外部模块供电 |
| VDD | 芯片内部自己用的工作电压 | 3.3V,必须稳定,所有VDD脚都要接 |
| VSS | 电路的公共地(0V) | 所有VSS脚都要接地 |
| VEE | 负电压供电(给运放等模拟电路用) | STM32项目极少用到,了解一下就行 |
| VBAT | 电池供电,主电源掉电时给RTC时钟和备份寄存器续命 | 接3V纽扣电池,或直接接VDD(没电池时) |
以上表述不是标准的,先了解。
端口钳位保护
自身压降:二极管虽然可以导通,但是他不是导线,他也有电阻,当二极管两边电压差超过了0.7V的时候,且是正进负出的,那么他就可以导通,那么这个允许二极管导通的电压差值就是自身压降。
上二极管:上方负极接了VDD=3V,自身压降是0.7V,如果输入电压>=4.0V,那么上方二极管就会导通,电流不会流进MCU,起到了保护电路的作用。
下二极管:下方负极接了VCC=0V,自身压降是0.7V,如果输入电压<=0.7V,那么下方二极管就会导通,电流不会流进MCU,起到了保护电路的作用。
电流为什么有负数的?
这个只是相对而言的负数,是为了限定流入MCU的范围是-0.7V—4.0V。
总结:目前处于入门阶段,不需要特别的清楚上面电路的具体原理和信息流,只需要知道,因为有了钳形保护二极管,就让GPIO输入输出合理的电压,进而形成了合理的电流,防止击穿MCU内部,起到了保护作用。
注意:其实偶尔的超范围电压进⼊ MCU 内部,不⼀定会击穿元器件,最担⼼的其实是持续的超
范围电压进人MCU,静电电压范围 ±2 kV ~ ±15 kV,不要轻易用手去触碰 MCU 针脚电压的正负,其实是规定出来的,最重要的其实是压差。
GPIO的工作模式
输出模式
| 通用输出(普通IO) | 复用输出(片上外设控制) | |
|---|---|---|
| 推挽输出 | 通用推挽输出GPIO_MODE_OUTPUT_PP | 复用推挽输出GPIO_MODE_AF_PP |
| 开漏输出 | 通用开漏输出GPIO_MODE_OUTPUT_OD | 复用开漏输出GPIO_MODE_AF_OD |
输入模式
| 通用输入(普通IO) | 复用输入(片上外设控制) | |
|---|---|---|
| 浮空输入 | 通用浮空输入GPIO_MODE_INPUT(默认) | 复用输入没有浮空/上拉/下拉之分 外设自动接管 |
| 上拉输入 | 通用上拉输入GPIO_MODE_INPUT_PULLUP | 同上,由外设决定 |
| 下拉输入 | 通用下拉输入GPIO_MODE_INPUT_PULLDOWN | 同上,由外设决定 |
| 模拟输入 | 通用模拟输入GPIO_MODE_ANALOG | 同上,由外设决定(ADC) |
先把GPIO8种输入输出先放出来,下面慢慢讲。
为什么会有这么的输入输出模式?
在说到GPIO为什么是通用的时候说过,GPIO除了给ARM CPU用之外,还会给其他片上外设使用,其他的片上外设的结构功能各不相同,因此为了匹配多种片上外设,就设置了多种工作模式,从而满足不同的片上外设的需求。
输出模式
这里先简单的说明一下上面的写器件的功能(简单了解)
输出数据寄存器:就是芯片内部那个“记性好”的小盒子,你告诉它一次要输高电平,它就一直记住,持续往外输出,直到你下次告诉它改。
复用器:GPIO到底是被ARM-CPU直接使用,还是被其他片上外设使用,达到复用效果,就由它说了算
输出控制电路:接收内部逻辑电平,直接驱动输出级MOS管的栅极,控制其通断,从而将弱信号转换为具有足够驱动能力的外部输出电平
P-MOS和N-MOS
MOS:全称Metal-Oxide-Semiconductor Field-Effect Transistor,金属氧化物半导体场效应管
P-MOS:P-channel Metal-Oxide-Semiconductor (P沟道金属氧化物半导体)
N-MOS:N-channel Metal-Oxide-Semiconductor(N沟道金属氧化物半导体)
P:positive, 积极的,正向的
N:negative, 消极的,负面的,反向的
P-MOS和N-MOS本质是一个开关
P-MOS的导通过程
当施加电压的时候,P-NOS会和箭头方向闭合,顺势而为,这样就是positive的表现,从而让电流导通。
N-MOS的导通过程
类比,施加电压和箭头方向相反,与之对抗,就是negative,逆流而上,就是这样。
P-MOS和N-MOS整体工作情况
通用推挽输出(push-pull Output)
通过ARM CPU的命令,通过输出数据寄存器和输出控制,施加不一样的电压,输出高电平,就会控制上方的P-MOS管导通,电流就会沿着上方的VDD流出针脚,输出高电平。
反之,走N-MOS管输出低电平。
注意:P-MOS和N-MOS他们两个不能同时闭合,否则两个开关的S相连,造成短路烧毁电路。
推挽模式下,向输出寄存器写 1/0 的本质:是让输出控制器选择 P-MOS ,还是 N-MOS ,进而
输出电压,打开指定 MOS 管。
通用开漏输出(漏极输出开路)
核心:去掉P-MOS
P-MOS去掉,但是N-MO保留的,输出0,那么他和通用推挽一样,输出低电平。
如果输出的是1,那么两边都是断开的,这样叫做输出高阻抗。
所谓高阻抗,只是⼀种说法,真实情况其实是MCU和外部针脚彻底断开,相当于开路了,或
者 N-MOS D处漏极和外部引脚互相悬空了
但是,针脚也会输出高电平,但是他不是再MCU内部提供的,而是外部,他是由公司提供的。
N-MOS断开了之后,他是通过上拉电阻上面的VCC供电,他在MCU的外部,因此,当不输出0的时候且外部由VCC的上拉电阻,那么他就可以输出高电平,就会让GPIO输出3.3V的高电平。
为什么GPIO会输出高电平——根据基尔霍夫电压定律,画一个回路能分析出来。
为什么需要上拉电阻?一旦N-MOS闭合的时候,GND和VCC直接相连造成短路。
说了两个输出模式——推挽和开漏,那么复用的推挽和开漏也不难理解,只需要理解复用就行,上面说过了,复用是给其他片上外设用的,其他的功能几乎一致。
复用推挽输出
复用开漏输出
GPIO寄存器
寄存器和GPIO的底层原理
上述说到,GPIOx(x:A-G),这个代表的是一组针脚,一组16个,有7组(A-G),对应到针脚上面就是Px0,那么每一组里面都有同一套寄存器,这一套寄存器就有如下。
GPIO经过输出控制,往内部走开始有寄存器,寄存器有多种:端口配置低寄存器,端口配置高寄存器,端口输入数据寄存器,端口输出数据寄存器,端口位设置/清除寄存器,端口位清除寄存器。
可以看成对GPIOx进行相关的控制,本质就是控制相关的寄存器。
注意:GPIOA的一组里面的16个针脚是由上述所说的寄存器共同控制的,而GPIOB,GPIOC.....不同组的16个针脚当中,他们各自也有一套自己单独使用的寄存器。
只用一组GPIOA为例子
寄存器的配置信息说明
端口输出数据寄存器——ODR
写引脚要输出的电平(你告诉芯片的),也用于读当前输出状态。
端口配置低/高寄存器
控制Px0~Px15的输入/输出模式 + 速度
只以个别寄存器为例子,说明一下。
点亮LED
利用了stm32CubeMax的配置,HAL库
配置步骤
以下步骤先了解一下就可以了,重点是后面的原理。
点文件新建文件
输入对应型号并选择
选择SYS,将Debug模式写入Serial Wire,开启调试功能
右方的图选择PF8,选择output
配置对应的GPIO
点亮的原理
现在想点亮LED4,就需要指定前后的通路的设备名,从单片机的原理图查找。
可见通用推挽和通用开漏要点亮就是让ARM CPU写入0。
自己写入HAL库的函数。
调用HAL库的原理
HAL库你可以理解为像C语言那样的一个库函数,没有stdio.h就不能用printf,scanf等接口,因此HAL库是给你调用想应的接口的,他是工程师提前写好的,而stm32cubemax就会自动根据你的配置的需求从你的HAL库的路径里面找到想应的函数。
GPIO输出/输入速度的理解
在数据手册上面可以看到的是,有三种速度,高速,中速,低速。
50MHz(快): ____|‾‾‾|____|‾‾‾|____ 10MHz(中): ___/‾‾\___/‾‾\___ 2MHz(慢): __/~~\__/~~\__| 速度配置 | 什么时候用 | 为什么 |
|---|---|---|
| 2MHz(低速) | 点LED、读按键、控制继电器、普通IO做状态指示 | 这些信号变化极慢(几Hz~几kHz),低速档完全够用,而且功耗低、干扰小 |
| 10MHz(中速) | I2C通信(标准模式100kHz/快速模式400kHz)、普通串口(115200bps) | I2C和串口频率不高,中速档足以胜任,且比高速档省电、辐射小 |
| 50MHz(高速) | SPI通信(几MHz~几十MHz)、SDIO、FSMC(驱动TFT彩屏) | 这些通信速度极快,必须用高速档,否则信号上升沿太慢,通信会出错 |
本篇博客结束,下篇博客带你理解总线(统一编址),同时到MCU内部去理解怎么去传值,传址还有输入模式。