写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
本文写于:2025.04.01
STM32开发板学习——第5节: [3-1]GPIO输出
- 前言
- 开发板说明
- 引用
- 解答和科普
- 一、GPIO输出
- 二、外部电路介绍
- 问题
- 总结
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
原理图如下
1、开发板原理图
2、STM32F103C6和51对比
3、STM32F103C6核心板
视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。
下图是实物图
引用
【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
数据手册
解答和科普
第一部分主要学习GPIO的输出,第二部分主要学习GPIO的输入
C语言的知识:结构体、指针、枚举
对MOS管的理解
MOS管的管脚有三个:源极S(source)、栅极G(Gate)和漏极(Drain),但是实际工程应用中,经常无法区分PMOS管和NMOS管、各管脚的位置以及它们各自导通的条件。
MOS管有两种:一个是PMOS管,一个是NMOS管;PMOS管就是positive管,是积极的管,而NMOS管是negative管,是消极的管。积极的管就是顺应潮流,顺势而为;消极的管就是违背趋势,逆流而上。
很显然,电流从源极(输入端)到漏极(输出端),那就是顺势而为,因为源极就是源头嘛,因此这种管就是PMOS管;而电流要是从漏极(输入端)到源极(输出端),那就是逆流而上,是NMOS管。
N沟道还是P沟道与寄生二极管方向如何判定
N沟道MOS还是P沟道MOS:
箭头指向G极的是N沟道
箭头背向G极的是P沟道
寄生二极管方向:
不论N沟道还是P沟道MOS管,中间衬底箭头方向和寄生二极管的箭头方向总是一致的:
要么都由S指向D,要么都有D指向S
MOS管的连接方式
MOS管应用电压的极性和我们普通的晶体三极管相同,N沟道的类似NPN晶体三极管,漏极D接正极,源极S接负极,栅极G正电压时导电沟道建立,N沟道MOS管开始工作。
同样P道的类似PNP晶体三极管,漏极D接负极,源极S接正极,栅极G负电压时,导电沟道建立,P沟道MOS管开始工作。
导通特性
NMOS是栅极高电平(|VGS| > Vt)导通,低电平断开,可用来控制与地之间的导通。
PMOS是栅极低电平(|VGS| > Vt)导通,高电平断开,可用来控制与电源之间的导通。
NMOS的特性,Vgs大于一定的值就会导通,适合用于源极接地时的情况(低端驱动),只要栅极电压达到4V或10V就可以了。
PMOS的特性,Vgs小于一定的值就会导通,适合用于源极接VCC时的情况(高端驱动)。但是,虽然PMOS可以很方便地用作高端驱动,但由于导通电阻大,价格贵,替换种类少等原因,在高端驱动中,通常还是使用NMOS。
MOS开关管损失
不管是NMOS还是PMOS,导通后都有导通电阻存在,这样电流就会在这个电阻上消耗能量,这部分消耗的能量叫做导通损耗。选择导通电阻小的MOS管会减小导通损耗。现在的小功率MOS管导通电阻一般在几十毫欧左右,几毫欧的也有。
MOS在导通和截止的时候,一定不是在瞬间完成的。MOS两端的电压有一个下降的过程,流过的电流有一个上升的过程,在这段时间内,MOS管的损失是电压和电流的乘积,叫做开关损失。通常开关损失比导通损失大得多,而且开关频率越高,损失也越大。
导通瞬间电压和电流的乘积很大,造成的损失也就很大。缩短开关时间,可以减小每次导通时的损失;降低开关频率,可以减小单位时间内的开关次数。这两种办法都可以减小开关损失。
MOS管驱动
跟双极性晶体管相比,一般认为使MOS管导通不需要电流,只要GS电压高于一定的值,就可以了。这个很容易做到,但是,我们还需要速度。
在MOS管的结构中可以看到,在GS,GD之间存在寄生电容,而MOS管的驱动,实际上就是对电容的充放电。如果有兴趣,可以在mos的G级串一个电流表,看电流的变化。对电容的充电需要一个电流,因为对电容充电瞬间可以把电容看成短路,所以瞬间电流会比较大。选择/设计MOS管驱动时第一要注意的是可提供瞬间短路电流的大小。
第二注意的是,普遍用于高端驱动的NMOS,导通时需要是栅极电压大于源极电压。而高端驱动的MOS管导通时源极电压与漏极电压(VCC)相同,所以这时栅极电压要比VCC大4V或10V。如果在同一个系统里,要得到比VCC大的电压,就要专门的升压电路了。很多马达驱动器都集成了电荷泵,要注意的是应该选择合适的外接电容,以得到足够的短路电流去驱动MOS管。
记忆技巧:
1.交叉的线最多的是源极;
2.栅极也就是门(gate),既然是门,就具有控制的职能。
3.无论是PMOS管还是NMOS管,二极管的方向正好与输入输出的方向是相反的
4.无论是PMOS管还是NMOS管,栅源极箭头的方向正好与二极管的方向相同
5.无论是PMOS管还是NMOS管,我们只需要比较G极电压与S极电压大小关系就可以判断MOS管能不能导通
6.对于PMOS管来说,电流是从源极(输入端)到漏极(输出端),从上到下,各节点电平应该是依次变小的,因此栅极G的电压必须小于源极电压;换句话说,当UGS<0时,PMOS管才导通。
7.对于NMOS管来说,电流是从漏极(输入端)到源极(输出端),从下到上,各节点电平应该是依次变小的,因此栅极G的电压必须大于源极电压;换句话说,当UGS>0时,NMOS管才导通。
引用
原文链接:
一、GPIO输出
STM32是32位的单片机,所以STM32内部的寄存器都是32位的,但是端口只有16位,所以这个寄存器只有低16位对应的有端口,高16位没有用到。
1、VDD 3.3V,VSS地,保护二极管,可以保护电路。
2、上拉电阻至VDD,下拉电阻至VSS,这个开关是可以通过程序进行配置的,上拉输入模式:上面导通,下面关断;下拉输入模式:上面断开,下面导通;两个都断开就浮空输入模式。为了给输入提供一个默认的输入电平的。
如果什么都不接,这时输入就会处于一种浮空的状态,引脚的输入电平极易受外界干扰而改变,受到一点扰动就会变化,为了避免引脚悬空导致的输入数据不确定,我们就需要在这里加上上拉或者下拉电阻了,如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平,所以上拉输入又可以称作默认高电平的输入模式,下拉也是同理,就是默认低电平的输入方式。
上面导通,下面断开,就是上拉输入模式;
下面导通,上面断开,就是下拉输入模式;
两个都断开,就是浮空输入模式;
这个是为了给输入提供一个默认的输入电平的,因为对于一个数字的端口,输入不是高电平就是低电平,那如果输入引脚什么也不接,那到底是高电平还是低电平呢?
这是输入就会处于一种浮空的状态,引脚的输入电平极易受到外界干扰而改变,它的位置是不确定的,收到一点扰动就会变化,为了避免引脚悬空导致的输入数据不确定,我们就需要在这里加上上拉或者下拉电阻了。
如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平,所以上拉电阻输入又可以称作是默认为高电平的输入模式。
下拉也是同理,就是默认为低电平的输入方式。
电阻都较大,是一种弱上拉合弱下拉,目的是尽量不影响正常的输入操作。
3、施密特触发器:就是对输入电压进行整形的,它的执行逻辑是,如果输入电压大于某一阈值,输出就会瞬间升为高电平,如果输入电压小于某一阈值,输出就会瞬间降为低电平。
施密特触发器:执行逻辑是,如果输入电压大于某一阀值,输出就会瞬间升为高电平,如果输入电压小于某一阀值,输出就会瞬间降为低电平。
如果没有施密特触发器,那很有可能因为干扰导致误判
所以输出仍然是稳定的。直到下次阈值上限。输出才会变成高。阈值之间有距离,可以有效地避兔因信号波动造成的输出抖动现象。
4、其中有模拟输入。这个是连接到ADC上的。因为AD(需要接收模拟量),所以这根线是接到施密特触发器前面的。
5、另一个是复用功能输入。这个是莲接到其他需要读取端口的外设上的,比如串口的输入引脚等。这根线接收的是数字量,所以在施密特触发器后面。
7、输出部分
数字部分可以由输出数据寄存器或片上外设控制,两种控制方式通过这个数据选择器接到了输出控制部分,如果选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了。
左边还有一个位设置/清除寄存器,这个可以用来单独操作输出数据寄存器的某一位,而不影响其他位。因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制其中某一个端口而不影响其它端口的话,就需要一些特殊的操作方式,第一种方武是先读出这个寄存器。然后用按位与和按位或的方式更改某位,最后再将更改后的数据写回去。在C语言中就是&=和|=的操作。
第二种方式是通过设置这个位设置和位清除寄存器, 自动将输出数据寄存器中对应位置为1。而剩下写0的位则保持不变。
如果想对某一应进行清0的操作。就在位清除寄存器的对应位写1即可。
第三种方式是:就是读写STM32中的 “位带”区域,51的位寻址,在STM32中。专门分配的有一段地址区域。这段地址映射了RAM和外设寄存器所有的位,读与这段地址中的数据。就相当于读写所映射位置的某─位。
本次主要是第二种。
8、两个MOS管:
我们的信号来控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS.在这里可以选择推挽、开漏或关闭三种输入方式。
推挽输出
在推挽输出模式下,P-MOS和N-MOS均有效,
数据寄存器为1时,上管导通,下管关断,输出直接接到VDD,就是输出高电平
数据寄存器为1时,上管关断,下管导通,输出直接接到VDD,就是输出高电平
这种模武下。高低电平均有较强的驱动能力。所以推挽输出模式也可叫强推输出模武
在推挽输出模式下。STM32对IO口具有绝对的控制权。高低电平都由STM32说的算。
开漏输出
在开漏输出模式下,这个P-MOS使无效的,只有N-MOS在工作。
数据寄存器为1时。下管断开。这时输出相当于断开。也就是高阻模式
数据寄存器为0时。下管导通,输出直接接到VSS。也就是输出低电平,这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的。这个模式有什么用呢,这个开漏模式可以作为通信协议的驱动模式。比如I2C通信的引脚,就是使用的开漏模式。在多级通信的情况下,这个模式可以避免各个设备的互相干扰。另外开漏模式还可以又来输出5V的电平信号。比如在IO口外界一个上拉电阻到5V的电源。,当输出低电平时,有内部的N-MOS直接接到VSS.当输出高电平时,由外部的上拉电阻拉高至5V.这样就可以输出5V的电平信号,用于兼容一些5V电平的设备。这就是开漏输出的主要用途。
关闭;设置为输入模式是,两个管都无效,也就是输出关闭,端口的电平由外部信号来控制。
在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR读取IO状态。其中输人模式,可设置为上拉、下拉、浮空和模拟输入四种。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输人决定,一般接按键的时候用的是这个模式。模拟输入则用于ADC采集。
在输入模式下,输出驱动器是断开的,端口只能输入不能输出。这是因为一个端口只能有一个输出,但可以有多个输入。
这里输出是断开的,输入的施密特触发器也是关闭的无效状态,所以这些整个的GPIO都是没用的,只剩下模拟输入这条线,在施密特触发器前,所以当我们使用ADC的时候将引脚配置为模拟输出就行了,其他时候用不到。
如何P-MOS如果无效,就是开漏输出,如果P-MOS和N-MOS都有效,就是推挽输出
另外我们还可看到。在输出模式下。输入模式也是有效的。
在输入模式下,输出都是无效的。这是因为一个端口只能有一个输出,但可以有多个输入。除了模拟输入这个模式会关闭数字的输入功能,其他的7个模式,所有的输入都是有效的。
复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR无效;输入可用,通过输入数据寄存器可获取IO实际状态,但一般直接用外设的寄存器来获取该数据信号。
二、外部电路介绍
在单片机,都使用了高电平弱驱动,低电平的强驱动的规则,可以避免高低电平打架。
PNP 左边是基极,带箭头的是发射极,剩下的是集电极,基极给低电平,三极管就会导通。
另外注意一下。这个PNP的极管最好接在上边,NPN的三极管最好接在下。
这是因为三极管的通断。是需要发射极和基极直接产生一定的开启电压的。
如果你把负载接在发射极这边。可能会导致三极管不能开启。
问题
1、有那么一瞬间想学习模电。
2、挺复杂的。
总结
本节课主要学习了STM32的输出模式,学习了GPIO的结构,1保护二极管,2、PMOS和NMOS管,3、输出数据寄存器 4、复用功能输出 5、输入数据寄存器6、复用功能输入 7、模拟输入输出。还有GPIO的工作模式,输入模式(上拉/下拉/浮空/模拟),输出模式(推挽(常用:高电平和低电平都有较强的驱动能力)/开漏(线与上方MOS管不工作)),复用功能(推挽/开漏)。还有我们常用的电路硬件基础