
- 外文名
- GPIO
- 功 耗
- 大约1μA
- 特殊功能
- GPxDAT 寄存器
- 分 类
- 硬件/嵌入开发驱动开发/核心开发
- 中文名
- 通用输入/输出口
- 全 称
- General Purpose Input Output
- 优 点
- 小封装
-
GPIO
2016-04-11 18:04:18F28335将88个GPIO口分成3个部分。A ---- GPIO0~GPIO31 B ---- GPIO32~GPIO63 C ---- GPIO64~GPIO87所以当我们配置引脚的时候看到GPA,GPB,GPC等等,其实就是对应的是某个端口组。 既然说到配置,那就看看GPIO口如何...F28335将88个GPIO口分成3个部分。
A ---- GPIO0~GPIO31 B ---- GPIO32~GPIO63 C ---- GPIO64~GPIO87
所以当我们配置引脚的时候看到GPA,GPB,GPC等等,其实就是对应的是某个端口组。
既然说到配置,那就看看GPIO口如何配置。每个GPIO口都会对应着寄存器,改变寄存器的值就会改变GPIO口的配置。主要的寄存器有这几个端口复用寄存器GPxMUXn x = A,B,C n = 1,2
DSP有很多资源,但是这些管脚无法一一对应,所以就采用了功能复用。比如一个GPIO口既可以输出PWM,也可以当串口输出使用,关键是看端口复用寄存器的取值。
输入输出方向寄存器GPxDIR x = A,B,C
某个GPIO口既可以当输出也可以当输入。上拉禁止寄存器GPxPUD x = A,B,C
置高寄存器 GPxSET x = A,B,C
举个具体的例子吧
// 设置GPIO6输出高电平 GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; //上拉使能 GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; //不复用其他外设 GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; //方向为输出 GpioDataRegs.GPASET.bit.GPIO6 = 1; //输出为高电平 //设置PWM端口 GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // 上拉使能GPIO0 GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // 上拉使能GPIO1 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //复用PWM功能PWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //复用PWM功能PWM1B
具体的配置可以参考官方历程
-
STM32 GPIO详解
2020-07-10 13:52:57下文将根据STM32F207参考手的中GPIO框图讲解GPIO功能。 01、I/O接口电路 带FT的是说明可以容忍5V电压的,I/O电路框图 1.1、普通输入 普通输入模式下,上拉和下拉电阻(微弱)的存在,共分3种模式 浮空输入...目录
下文将根据STM32F207参考手的中GPIO框图讲解GPIO功能。
01、I/O接口电路
带FT的是说明可以容忍5V电压的,I/O电路框图
1.1、普通输入
普通输入模式下,上拉和下拉电阻(微弱)的存在,共分3种模式
-
浮空输入,不使能上拉电阻,不使能下拉电阻
-
上拉输入,使能上拉电阻
-
下拉输入,使能下拉电阻
从上面框图得知,输出缓存是被禁止的
1.2、普通输出
普通输入模式下,上拉和下拉电阻(微弱)的存在。主要是由于P-MOS和N-MOS的存在分为下列两种模式
-
开漏模式:输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,端口保持高阻态(P-MOS 不会被使能)
-
推挽输出: 输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,激活 P-MOS
从上面的框图得知,
1、在普通输出模式中,TTL施密特触发器是打开的,所以读输入数据寄存器,可以得到 I/O 的状态。
2、驱动GPIO输出,我们可以采用输出寄存器也可以使用位段
1.3、模拟输入
模拟输入上拉电阻和下拉电阻是没有用的
高阻态下模拟输入
从上面框图得知
-
弱上拉和下拉电阻禁止
-
施密特触发器停用,施密特触发器输出值强制为0
-
输出缓存被禁止
-
读输入数据期存器, 读到的值为0
注意:IO配置成模拟输入时,不能容忍5V电压
1.4、复用输出
复用输出框图
从上图框图中可以得到5条信息
-
输出缓存被来自外设的信号驱动(发送数据器使能和数据),也即是位设置/清除寄存器和输出数据寄存器在这里是无用的
-
由于P-MOS和N-MOS使能,仍然可以配置成推挽输出和开漏输出
-
上拉电阻和下拉电阻使能,可以进行配置
-
TTL施密特触发器使能
-
可以通过读输入数据寄存器, 可以得到 I/O 的状态
02、管脚复用和重映射
管脚复用和重映射(其实是一回事),STMF10X系列叫重映射,STMF20X系列叫管脚复用,也就是复用功能
2.1、STMF10X系列
STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。
三个红框交汇处.STM32F103VCT6这个CPU的USART1接的是PB6/PB7但是上电初始化后默认功能并非是USART1.所以想要用串口功能.必须用端口重映射。
STM32的单片机每个功能模块有自己的时钟系统,所以要想要调用STM32单片机的功能模块时必须先配置对应时钟,然后才能去操作相应的功能模块.端口重映射也一样.如图示:
重映射步骤为:
1.打开重映射时钟和USART重映射后的I/O口引脚时钟,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO,ENABLE);
2.I/O口重映射开启.
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB,&GPIO_InitStructure);
2.1、STMF20X系列
STMF20X系列(包括之后的40系列)是没有重映射的说法,只有统一的称为复用功能。
从上图看出F10X系列会有专门的普通IO寄存器,会有复用寄存器,使用库函数如下:
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalStateNewState)
从上图F20X系列使用了复用功能寄存器,然不是像F10系列存在专门的复用寄存器,F20X系列GPIO复用的功能更广。
备注:要先配置GPIO为复用功能,再调用复用的库函数
03、相关名词解释
GPIO模式名字解释
GPIO_Mode
全拼
描述
GPIO_Mode_AIN
Analogue In
模拟输入
GPIO_Mode_IN_FLOATING
Float In
浮空输入
GPIO_Mode_IPD
In Pull Down
下拉输入
GPIO_Mode_IPU
In Pull Up
上拉输入
GPIO_Mode_Out_OD
Out Drain
开漏输出
GPIO_Mode_Out_PP
Push Pull
推挽输出
GPIO_Mode_AF_OD
Alternate Function
复用开漏输出
GPIO_Mode_AF_PP
Alternate Function
复用推挽输出
F20系列:GPIO共有四种功能
typedef enum { GPIO_Mode_IN = 0x00, /*!< GPIO Input Mode */ GPIO_Mode_OUT = 0x01, /*!< GPIO Output Mode */ GPIO_Mode_AF = 0x02, /*!< GPIO Alternate function Mode */ GPIO_Mode_AN = 0x03 /*!< GPIO Analog Mode */ }GPIOMode_TypeDef;
GPIO状态
推挽输出
可以输出强高低电平,连接数字器件。
开漏输出
只可以输出强低电平,高电平需要外部电阻拉高,输出端相当于三极管的集电极,要得到高电平,需要上拉电阻,适合做电流型的驱动,其吸收电流negligence相对强(一般20ma以内)
高阻态
高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,如果用万用表测的话有可能是高电平也有可能是低电平,随它后面接的东西定的。如果设置为浮空输入,也就是既没有上拉电阻,没有下拉电阻。可以认为是高阻态。
点击查看本文所在的专辑,STM32F207教程
关注公众号,第一时间收到文章更新。评论区不能及时看到,需要交流可以到公众号沟通
-
-
STM32F1XX的GPIO的8种工作模式以及GPIO的寄存器简介
2020-08-13 17:40:13STM32F103ZET6一共有7组IO口,即GPIOA,GPIOB,GPIOC到GPIOG。每组IO口有16个IO,所以一共有112个IO。STM32的大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(比如串口)。 下图为I/O端口位的基本结构 最近...基础知识
STM32F103ZET6一共有7组IO口,即GPIOA,GPIOB,GPIOC到GPIOG。每组IO口有16个IO,所以一共有112个IO。STM32的大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(比如串口)。
下图为I/O端口位的基本结构
这里的FT指的是此I/O口支持5V容忍,5V容忍的意思是当把5V的电平直接(不串联电阻)接到具有5V容忍的引脚时,STM32的引脚可以正常工作,可以正确地识别逻辑电平,不会损坏。
STM32的引脚一般接的电压是3.3V的,但有些管脚允许接入5V电压,通过pin and ball definitions中的I/O structure查看,如果显示FT就是可以容忍5V,未标识FT则代表不支持5V容忍。
如上图所示,PD13和PD14支持5V容忍。VCC:C=circuit 表示电路的意思, 即接入电路的电压;
VDD:D=device 表示器件的意思, 即器件内部的工作电压(接电源);
VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压(接地);
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多:
(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总结:
1. 推挽输出(带上拉或者下拉)
推挽输出:可以输出强高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。这样一来,输出高低电平时,VT3 一路和 VT5 一路将交替工作,从而减低了功耗,提高了每个管的承受能力。又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。因此,推拉式输出级既提高电路的负载能力,又提高开关速度。2. 开漏输出(带上拉或者下拉)
开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。
开漏形式的电路有以下几个特点:
-
利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。
-
一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)
-
OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
-
可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。补充:什么是“线与”?:
在一个结点(线)上, 连接一个上拉电阻到电源 VCC 或 VDD 和 n 个 NPN 或 NMOS 晶体管的集电极 C 或漏极 D, 这些晶体管的发射极 E 或源极 S 都接到地线上, 只要有一个晶体管饱和, 这个结点(线)就被拉到地线电平上. 因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS), 晶体管就会饱和, 所以这些基极或栅极对这个结点(线)的关系是或非 NOR 逻辑. 如果这个结点后面加一个反相器, 就是或 OR 逻辑.
其实可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:
该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。3. 浮空输入
浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。
由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。4. 上拉输入
上拉输入:上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!强弱只是上拉电阻的阻值不同,没有什么严格区分。
5. 下拉输入
下拉输入:就是把电压拉低,拉到GND。与上拉原理相似。
6. 模拟输入
模拟输入:模拟输入是指传统方式的输入。数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
7. 复用开漏输出(带上拉或者下拉)、复用推挽输出(带上拉或者下拉)
复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用功能输出模式(推挽或开漏)。
复用开漏输出如下图所示:
复用推挽输出如下图所示:
8. 总结1:
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)9. 总结2
通常有5种方式使用某个引脚功能,它们的配置方式如下:
- 作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
- 作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
- 作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
- 作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
- 作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
10. 注意
- 注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
- stm32 复位后,IO 端口处于输入浮空状态.
- JTAG 引脚复位以后,处于上拉或者下拉状态
- 所有 IO 端口都具有外部中断能力,端口必须配置成输入模式,才能使用外部中断功能
- 对于复用功能输入,端口可以配置成任意输入模式或者复用功能输出模式.
- 对于复用功能输出,端口必须配置成复用功能输出
- 对于双向复用功能,端口必须配置成复用功能输出
- stm32 的部分 IO 端口的复用功能可以重新映射成另外的复用功能.
- stm32 具有GPIO 锁定机制,即锁定 GPIO 配置,下次复位前不能再修改.
- 当 LSE 振荡器关闭时,OSC32_IN 和 OSC32_OUT可以用作通用 IO PC14 和 PC15.
- 当进入待机模式或者备份域由 Vbat 供电,PC14,PC15 功能丢失,该两个 IO口线设置为模拟输入功能.
- OSC_IN 和 OSC_OUT 可以重新映射为 GPIO PD0,PD1.
- 注意 PD0,PD1用于输出地时候仅能用于 50MHz 输出模式.
- 注意:PC13,PC14,PC15 只能用于 2MHz 的输出模式,最多只能带30pf 的负载,并且同时只能使用一个引脚
11. STM32设置实例
-
模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
-
如果是接上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;
12. 补充:GPIO相关配置寄存器
STM32F103ZET6一共有7组IO口,每组IO口有16个IO,每组IO口包含7个寄存器,一共可以控制一组GPIO的16个IO口。
- GPIOx_CRL :端口配置低寄存器
- GPIOx_CRH:端口配置高寄存器
- GPIOx_IDR:端口输入寄存器
- GPIOx_ODR:端口输出寄存器
- GPIOx_BSRR:端口位设置/清除寄存器
- GPIOx_BRR :端口位清除寄存器
- GPIOx_LCKR:端口配置锁存寄存器
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)
13. 补充:端口复用功能
STM32的大部分端口都具有复用功能。
所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一
些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。
作用:最大限度的利用端口资源14. 端口重映射功能
就是可以把某些功能引脚映射到其他引脚。
比如串口1默认引脚是PA9,PA10可以通过配置重映射映
射到PB6,PB7
作用:方便布线 -
-
树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
2018-03-30 15:40:06若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:... 目录 前话 树莓派GPIO口硬件资源介绍 引脚分布和功能图 ...Demo1:GPIO口...若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79758560
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)
树莓派开发专栏(点击传送门)
上一篇:《树莓派开发笔记(四):更便捷的开发,qt远程运行(主机qt开发一键远程运行到目标机上) 》
下一篇:《树莓派开发笔记(六):GPIO口的UART的使用(串口通讯)》
前话
搭建好完整的Qt开发环境,对于开发Qt应用按照正常的开发即可,操作io口涉及到单片机硬件知识,本篇介绍树莓派类似于单片机的GPIO口使用(硬件+软件)。
树莓派GPIO口硬件资源介绍
引脚分布和功能图
统计下硬件资源
- GPIO引脚 x 26
- UART总线 x 1
- SPI总线 x 1
- I2C总线 x 1
- 5V x 2
- 3.3V x 2
- GND x 8
模块化代码
我们模块化代码,写一个引脚输出的程序,以后需要类似直接修改引脚编号(或枚举)即可。
引入libwiringPi库。
关于wiringPi库
在qt中控制GPIO主要是使用wiring,树莓派已自带,我们查询树莓派的物理引脚与wiringPi库的编号对应表,如下图:
如果我们要操作GPIO2,对应的物理引脚为3,如下图:
我们操作引脚的时候,引脚序号就为8(wPI),当前模式为输出,V代表的是当前的输入电压,1:3.3V,0:0V。
更详细的具体参照Demo1理解。
同时,我们在工程中要加入对应的头文件和库,如何调用wiringPi,请参照具体例程。
Demo1:GPIO口的输出
使用物理引脚3,默认功能为GPIO2,我们使用GPIO2驱动LED,此时涉及到硬件知识,树莓派的GPIO口的输出电压为3.3V,所以先设置GPIO为输出高低电平,间隔1s,因为是测试,不使用限流电阻。
限流电阻解释下:电路VCC--->电阻R--->LED--->GND,LED分压为固定的,VCC减去LED压降后得到的电压除以电阻R则是该条电路的电流,所以电阻决定了电流大小,故称之为限流电阻,一般的GPIO口都对电流有要求,例如stm32的单个GPIO口不超过25mA,总的电流也有限制,所以在开发的过程中,需要根据实际情况设计电路原理图。
电路原理图
跳线的电路原理图如下:
关键代码
初始化
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); _gpioOut.init(GpioOut::GPIO2, false); ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("green")); startTimer(1000); }
每1s钟切换
void MainWindow::timerEvent(QTimerEvent *event) { if(_gpioOut.readOutput(GpioOut::GPIO2)) { _gpioOut.setOutput(GpioOut::GPIO2, false); ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("green")); }else{ _gpioOut.setOutput(GpioOut::GPIO2, true); ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("red")); } }
模块代码
gpiocout.h
#ifndef GPIOOUT_H #define GPIOOUT_H #include <QObject> #include <QMap> #include <QDebug> #include "wiringPi.h" class GpioOut : public QObject { Q_OBJECT public: enum GPIO{ GPIO2 = 3, }; public: explicit GpioOut(QObject *parent = 0); public slots: void init(GPIO pin, bool output = false); void setOutput(GpioOut::GPIO pin, bool output); bool readOutput(GpioOut::GPIO pin); private: QMap<GPIO, int> _mapPhysical2Wiring; }; #endif // GPIOOUT_H gpioout.cpp #include "gpioout.h" GpioOut::GpioOut(QObject *parent) : QObject(parent) { wiringPiSetup(); _mapPhysical2Wiring.insert(GPIO2, 8); } void GpioOut::init(GpioOut::GPIO pin, bool output) { pinMode(_mapPhysical2Wiring.value(pin), OUTPUT); digitalWrite(_mapPhysical2Wiring.value(pin), output?HIGH:LOW); } void GpioOut::setOutput(GpioOut::GPIO pin, bool output) { digitalWrite(_mapPhysical2Wiring.value(pin), output?HIGH:LOW); } bool GpioOut::readOutput(GpioOut::GPIO pin) { return digitalRead(_mapPhysical2Wiring.value(pin)); }
运行效果
Demo2:GPIO口的输入
使用物理引脚3,默认功能为GPIO2,我们使用GPIO2接受输入,此时涉及到硬件知识,让树莓派的GPIO口的输入电压为3.3V/0V即为输入1还是输入0,也涉及到限流电阻,一般使用1K或者10K的,因为是测试,此处不使用限流电阻,在开发的过程中,需要根据实际情况设计电路原理图。
电路原理图
关键代码
初始化
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); _gpioIn.init(GpioIn::GPIO2); bool in = _gpioIn.readOutput(GpioIn::GPIO2); ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg(in?"red":"green")); startTimer(1000); }
每一秒钟检测一次
void MainWindow::timerEvent(QTimerEvent *event) { bool in = _gpioIn.readOutput(GpioIn::GPIO2); ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg(in?"red":"green")); }
模块代码
gpioin.h
#ifndef GPIOIN_H #define GPIOIN_H #include <QObject> #include <QMap> #include <QDebug> #include "wiringPi.h" class GpioIn : public QObject { Q_OBJECT public: enum GPIO{ GPIO2 = 3, }; public: explicit GpioIn(QObject *parent = 0); public slots: void init(GPIO pin); bool readOutput(GpioIn::GPIO pin); private: QMap<GPIO, int> _mapPhysical2Wiring; }; #endif // GPIOIN_H gpioin.h #include "gpioin.h" GpioIn::GpioIn(QObject *parent) : QObject(parent) { wiringPiSetup(); _mapPhysical2Wiring.insert(GPIO2, 8); } void GpioIn::init(GpioIn::GPIO pin) { pinMode(_mapPhysical2Wiring.value(pin), OUTPUT); } bool GpioIn::readOutput(GpioIn::GPIO pin) { return digitalRead(_mapPhysical2Wiring.value(pin)); }
运行效果
上一篇:《树莓派开发笔记(四):更便捷的开发,qt远程运行(主机qt开发一键远程运行到目标机上) 》
下一篇:《树莓派开发笔记(六):GPIO口的UART的使用(串口通讯)》
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79758560 -
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
2018-04-10 10:20:05《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO ) 芯片数据手册(datasheet) STM32的GPIO介绍 STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件... -
GPIO介绍
2018-08-09 11:52:58GPIO的一些函数说明:...库函数GPIO中定义GPIO引脚名称,传输速率,引脚模式设置相应的结构体 @brief This file contains all the functions prototypes for the GPIO * firmwa... -
树莓派GPIO控制
2018-07-15 12:21:35树莓派GPIO控制 陈拓chentuo@ms.xab.ac.cn 2018.06.09/2018.06.10 0. 概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果。也适宜于树莓派3B+。 0.1 树莓派GPIO编号方式 功能物理引脚 从左到右,从上到下:... -
STM32开发 -- GPIO详解
2018-06-13 16:41:59之前有简单讲过GPIO工作模式和寄存器,还是有点没搞明白。这次需要全方位的看一下了。 一、数据手册 1、STM32F105RC引脚说明 可知:STM32F105RC 一共有4组IO口 一共16X3+3=51个IO GPIOA0~A15... -
树莓派GPIO RPi.GPIO
2016-04-03 08:50:54树莓派 raspberry pi GPIO python树莓派 raspberry pi GPIO python RPiGPIO模块基本使用 导入模块 引脚编号方式 设置一个通道 输入 输出 设置多个通道的输出 清空 GPIO 输入 上拉或者下拉电阻 测试输入轮询 中断与... -
树莓派学习笔记——GPIO功能学习
2013-10-13 20:34:37新建一个名为led.py的文件,该文件具体内容如下: # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time # BOARD编号方式,基于插座引脚编号 GPIO.setmode(GPIO.BOARD) # 输出模式 GPIO.setup(11, GPIO.... -
Linux 内核设备驱动之GPIO驱动之GPIO GPIO描述符到GPIO CHIP
2017-03-10 09:28:13* gpiod_to_chip - Return the GPIO chip to which a GPIO descriptor belongs * @desc: descriptor to return the chip of */ struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc) { if -
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 理解
2019-09-25 02:13:08void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器 输入参数1:GPIOx:x可以是A,B,C,D或者E,选择GPIO外设 输入参数... -
STM32 GPIO之 GPIO_Init() 函数
2015-12-06 21:39:39今天,我们来分析一下GPIO_Init() 函数的实现,看看ST的工程师是如何实现初始化端口的(不对地方,请大家多多指正)。每个GPIO端口有16个Pin, 每个端口的配置 有两个寄存器,高位和低位寄存器配置。 来看看,两个... -
原理图初识之GPIO
2015-12-02 22:57:35GPIO -
LinuxGPIO操作和MTK平台GPIO
2020-04-25 13:03:26GPIO口配置是一个历史性的问题,不管我们使用什么MCU,单片机也好,ARM也好,都离不开驱动GPIO口。Linux下有一个宏,GPIO_GPIO_SYSFS,打开这个宏后,编译烧录到设... -
GPIO_ReadOutputDataBit及GPIO_ReadInputDataBit
2019-09-28 03:43:29GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读的是GPIOx_IDR,读的是当IO口设置为输入状态时候的IO口值 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读的是GPIOx_ODR,读... -
STM32 (3) GPIO口功能讲解 GPIO 口输入输出 寄存器配置
2018-08-09 17:16:32讲解GPIO操作原理,使用各种型号的STM32 打开官方的《STM32中文参考手册》8.1 8.2小节 GPIO功能描述 我们今天重点要分析的是下图 上图是100脚的STM32单片机 1. GPIO是包含引脚的 2. 如何找GPIO功能: 看... -
GPIO设置
2020-02-03 17:46:28STM32F4学习随笔-IO口如何定义 1.第一步使能相应IO的时钟 void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) 函数参数设置: RCC_AHB1Periph—为具体哪...void GPIO_Init(GPIO_T... -
Linux 内核设备驱动之GPIO驱动之GPIO GPIO描述符到GPIO号
2017-03-10 09:27:08* Convert a GPIO descriptor to the integer namespace. * This should disappear in the future but is needed since we still * use GPIO numbers for error messages and sysfs nodes */ int desc_ -
GPIO库函数
2018-08-01 20:27:061.void GPIO_DeInit(GPIO_TypeDef* GPIOx) 功能:将GPIOx外设寄存器初始化为默认值 注释:判断GPIOx具体为哪个端口,再通过操作RCC_APB2RSTR(APB2外设复位寄存器)对其寄存器进行复位 例如:GPIO_DeInit(GPIOA);... -
gpio总结
2016-07-06 16:53:44gpio 高通 -
GPIO_InitTypeDef GPIO_InitStructure;这句话什么意思
2020-08-06 12:05:37声明一个结构体,名字是GPIO_InitStructure,结构体原型由GPIO_InitTypeDef 确定, stm32里面初始化GPIO用的。设置完了GPIO_InitStructure里面的内容后 在GPIO_Init (GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_... -
GPIO简介
2016-12-01 15:21:30目录 [隐藏] 1 简介2 使用 2.1 输入输出2.2 复用 ...GPIO, 全称 General-Purpose Input/Output(通用输入输出),...RK3288 有 9 组 GPIO bank: GPIO0,GPIO1, ..., GPIO8。每组又以 A0~A7, B0~B7, C0~C7 -
Raspberry PI上操作GPIO(GPIO编程,远程控制GPIO)
2017-08-08 16:47:51一 Raspberry PI的GPIO 1. 什么是GPIO 2. Raspberry上的GPIO介绍 二Raspberry PI上编程操作GPIO 1. Python操作 (1) 安装环境 a.下载控制GPIO的python库:... -
GPIO_Mode--GPIO配置
2019-04-23 11:04:58【注:学习STM32总结做的笔记,大神勿喷。有不足之处还望不吝赐教。 -----本篇由转载而来,有侵权请联系作者,谢谢。】 ... 一、GPIO配置 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING ...(3)GPIO_Mod...