GPIO简介
-
GPIO 通用输入输出口。即IO口
-
可配置8种输入输出模式
-
引脚电平 0v ~ 3.3v 部分引脚可以容忍5v
-
容忍5v 即 可在端口输入5v电压 但是只能输出3.3v 因为供电是3.3v
-
可以通过看引脚定义图 带FT的都是可以容忍5v
-
-
输出模式下 可以控制端口输出高低电平,用以驱动LED 控制蜂鸣器,模拟通信协议输出时序
-
输入模式下 可以读取端口的高低电平或者电压,用于读取按键输入,外接模块电平信号输入(eg 光敏电阻等),ADC电压采集,模拟通信协议接收数据
GPIO基本结构
-
GPIO是在APB2外设总线上的
-
GPIO命名方式 GPIOX (x 可以是 A -------)
-
每个GPIO都有16个引脚 分别是 PA0 ----PA15
-
每个GPIO中包含寄存器和驱动器
-
寄存器 特殊的存储器 内核可以通过APB2总线对寄存器进行读写 ---->完成输出电平读取电平的功能
-
寄存器的每一位对于一个引脚
-
输出寄存器 写1 表示输出高电平 写 0 表示 输出低电平
-
输入寄存器 读取为1 表示 当前端口是 高电平 反之
-
-
STM32是32位单片机,寄存器只有16位,所以只有低16位有数据
-
驱动器 是用来增加信号的驱动能力的,寄存器只负责存储数据
-
GPIO位结构![](/image/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvZGUxMmM2NWI2MzJkNDE0ZWE4MzA2OTMyMmUwZjQ2YzkucG5n)
-
对于保护二级管那块 VDD 3.3V VSS 0V
-
若输入电压大于 3.3V 则上方二极管导通 直接流入 VDD
-
若输入电压小于 0V 则下方二极管导通 直接导向 VSS
-
保护二极管---保护内部电路
-
-
上拉电阻/下拉电阻
-
这个电阻,阻值大 是弱下拉
-
给输入提供一个默认的输入电平
-
对一个数字端口,输入不是低电平就是高电平,如果输入引脚啥也不输入------ 则输入处于浮空状态-------输入处于浮空状态 引脚 输入的电平 极易受到外界干扰而改变
-
避免因处于浮空状态而导致输入数据不准确
-
接上拉电阻时,当浮空状态时,可保证引脚是高电平 ------上拉输入默认为是高电平输入方式
-
接下拉电阻时,当浮空状态时, 可保证引脚是低电平 ------下拉输入默认为是低电平输入方式
-
-
-
TLL肖特基触发器
-
对输入电压进行整形
-
执行逻辑:若输入电压大于某一阈值,输出瞬间升为高电压
若输入电压低于某一阈值, 输出瞬间升为低电压
-
有效避免因信号波动造成的输出抖动现象
-
-
位设置/清除寄存器 输出寄存器
-
位设置/清除寄存器 一次只能控制一位
-
输出寄存器 同时控制16个端口
-
-
想到单独控制某一个端口,而不影响到别的端口
-
方法1
先读出寄存器的值
通过按位与或者按位或进行更改
再将更改以后的写会
-
方法2
位设置/清除寄存器
-
方法3
读写STM32的位带区域(不太了解)
-
-
对于P-MOS 和N-MOS的理解
-
MOS管 ------电子开关
-
分为三种模式 推挽模式 开漏模式 关闭
-
推挽模式(又称强推输出模式)
-
P-MOS和N-MOS 都有效
-
当数据寄存器为1时 上导通下断开 VDD 输出高电平
-
当数据寄存器为0时 上断开下导通 VSS 输出低电平
-
-
开漏模式
-
P-MOS无效
-
当数据寄存器为1时 下断开 输出断开 (高阻模式)
-
当数据寄存器为0时 下导通 VSS 输出低电平
-
只有低电平有驱动能力,高电平没有驱动能力
-
开漏模式可以作为通信协议的驱动方式
-
开漏模式还可以输出5V的电平信号
-
IO口外接一个上拉电阻到5V的电源
-
输出低电平时 由N-MOS 直接到VSS
-
输出高电平5v时 由外部上拉电阻拉高至5v
-
-
-
关闭
-
当引脚配置为输入模式时
-
两个MOS管都无效
-
输出关闭,端口的电平由外部信号控制
-
-
-
-
GPIO的8种模式
通过配置GPIO的端口配置寄存
对于浮空输入
端口一定要接上一个连续的驱动元,不能够出现浮空的状态
对于模拟输入
ADC模数转换器的专属配置
输入浮空/上拉/下拉配置
区别🗣上拉电阻和下拉电阻地选择
🔈在输入模式下,输出寄存器为断开的,端口只能用来输入
模拟输入
🗣GPIO无效 引脚直接接入ADC
🔈在模拟输入模式下,TLL肖特基触发器 和输出寄存器都是断开的
开漏/推挽输出模式
🔈在输出模式下,输入模式也是有效的
因为一个端口 只能有一个输出,但是可以有多个输入
开漏输出模式下 高电平为高阻态 没有驱动能力
复合开漏/推挽输出
🗣引脚电平由片上外设控制
操作stm32的GPIO步骤
-
使用RCC开启GPIO的时钟
-
使用GPIO_Init函数初始化GPIO
-
使用输出或者输入的函数控制GPIO口