gpio 订阅
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。 展开全文
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
信息
外文名
GPIO
功    耗
大约1μA
特殊功能
GPxDAT 寄存器
分    类
硬件/嵌入开发驱动开发/核心开发
中文名
通用输入/输出口
全    称
General Purpose Input Output
优    点
小封装
gpio优点
GPIO的优点(端口扩展器) 低功耗:GPIO具有更低的功率损耗(大约1μA,μC的工作电流则为100μA)。集成IIC从机接口:GPIO内置IIC从机接口,即使在待机模式下也能够全速工作。小封装:GPIO器件提供最小的封装尺寸 ― 3mm x 3mm QFN!低成本:您不用为没有使用的功能买单。快速上市:不需要编写额外的代码、文档,不需要任何维护工作。灵活的灯光控制:内置多路高分辨率的PWM输出。可预先确定响应时间:缩短或确定外部事件与中断之间的响应时间。更好的灯光效果:匹配的电流输出确保均匀的显示亮度。布线简单:仅需使用2条就可以组成IIC总线或3条组成SPI总线。与ARM 的几组GPIO引脚,功能相似,GPxCON 控制引脚功能,GPxDAT用于读写引脚数据。另外,GPxUP用于确定是否使用上拉电阻。 x为A,B,,H/J,GPAUP 没有上拉电阻。
收起全文
精华内容
下载资源
问答
  • GPIO

    2016-04-11 18:04:18
    F28335将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种模式 浮空输入...

    目录

    01、I/O接口电路

    1.1、普通输入

    1.2、普通输出

    1.3、模拟输入

    1.4、复用输出

    02、管脚复用和重映射

    2.1、STMF10X系列

    2.1、STMF20X系列

    03、相关名词解释


    下文将根据STM32F207参考手的中GPIO框图讲解GPIO功能。

    01、I/O接口电路

    带FT的是说明可以容忍5V电压的,I/O电路框图

    1.1、普通输入

    普通输入模式下,上拉和下拉电阻(微弱)的存在,共分3种模式

    1. 浮空输入,不使能上拉电阻,不使能下拉电阻

    2. 上拉输入,使能上拉电阻

    3. 下拉输入,使能下拉电阻

    从上面框图得知,输出缓存是被禁止的

    1.2、普通输出

    普通输入模式下,上拉和下拉电阻(微弱)的存在。主要是由于P-MOS和N-MOS的存在分为下列两种模式

    1. 开漏模式:输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,端口保持高阻态(P-MOS 不会被使能)

    2. 推挽输出: 输出寄存器是 0 时,激活 N-MOS, 而输出寄存器是 1 时,激活 P-MOS

    从上面的框图得知,

    1、在普通输出模式中,TTL施密特触发器是打开的,所以读输入数据寄存器,可以得到 I/O 的状态。

    2、驱动GPIO输出,我们可以采用输出寄存器也可以使用位段

    1.3、模拟输入

    模拟输入上拉电阻和下拉电阻是没有用的

    高阻态下模拟输入

    从上面框图得知

    1. 弱上拉和下拉电阻禁止

    2. 施密特触发器停用,施密特触发器输出值强制为0

    3. 输出缓存被禁止

    4. 读输入数据期存器, 读到的值为0

    注意:IO配置成模拟输入时,不能容忍5V电压

    1.4、复用输出

    复用输出框图

    从上图框图中可以得到5条信息

    1. 输出缓存被来自外设的信号驱动(发送数据器使能和数据),也即是位设置/清除寄存器和输出数据寄存器在这里是无用的

    2. 由于P-MOS和N-MOS使能,仍然可以配置成推挽输出和开漏输出

    3. 上拉电阻和下拉电阻使能,可以进行配置

    4. TTL施密特触发器使能

    5. 可以通过读输入数据寄存器, 可以得到 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.1STMF20X系列

    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:13
    STM32F103ZET6一共有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以内)。
    在这里插入图片描述

    开漏形式的电路有以下几个特点:

    1. 利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。

    2. 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)

    3. OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。

    4. 可以将多个开漏输出的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种方式使用某个引脚功能,它们的配置方式如下:

    1. 作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
    2. 作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
    3. 作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
    4. 作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
    5. 作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。

    10. 注意

    1. 注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
    2. stm32 复位后,IO 端口处于输入浮空状态.
    3. JTAG 引脚复位以后,处于上拉或者下拉状态
    4. 所有 IO 端口都具有外部中断能力,端口必须配置成输入模式,才能使用外部中断功能
    5. 对于复用功能输入,端口可以配置成任意输入模式或者复用功能输出模式.
    6. 对于复用功能输出,端口必须配置成复用功能输出
    7. 对于双向复用功能,端口必须配置成复用功能输出
    8. stm32 的部分 IO 端口的复用功能可以重新映射成另外的复用功能.
    9. stm32 具有GPIO 锁定机制,即锁定 GPIO 配置,下次复位前不能再修改.
    10. 当 LSE 振荡器关闭时,OSC32_IN 和 OSC32_OUT可以用作通用 IO PC14 和 PC15.
    11. 当进入待机模式或者备份域由 Vbat 供电,PC14,PC15 功能丢失,该两个 IO口线设置为模拟输入功能.
    12. OSC_IN 和 OSC_OUT 可以重新映射为 GPIO PD0,PD1.
    13. 注意 PD0,PD1用于输出地时候仅能用于 50MHz 输出模式.
    14. 注意:PC13,PC14,PC15 只能用于 2MHz 的输出模式,最多只能带30pf 的负载,并且同时只能使用一个引脚

    11. STM32设置实例

    1. 模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

    2. 如果是接上拉电阻,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
    作用:方便布线

    展开全文
  • 若该文为原创文章,未经允许不得转载 原博主博客地址: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中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO )  芯片数据手册(datasheet)   STM32的GPIO介绍 STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件...
  • GPIO介绍

    万次阅读 多人点赞 2018-08-09 11:52:58
    GPIO的一些函数说明:...库函数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....
  •  * 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) 功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器 输入参数1:GPIOx:x可以是A,B,C,D或者E,选择GPIO外设 输入参数...
  • STM32 GPIOGPIO_Init() 函数

    万次阅读 2015-12-06 21:39:39
    今天,我们来分析一下GPIO_Init() 函数的实现,看看ST的工程师是如何实现初始化端口的(不对地方,请大家多多指正)。每个GPIO端口有16个Pin, 每个端口的配置 有两个寄存器,高位和低位寄存器配置。 来看看,两个...
  • 原理图初识之GPIO

    千次阅读 2015-12-02 22:57:35
    GPIO
  • GPIO口配置是一个历史性的问题,不管我们使用什么MCU,单片机也好,ARM也好,都离不开驱动GPIO口。Linux下有一个宏,GPIO_GPIO_SYSFS,打开这个宏后,编译烧录到设...
  • GPIO_ReadOutputDataBit及GPIO_ReadInputDataBit

    千次阅读 2019-09-28 03:43:29
    GPIO_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:28
    STM32F4学习随笔-IO口如何定义 1.第一步使能相应IO的时钟 void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) 函数参数设置: RCC_AHB1Periph—为具体哪...void GPIO_Init(GPIO_T...
  •  * 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:06
    1.void GPIO_DeInit(GPIO_TypeDef* GPIOx) 功能:将GPIOx外设寄存器初始化为默认值 注释:判断GPIOx具体为哪个端口,再通过操作RCC_APB2RSTR(APB2外设复位寄存器)对其寄存器进行复位 例如:GPIO_DeInit(GPIOA);...
  • gpio总结

    千次阅读 2016-07-06 16:53:44
    gpio 高通
  • 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 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...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,614
精华内容 15,045
关键字:

gpio