文章目录
GPIO简介
- GPIO(General Purpose Input Output)通用输入输出口
- 可配置8种输入输出模式
- 引脚电平:0~3.3V,部分引脚可容忍5V(容忍5V的意思是可以输入5V电压,但是输出最大只能是3.3V,引脚定义中带FT的可以容忍5V)
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等;(若控制功率比较大的电路,加入驱动模块即可)
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等;
GPIO基本结构
- 在STM32中,所有GPIO都是挂载在APB2外设总线上的;
- GPIO分为GPIOA、GPIOB…每个GPIO外设都有16个引脚,第0号引脚叫做PA0…以此类推;
- 寄存器(32位)的每一位对应一个引脚;
GPIO位结构
整体结构
- 左边为寄存器,中间为驱动器,右边为对应某一个IO引脚;
- 上边为输入部分,下边为输出部分;
输入部分
- 保护二极管作用是限制IO引脚电压为0~3.3V,进而保护电路;
- 上拉电阻和下拉电阻对应上拉输入模式(默认为高电平输入方式)和下拉输入模式(默认为低电平输入方式),如果两个电阻都不导通,则为浮空输入模式;
- 上拉电阻和下拉电阻的作用是保证在引脚悬空时仍有高低电平,不至于使数据发生干扰;
- TTL施密特触发器:对输入电压进行整形,如果输入电压大于某一阈值,输出瞬间升为高电平;如果输入电压低于某一阈值,输出瞬间变为低电平;如果输入电压在高低两个阈值之间,则输出不改变,原高为高,原低为低;可以避免因为数据波动造成的干扰现象;
输出部分
位设置/清除寄存器
单独操作输出数据寄存器的某一位,而不影响其他位;
MOS管
是一种电子开关,信号控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS,进而选择推挽、开漏、关闭三种输出方式;
-
推挽输出模式(强推输出模式):P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,输出高电平;数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,输出低电平;【驱动能力较强】
-
开漏输出模式:P-MOS无效,N-MOS工作,数据寄存器为1时,下管断开,即输出断开;数据寄存器为0时,下管导通,输出直接接到VSS,输出低电平;
【只有低电平有驱动模式,高电平无驱动模式,可以作为通信协议的驱动方式,避免多机通信的相互干扰】
【还可以用于输出5V的电压】 -
关闭模式:两个MOS管都无效,即输出关闭,端口电平由外部信号来控制;
GPIO模式
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式
一个端口只能有一个输出,但可以有多个输入;
LED和蜂鸣器介绍
介绍
- LED:发光二极管,正向通电点亮,反向通电不亮;
- 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定;
- 无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,即可发出不同频率的声音;
硬件电路
- 三极管:竖线为基极,带箭头的为发射极,剩下的为集电极。对于蜂鸣器上方的电路(PNP),基极给低电平导通,高电平断开;下方的电路(NPN),基极给高电平导通,低电平断开;【PNP的三极管最好接在上面,NPN的三极管最好接在下面】
面包板
中间部分纵向导通,上下两侧横向导通;
LED闪烁&LED流水灯&蜂鸣器
- 接线图在程序源码的文件中查看;
- keilkill的作用:复制到工程文件夹后,双击即可删除运行过程中产生的中间文件,节约空间;
点亮一个LED
原材料
-
操作STM32的GPIO的三个步骤:
使用RCC开启GPIO的时钟;
使用GPIO_Init函数初始化GPIO;
使用输出或者输入的函数控制GPIO口; -
查找库函数:在Library中寻找RCC和GPIO的头文件,双击打开,在头文件的最下面一般是所有库函数的声明,右键跳转到定义Definition;
-
RCC最常用的三个函数:RCC AHB外设时钟控制,RCC AHB2外设时钟控制,RCC AHB1 外设时钟控制;
-
GPIO常用库函数:
GPIO_Delnit,参数可以写GPIOA、GPIOB等,调用该函数后,所指定的GPIO外设就会被复位;
AFIODelnit也是一样,可以复位AFIO外设;
GPIO_Init的作用是用结构体的参数来初始化GPIO口,需要先定义结构体变量,对结构体赋值,再调用该函数;(Init函数在STM32基本所有外设都有)
GPIO_StructInit可以把结构体变量赋一个默认值;
下面是个就是GPIO的4个读取函数以及4个写入函数; -
GPIO8种工作模式缩写:
AIN(Analog IN)是模拟输入;
IN_FLOATING是浮空输入;
IPD(In Pull Down)是下拉输入;
IPU(In Pull Up)是上拉输入;
Out OD(Out Open Drain)是开漏输出;
Out_PP(Out Push Pull)是推挽输出;
AF_OD(Atl Open Drain)是复用开漏;
AF_PP(Alt Push Pull)是复用推挽; -
GPIO的四个输出函数:
GPIO_SetBits:可以把指定的端口设置为高电平;
GPIO_ResetBits:可以把指定的端口设置为低电平;
GPIO_WriteBit:根据第三个参数Bitval的值来设置指定端口;
GPIO_Write:可以同时对16个端口进行写入操作; -
延时函数Delay:微秒延时、毫秒延时、秒延时
代码
-
点亮一个LED
-
LED闪烁
-
LED流水灯
如果需要同时配置多个端口,可以使用按位或 | 的方式,或者定义中有同时全设置全部的也可以根据定义来使用;(一般来讲可以同时设置多个端口的函数名称都有加s)
-
蜂鸣器
A15、B3、B4端口为调试端口,使用需要另外配置;
总结
使用库函数的几种方法:
- 打开头文件,拉到最后看一下有哪些函数,右键转到定义,查看函数和参数的用法;
- 资料文件里面的库函数用户手册(版本有出入);
- 百度查看别人的代码和解释;