type
slug
status
summary
icon
category
date
tags
password

GPIO输出

notion image
可容忍5V为输入最大可以5V,但输出最大为3.3V

GPIO结构

基本结构:总线,寄存器和驱动器
notion image
Q2:如何对应引脚和对应的时钟模块呢?比如GPIOA和PA5,GPIOC和PC10;
A2:GPIOA的第0号引脚,一般成为PA0,以此类推。
寄存器的每一位对应一个引脚,修改寄存器该位的值即修改该引脚的内容。输出写1输出高电平,写0输出低电平。输入寄存器读取为1,证明目前对应的端口为高电平,读取为0,端口为低电平。
STM32所以内部寄存器都是32位。
notion image
从左到右三部分:寄存器,驱动器,某个IO口引脚
上下两个部分:上面为输入部分,下面为输出部分。
输入部分:
notion image
两个保护二极管,对输入电压限伏。上面VDD:3.3V,下面VSS:0V。如果输入电压大于3.3V,那么上面的保护二极管被导通。输入电压产生的电压会直接流入VDD,而不会流入内部电路。
(同理电压低于VSS,电流也会流出而不流入内部电路。)
连接上下拉电阻:上拉电阻至VSS,下拉电阻至VSS。上通下断,为上拉输入模式;下通上断,为下拉输入模式。两个都断开,则为浮空输入模式。目的是为了给输入提供一个默认的输入电平,浮空输入的输入电平不稳定容易被改变。当引脚悬空时,还有上拉电阻来保证引脚的高电平。
—>上拉输入:默认为高电平的输入模式;下拉输入:默认为低电平的输入模式。
施密特触发器:对输入电压进行整型。输入电压大于某一阈值,输出会瞬间升为高电平。低于,输出会瞬间变为低电平。(高于上限/低于下限,输出才会产生变化)
波形写入输入数据寄存器,程序读取数据寄存器对应的某一位数据,便可知道端口的输入电平。一个模拟输入,接入ADC,需要模拟量,则在触发器前。复用功能输入,其他需要读取端口的外设上eg:串口的输入引脚,接受数字量,则在触发器后面。
notion image
输出部分:
notion image
输出数据寄存器/片上外设的复用功能输出。经过数据选择器,接入输出控制部分。位设置清除寄存器,可以用来单独操作数据寄存器的某一位而不影响其他位。因为输出寄存器同时控制16个端口,且这个寄存器只能整体读写。单独控制某一个端口而且其他端口不影响,第一种方式:读出输出数据寄存器,|=或者&=更改某一位,再写入。第二种方式:设置位设置和位清除寄存器。
然后接入了两个MOS管:P-MOS和N-MOS。信号来控制开关的导通和关闭,开关负责将IO口接到VSS或者VDD。推挽,开漏和关闭三种输出方式。
💡
推挽输出模式:P-MOS和N-MOS均有效。数据寄存器为1时,上通下断,输出接入VDD,输出高电平。数据寄存器为0时,上断下通,输出接入VSS,输出低电平。这种模式下的高低电平具有较强的驱动能力,所以又叫做强推输出模式。
开漏输出模式:P-MOS无效,只有N-MOS有效。数据寄存器为1时,下断,高阻模式。数据寄存器为0时,下通,输出直接接入VSS,输出低电平。只有低电平有驱动能力。可以作为通信协议的驱动方式egI2C。多机通信的时候,避免干扰。也可以输出5V的电压。IO口外接上拉电阻到5V电源。
关闭模式:两个MOS管都无效,输出关闭,端口电平由外部信号来控制。

GPIO模式

notion image
配置GPIO的端口寄存器—>位结构电路根据配置而改变eg:开关通断,MOS管是否有效,数据选择器的选择等。
notion image
上拉/下拉/浮空输入:区别上拉电阻/下拉电阻的连接
notion image
notion image
模拟输入:ADC模数转换器的专属配置。GPIO无效(输入关闭,触发器关闭)只有一根线有效,即直接从引脚接入片上外设ADC。
notion image
开漏/推挽输出:
notion image
notion image
区别在开漏输出的高电平为高阻态,没有驱动能力。推挽输出的高低输出电平都有驱动能力。
P-MOS和N-MOS都有效,推挽输出。只有N-MOS有效,开漏输出。
在输出模式下,输入模式也有效。(但在输入模式下,输出模式无效。因为一个端口只能有一个输出,但可以有多个输入)
notion image
notion image
输出部分,引脚的控制权转移给了片上外设,通用的输出无效。
输入部分,普通输入(接受电平信号)和片上外设(读取引脚电平)都是有效的。
除了模拟输入的模式中会关闭数字输入的功能,其他模式中所有的输入都是有效的。
notion image
notion image
notion image
notion image

LED、蜂鸣器、面包板介绍

notion image
长脚正极短脚负极。
内部:较小的一半是正极,较大的一半是负极
notion image
图一低电平驱动,图三高电平驱动。(区别在另一侧接什么为产生电势差,所以为什么驱动。)(限流电阻,防止LED因为电流过大而烧毁和调整LED的亮度)(如何选择,看电平的驱动能力。如果GPIO在推挽输出的模式下,高低电平平均具有较强的驱动能力,两种接法均可。如果是开漏输出模式,只有低电平具有较强的驱动能力,因此选择低电平驱动电路。)
图二图四蜂鸣器驱动电路。三极管开关驱动。图二PNP三极管驱动电路(三级管左边为基极,带箭头为发射级,剩下的为集电极。低电平三极管导通,3.3V和GND给蜂鸣器电流。最好接在上面,因为三极管的通断需要在发射极和基极产生开始电压)。图四NPN三极管驱动电路(逻辑相反)
notion image
每一列的五个孔内部连接。
上下四排孔用于供电。
 
eg:点亮小灯的接线
notion image
上面两排的供电引脚接上电源的正负极。一个跳线接入非电源控卫,纵向接入限流电阻,后纵向接入小灯,再纵向用跳线接入电源负极。
notion image
这样上下四排供电引脚就可以通过最小系统板来获取电源了。

程序一:LED闪烁

💡
使用RCC开启GPIO时钟
使用GPIO_Init()初始化GPIO
使用输出/输入函数控制GPIO口
rcc.h文件的最下面是所有库函数的声明。
最常用的三个函数:RCCAHB外设时钟控制,RCCAPB1和APB2的外设时钟控制。
notion image
notion image
notion image
也可根据所选参数是否出现在列表中来反向断定外设是否挂载在此总线上。
notion image
notion image
notion image
实现LED闪烁:
代码思路:LED点亮之后,延时一段时间,熄灭LED,然后延时一段时间,然后整个流程循环
箱子图标,添加组和文件
notion image
魔术棒按钮,添加新文件夹的头文件路径
notion image
notion image
同时可以验证:推挽输出和开漏输出
推挽输出:高、低电平均具有驱动能力
开漏输出:只有低电平具有驱动能力,高电平相当于高阻态,没有驱动能力。

程序二:LED流水灯

notion image
十六进制转化成二进制,即每个PIN对饮为每一位为1,从第0位开始。
GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2:按位或就是0111即同时选中了三个端口。
notion image
所有位为1,即选中了所有引脚。
notion image
同样的时钟的开启也可以按照同样的按位或的逻辑开启多个时钟。
同样的GPIO_SetBits()也可以同时设置多个引脚。
注意:
十六进制到二进制:每一位十六进制对应四位二进制
PA0~PA15十六个引脚,16位二进制对应为4位十六进制。
而eg:0x0010:不是10,而是直接按照十六进制到二进制的四位展开。
GPIO_Write():按照函数说明直接向寄存器里写值,只支持十六进制写入

程序三:蜂鸣器

不能使用PA15\PB3\PB4,本身作为JLINK的调试方式,但如果需要作为通用IO口,需要额外的配置。
notion image
其他同点灯,可以看说明书和原理图(或者元器件上标注)确定高电平响还是低电平响。
notion image
【tips】
.h文件到最后查看所有的函数,再跳转到.c文件里看具体的配置。
 
 

GPIO输入

按键、光敏传感器

notion image
注意按键按下时产生的电平抖动,需要过滤。加一段延时将这个抖动时间消耗过去
滤波电容:电路图中常见一端接入电路中,一端接地,保证电平稳定。
上下拉电阻电路分析和传感器
notion image
N1阻值变小,下拉作用增强,中间的AO端的电压被拉低。极端情况下,N1阻值为0,AO输出被完全下拉,输出0V。
N1阻值变大,下拉作用减弱,中间的AO端的电压由于R1的上拉作用,电压就会升高。极端情况下,N1阻值无穷大,相当于断路,AO输出被完全上拉,输出VCC。
杆子和弹簧模型:
阻值越小,弹簧拉力越大。杆子的高度相当于电路中的电压(绿色刻度),偏移多少取决与两个弹簧的弹力差(即阻值)。没有下拉弹簧时,VCC。没有上拉弹簧时,GND。如果上下弹簧拉力一致,杆子处于中间位置,即VCC/2位置。两边力都为无穷大,短路现象,避免。
notion image
图一:防止悬空引脚情况的出现,PA0必须配置为上拉输入模式。
图二:松开按键,高电平;按下按键,低电平。不会出现引脚悬空的状态,因此引脚可以设置为浮空输入/上拉输入。如果为上拉输入,此时高电平会更稳定。
图三:下拉输入模式。按下按键时,高电平。松开按键的默认模式是低电平。
(建议使用图一图二的模式)

C语言语法知识

notion image
int8_t:char的新名字,表示为8位整型的数据,_t即这是用typedef重新命名的变量类型。
uint8_t:无符号8位整型数据
notion image
notion image
notion image
notion image
notion image
(省略赋值即默认递增)(也可直接使用枚举变量作为右值)

代码一:按键控制LED

对于驱动代码而言,将其封装,单独放在另外的.c和.h文件里面
notion image
存放硬件驱动,箱子和魔法棒添加文件和路径。
notion image
注意文件路径要及时更改于该文件夹。
LED.c:存放驱动程序的主体代码
LED.h:存放驱动程序可以对外提供的函数或变量的声明
GPIO配置好之后默认为低电平,所以如果灯泡引脚接电源正极,那么不按键小灯也会亮。
(错误原因:最后没有空一行)
 
按键部分的驱动代码
.h
开启时钟,配置引脚
GPIO_Speed:输出模式下的速度(输入模式中这个参数没用)
unit8_t:unsigned char
notion image
配置的为上拉输入模式,则按键按下时为低电平。
按键刚刚按下时,存在抖动,需要延时将抖动避开。
全局变量和局部变量,在函数里面优先使用局部变量
 
 
notion image
 
Notion使用小指南喵~嵌入式操作系统
Loading...
🐟🐟
🐟🐟
在坚冰还盖着北海的时候,我看到了怒放的梅花
最新发布
四轴飞行器
2025-4-16
Notion使用小指南喵~
2025-4-16
Hi3861 & 服创
2025-4-16
Git
2025-4-16
嵌入式操作系统
2025-3-28
C2驾驶证考试
2025-3-13
公告
🎉NotionNext 3.15已上线🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏