STM32 — 3.1 GPIO输出

GPIO简介

  • GPIO(General Purpose Input Output)通用输入输出口,可配置为8种输入输出模式

  • 引脚电平:0V~3.3V,部分引脚可容忍5V【容忍5V意思是可以在这个端口输入5V,但是输出只有3.3V,因为输入电压只有3.3V,哪些可以输入5V看前面的表】

  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入【光敏电阻模块等】、ADC电压采集、模拟通信协议接收数据等

GPIO基本结构

APB2外设总线,STM32所有的IO都挂载在APB2总线上,见下图

其中,GPIO外设的名称是按照GPIOAGPIOBGPIOC来命名的

每个GPIO有16个引脚(PB0-PB15为例,编号为0 - 15)

STM32因为是32位机,其内部的寄存器都是32位的,寄存器的每一位对应一个引脚,但是端口只有16位,所以端口寄存器只有低16位有数值,高16位无效

每个GPIO模块,主要包含了寄存器驱动器这些东西

寄存器 :内核可以通过APB2总线寄存器进行读写

其中:

输出寄存器写1,对应的引脚就会输出高电平;写0,对应的引脚就会输出低电平;

输入寄存器读取为1,就证明对应的端口目前是高电平,读取为0,说明目前的端口为低电平

驱动器:增大驱动能力,寄存器只负责存储数据

如果需要进行点灯这要的操作的话,还是需要驱动器来增大驱动能力

GPIO位结构

自左到右分别是:

寄存器、驱动器、IO引脚

上面为输入部分、下面是输出部分

输入部分:

1、IO引脚接的保护二极管的用途【两个二极管】:对输入电压进行限幅

当输入电压超过VDD的时候,上面的二极管导通,电流会流入VDD,而不会流入IO口内部结构;

当输入电压小于VSS的时候,也就是负电压,电流会通过VSS来提供,而不会向IO口内部汲取电流。

此结构作用为保护内部结构,如果输入电压在0-3.3之间,那么2个二极管都不会导通,对电路就没有影响

VDD为3.3V,防止过高与负电压的电压对内部电路造成损坏【容忍5V的保护二极管,上面要改成5V,不然会触发保护,在后面会提到】

2、上面的开关电路:用于配置 上拉 / 下拉 输入模式

给输入一个固定的数值,避免浮空,这里的电阻阻值很大,尽量不影响电路工作,是一种弱上拉/下拉)

开关可以由软件控制,上面导通就是上拉,下面导通就是下拉,都断开就是浮空输入。

3、施密特触发器(这里错写成了肖特基)作用:

对输入电压进行整形,当

输入大于高限电压的时候,就瞬间输出高电平;

输入小于低限电压的时候,就瞬间输出低电平【对输入信号进行整形】。

模拟输入: ADC端口使用,因为ADC需要接收模拟量,所以不用经过施密特触发器整形

复用功能输入: 接到其他外设,例如串口接收等,这根线接收数字量,所以在施密特触发器后面

输出部分:

输出部分可以由输出数据寄存器或者片上外设控制,通过数据选择器,进入输出控制部分;

如果选择输出数据寄存器进行输出,那么就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某一个端口了

左边的位设置 / 清除寄存器:

用于控制某一个单独的端口,而不影响其他端口。

因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制某一个端口而不影响其他端口的话,需要一些特殊的操作方式:【库函数中用的是第二种方式】

1、先读出这个寄存器,然后按位与和按位或的方式更改某一位,最后再把修改过的数写回去,就是&=和|=,这个方法比较麻烦,效率不高

2、设置位设置/清除寄存器,如果我们要对某一位进行置1的操作,在位设置寄存器里面对应位写1就行,剩下不需要操作的位写0,这样它内部就会有电路,自动将输出数据寄存器中对应位写1,而剩下的位数据不变,这样就做到了,只操作某一位而不影响其他位,并且是一步到位的操作

如果想对某一位进行清0的操作,就在位清除寄存器的对应位写1即可,这样内部电路就会自动把那一位清0

3、读写STM32中的位带(良子?大胃袋?)区域,这个位带的作用和51中的位寻址差不多,在STM32中,专门分配了有一段地址区域,这段地址区域映射了RAM和外设寄存器的所有位,读写这段地址中的数据,就是读写所映射的某一位【就是直接操作内存了】

输出控制:

我们的输出信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS,这里可以选择推挽开漏关闭三种输出模式

1、推挽:P-MOS与N-MOS均有效,数据寄存器为1,上管导通,IO口接到VDD;为0,下管导通,IO口接到VSS,高低电平都有驱动能力【也叫强推模式,高低电平都由STM32控制】

2、开漏:P-MOS无效【接到VDD的MOS管无效】,数据寄存器为1,下管上管都断开,这个时候相当于输出直接断开,也就是高阻模式;这种模式仅低电平有驱动能力,数据寄存器为0,IO接到VSS,正常。

可以用作通信协议中使用【IIC】,也可以做输出5V的操作,外部接一个上拉电阻到5V即可【外部的上拉电阻阻值要大一些,不然内部VSS拉不下来】

3、关闭:两个MOS管都无效,端口电平由外部控制

GPIO的8种工作模式:

通过配置GPIO的端口配置寄存器,上面说的位结构的电路就会根据我们的配置而进行改变

【比如开关的通断、NMOS和PMOS是否有效、数据选择器的选择等等】

端口可以配置成一下8种模式:

1、【数字输入】【区别就是上拉电阻和下拉电阻的连接】

  • (1)浮空输入:数字输入 可读取引脚电平,若引脚悬空,则电平不确定【端口不可以浮空,需要连接一个连续的输出源】【比如红外就可以浮空输入,几乎没关系】
  • (2)上拉输入:数字输入 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
  • (3)下拉输入:数字输入 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平

2、【模拟输入:从引脚直接接入片上外设】【只有这个模式数字输入是无效的】

  • (4)模拟输入:模拟输入 GPIO无效,引脚直接接入内部ADC

【输出断开,施密特触发器不工作,从引脚直接接入片上外设】

3、【数字输出口,开漏的高电平为高阻态,无驱动能力;推挽高电平有驱动能力】

  • (5)开漏输出:数字输出 可输出引脚电平,高电平为高阻态,低电平接VSS
  • (6)推挽输出:数字输出 可输出引脚电平,高电平接VDD,低电平接VSS

4、【复用的输出,引脚电平由外设控制而不是输出控制寄存器,如串口】

  • (7)复用开漏输出:数字输出 由片上外设控制,高电平为高阻态,低电平接VSS
  • (8)复用推挽输出:数字输出 由片上外设控制,高电平接VDD,低电平接VSS

GPIO寄存器描述

【不缩写就是:GPIOA_CRL、GPIOA_CRH、GPIOB_CRL、GPIOB_CRH...】

可以看出来,一个端口的状态,由4bit来配置,分别是CNFx [ 1 : 0 ]、MODEx [ 1 : 0 ]

前面的用来配置输入输出模式,后者用来配置输出速度

【IO口翻转速度,低功耗稳定性用的多,一般50MHZ即可】

由于一个GPIO有16个引脚,一个引脚用4bit,那么一共要64bit,所以,一个端口配置寄存器分为低和高两个

输入寄存器:可以读取IO口上的电平,只有低16位,高16位没有

高16位肯定没有,因为一个GPIO只有16个脚位

输出寄存器:直接控制输出的,高16位没有

【就是前面说的只支持所有位一起写的那个,不支持位操作的那个】

端口位设置 / 清除寄存器:用来做单个位设置的,高16位是位清除【写0】,低16位是位设置【写1】

【但是他的使用方法都是,把需要写0/1的IO口对应的bit,给写上1,其他不变的写0】

【有一个小疑问?如果给一个IO口同时给清除和设置,那会怎么样?,交给3刷去做】

端口位清除寄存器:这个寄存器和上面那个寄存器高16位的功能是一样的,为什么要有这个寄存器嘞?是为了方便操作用的,如果只是想单一的位设置/位清除,那么就用上一个寄存器的低16位,和这一个寄存器就可以了

端口锁定寄存器:是用来锁定寄存器中的值的,放置意外更改的,用的不多

LED和蜂鸣器介绍

LED:发光二极管,正向通电点亮,反向通电不亮【长脚/小片 - 正极;短脚/大片 - 负极】

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

硬件电路注意:

1、LED最好使用低使能【低电平导通】,因为很多芯片低电平驱动能力强【很多单片机都是高电平驱动能力弱,低电平驱动能力强,这样可以避免高低电平打架】,一般限流电阻都是要接的

2、三极管的左边是基级,带箭头的是发射极,剩下是集电极;三极管的负载最好接在集电极,因为三极管的通断,是需要在发射极和基极之间产生电压,如果把负载接在三极管的发射极,有可能导致三极管不能正常开启

相关推荐
学嵌入式的小杨同学2 小时前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
青桔柠薯片2 小时前
51单片机(STC89C52RC)学习总结:从裸机编程到外设驱动
嵌入式硬件·学习·51单片机
weiyvyy2 小时前
从开发视角看硬件接口:接口开发的本质与全景图
驱动开发·单片机·嵌入式硬件·硬件工程
老李的森林2 小时前
杂谈--如何与AI高效率的对话
人工智能·stm32·嵌入式硬件·机械
_Ningye3 小时前
STM32 —2.1 软件安装
stm32
weixin_462901974 小时前
esp32wifi的AP模式
单片机·嵌入式硬件
2501_918126914 小时前
学习所有6502写游戏动画的语句
汇编·嵌入式硬件·学习·程序人生·游戏
-Springer-4 小时前
STM32 学习 —— 个人学习笔记9-3(FlyMcu 串口下载)
笔记·stm32·学习
测试专家6 小时前
USB 3.0,USB速率
单片机·嵌入式硬件