一、gpio简介
gpio作为通用输入输出端口,其全称为general purpose input output,能够通过软件自由配置引脚状态及工作模式。除通用输入输出功能外,部分gpio端口还可被用作第二功能的配置,即为复用功能。
每个通用i/o端口都可以通过软件自由配置为4种输入模式与4种输出模式。
输入模式
通过配置gpiox_crl寄存器或gpiox_crh寄存器中的modex[1:0]为00,即配置为输入模式,配置寄存器中的cnfx[1:0]选择工作模式(mm32f0140 的gpiox中“x”的范围为a到d)。
图1. 输入浮空/上拉输入/下拉输入/模拟输入配置
输入浮空:
浮空就是输入引脚即不接高电平也不接低电平,如图1所示,i/o端口的数据在每个ahb时钟被采样到输入数据寄存器,通过读访问输入数据寄存器获取当前i/o状态,输入浮空常用于复用功能。
上拉输入:
电阻与vdd相连,形成上拉电阻,i/o端口在空闲时为高电平,能够用于检测由高到低的电平变化,常用于按键检测。
下拉输入:
电阻与vss相连,形成下拉电阻,i/o端口在空闲时为低电平,能够用于检测由低到高的电平变化。
模拟输入:
模拟输入是模拟信号的输入,在模拟输入模式下,上拉电阻、下拉电阻及斯密特触发器均被禁止。
输出模式
通过配置gpiox_crl寄存器或gpiox_crh寄存器中的cnfx[1:0]选择输出模式,配置gpiox_crl中的modex[1:0]选择输出速度(modex[1:0]不为00)。当i/o端口使用复用输出功能时,端口必须配置为复用功能输出模式(推挽或开漏),输出配置如图2所示。
图2. 输出配置
开漏输出:
在开漏输出模式中,输出控制寄存器配置为0时,数据经过输出控制模块,mos管的栅极接收到高电平,mos管导通,此时i/o端口接通在gnd上,即对应引脚输出低电平;当输出控制寄存器配置为1,数据经过控制模块,给予mos管的栅极一个低电平,此时mos管不导通,对应的管脚处于高阻态。因此,开漏输出通常输出低电平,若要输出高电平则需外加上拉电阻。
推挽输出:
推挽输出一般指两个mos管分别受两个互补信号的控制,总是在一个mos管导通时另一个mos管截止。当输出控制寄存器配置为0时,数据经过输出控制模块,mos管的栅极接收到高电平,n-mos管导通,p-mos管不导通,此时i/o端口接通在vss上,即对应引脚输出为低电平;当输出控制寄存器配置为1时,数据经过输出控制模块,mos管的栅极接收到低电平,p-mos管导通,n-mos管不导通,此时i/o端口接通在vdd上,即对应引脚输出为高电平。因此,推挽输出可以输出高低电平。
图3. 复用功能配置
复用开漏输出:
配置gpiox_afrh与gpiox_afrl寄存器的afrlx[3:0]与afrhx[3:0]选择复用功能。当gpio被作为第二功能使用时,模式配置为复用模式,复用功能配置如图3所示。以图4为例,若要配置pb10引脚作为i2c_scl,则在配置gpio模式时要选择复用模式。通过片上外设复用功能,使用mos管实现输出。通常i2c使用gpio的复用功能时会使用复用开漏输出模式,由于i2c的一个主设备可挂载多个从设备,若不使用复用开漏输出,而使用复用推挽输出,数据传输时,两个从设备一个拉高,一个拉低,可能会造成短路。因此i2c大多使用gpio的复用开漏输出模式。
图4. mm32f0140部分引脚复用功能
复用推挽输出:
当gpio被作为第二功能配置使用时,模式需配置为复用模式,通过配置gpio_afrh与gpiox_afrl寄存器的afrlx[3:0]与afrhx[3:0]选择复用功能,通过片上外设复用功能,使用两个mos管来实现输出。与推挽输出不同,复用推挽输出模式下端口的i/o操作由对应复用的功能模块控制,而推挽输出模式下控制i/o端口需对gpio内部的寄存器进行操作。
二、配置gpio
首先,使能对应i/o口的时钟,根据所使用的外设对rcc的rcc_ahbenr寄存器进行赋值,将对应外设位置1即可使能时钟,详细外设如图5所示。
图5. mm32f0140 ahb外设
其次,配置所需的gpio引脚、速度及工作模式。端口0到端口7使用gpiox_crl寄存器配置工作模式与速度,该寄存器中modex[1:0]位表示端口输入输出速度,cnfx[1:0]位表示端口工作模式(”modex”与”cnfx”的”x”表示指定端口号)。若配置gpiox_crl寄存器中的modex位等于00则端口为输入模式,此时cnfx位有四种配置方式,分别为:00(模拟输入模式),01(浮空输入模式),10(上拉/下拉输入模式);若modex位不为00,则对应端口为输出模式,此时cnfx具有四种配置方式:00(推挽输出模式),01(开漏输出模式),10(推挽复用模式),11(开漏复用模式)。端口8到端口15的配置使用gpiox_crh寄存器配置指定端口的工作模式与速度,详细配置方式与cpiox_crl寄存器相同。
若使用端口复用功能,需对gpiox_afrl(端口复用功能低位)寄存器与gpiox_afrh(端口复用功能高位)寄存器进行配置。端口号为0到7则使用gpiox_afrl寄存器,端口号为8到15则使用gpiox_afrh寄存器,根据端口号与复用功能表进行配置,例如若使用pa0引脚作为i2c1_scl,则需将gpiox_afrl寄存器中af3的对应位置1(gpio的工作模式也要配置为复用模式),pa端口的复用功能表如图6所示。
图6 mm32f0140 pa端口复用功能表
三、实验
本实验通过使用gpio获取按键状态控制led亮灭,读取指定gpio端口引脚的输入数据(读gpiox_idr寄存器)来获取当前的按键状态,通过对端口设置/清除寄存器(gpiox_bsrr寄存器)与端口位清除寄存器(gpiox_brr寄存器)的对应端口赋值,使对应的led亮灭。具体实验内容为配置pb3引脚对应led2, pb4引脚对应led3,pb2引脚对应的k2(如图7所示),若k2按下,则k2对应的端口输入低电平,设置实验现象为led2灭、led3亮,k2处于非按下时,k2对应的端口输入高电平,设置实验现象为led2亮、led3灭。
图7 引脚配置原理图
外设时钟初始化
gpio在ahb线上,实验使用引脚均为gpiob组的引脚,因此对rcc_ahbenr寄存器的gpiob对应位置1。
rcc->ahb1enr |= (1u
按键扫描
读gpiox_idr寄存器获取对应端口输入数据,本实验中k2配置为上拉输入,即按键未按下时为高电平,按下按键后,k2对应端口输入为低电平。若gpiox_bsrr寄存器的低16位的对应端口位置1,则该端口为高电平;若gpiox_brr寄存器的对应端口位置1,则该端口为低电平。实验设置按键未按下时,led2(pb3)亮、led3(pb4)灭;按下按键时led2灭、led3亮。
while(1){ //k2的引脚为pb2, 1u 图9.实验效果
来源:灵动mm32mcu
小蚁H20GB摄像机开卖 首发价149元
LED灯光节能性的产生原理
外媒测试华为麒麟9000性能:轻松秒杀A13处理器和高通骁龙865
超级电容器使用时的注意事项都有哪些
和AI聊天,自然语言模型 GPT-2可能会推出个人信息
MM32F0140 GPIO学习笔记
荣耀什么时候升级鸿蒙系统?
锂电的大小兼顾和产能使用
一文了解电路的干接点和湿接点的工作原理和状态
PoW和PoS将是区块链世界中两种最主流的共识算法
智能、安全、高效,看移远如何助力割草机智能化升级
小米MAX2发布会直播进行时:看直播送小米MAX2,已有1000万人围观,配置、合作直播平台这里有!
人工智能技术如何改善任何规模企业的营销
如何将手机内容无线投射到大屏幕,让小屏变大屏?
小米6什么时候上市?小米6最新消息:小米6发生变数,难道后者才是真的吗,是不是现货?
皮革低温耐折试验机的注意事项有哪些
封装基板微盲孔成孔技术详解
关于的集成外部C代码到Simulink模型分析和介绍
携手飞腾创新打造高品质国产“芯”工业主板
商业AI与工业AI的差异 工业AI的架构分析