【新手小白的嵌入式学习之路】-STM32的学习_GPIO 8种模式学习心得
GPIO 8种模式学习心得
- 前言
- GPIO的简介
- 输出驱动器
- 推挽输出
- 开漏输出
- 输入驱动器
前言
之前我一直跟着江科大学习标准库函数控制STM32,最近换个口味学习用HAL库控制STM32,发现了一个宝藏up主:keysking,两位博主可谓是我学习嵌入式的b站导师!
经过这一阵子的持续学习,对于GPIO八种模式也有了一些理解,像是在迷雾里摸到了一点光亮,所以迫不及待的来记录一下!(声明:里面的图都是我截自两个博主的视频,无商业用途,只为了记录学习!)
上面这个是STM32芯片其中一个GPIO端口的结构图,乍一看很复杂,仔细一看还是很复杂。我一开始连GPIO是什么我都不知道,更别说看懂这个结构图。
GPIO口就是芯片的部分引脚,如下所示:
GPIO的简介
- GPIO全称(General Purpose Input Output),译为通用输入输出口
- 可配置为8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
- GPIO端口的8种输入输出模式:
对于标准库函数的GPIO的配置
STM32CubeIDE的HAL库的GPIO配置(我的理解):
- GPIO_Input 输入模式
- Pull up 上拉输入
- Pull down 上拉输入
- No pull up and pull down 浮空输入
- GPIO_Output 输出模式
- Output Push Pull 推挽输出
- Output Open Drain 开漏输出
- GPIO_Analog 模拟模式
如图GPIO的结构主要分为输入驱动器和输出驱动器,对应输入和输出的两种模式。
输出驱动器
由上图,输出控制模块控制P-MOS和N-MOS(MOS可简化理解为两个被控制的开关),VDD对应3.3v的高电平,VSS对应0v的低电压,STM32的输出分为推挽输出和开漏输出。
为了方便理解这两种输出模式,举几个例子:
推挽输出
假设我们此时在I/O引脚连接一个普通小灯,小灯另一端接地,工作电压为3.3v,我们使用推挽输出模式。
- 需要I/O口输出高电平:我们通常使用函数修改寄存器,使输出控制模块控制P-MOS关闭和N-MOS断开,此时I/O口输出高电平,灯泡亮起。
- 需要I/O口输出低电平:同理,我们使用函数修改寄存器,使输出控制模块控制P-MOS断开和N-MOS闭合,此时I/O口输出低电平,灯泡熄灭。
总结一下:推挽输出模式下,通过函数修改寄存器的值从而使输出控制模块控制P-MOS和N-MOS的状态,达到输出高电平或低电平。
开漏输出
冷知识,开漏输出模式下,只有N-MOS工作,P-MOS一直处于断开状态,我查了资料,原因:
假设我们此时在I/O引脚连接一个普通小灯,小灯另一端接地,工作电压为5v,由于推挽输出模式驱动不了5v,所以我们使用开漏输出。
- 需要I/O口输出高电平:N-MOS断开,整个I/O口内部处于高阻态(或者“断路”),小灯不会亮。
- 需要I/O口输出低电平:N-MOS闭合,I/O口与VSS相连,小灯也不会亮。
倘若此时我们将小灯的另一端接一个5v的电源,那么I/O口输出高电平小灯不亮,I/O口输出低电平小灯就亮了,此时开漏输出也能控制小灯亮灭了。
综上,推挽输出靠芯片内部电压驱动小灯,而开漏输出并没有驱动能力,需要依靠外部电压驱动。
输出控制模块分别由函数控制寄存器以及片上外设直接控制的·,前者是推挽输出和开漏输出,后者是复用推挽和复用开漏输出。
输入驱动器
由上图,外部输入自I/O口引脚进入,首先经过一对上拉下拉电阻,所以上拉输入就是启用上面的电阻,下拉输入启用下面的电阻,浮空输入两个电阻都不启用,然后经过一个TTl肖特基触发器(模电学的施密特触发器),这里复习下原理:改造比较器形成两个参考电压,高于高参考电压的为高电平,低于低参考电压的为低电平,将模拟信号转为数字信号,经施密特触发器处理的电平信号被写入输入数据寄存器,由函数读取高低电平。
这里还有个模拟输入,即直接读取外部的电压值,复用功能的输入与输入数据寄存器可以同时对经施密特触发器处理的电平信号进行读取,所以也不存在复用上拉下拉输入。
此时再看文章前面的八种模式,就有不一样的体会了。
以上就是我的一些学习记录,欢迎大家一起讨论学习!