GPIO全称GeneralPurposeInputOutput,即通用输入输出。其实GPIO的本质就是芯片的一个引脚,通常在ARM中所有的IO都是通用的。不过,由于每个开发板上都会设计不同的外围电路,这就造成了GPIO的功能可能有所不同。大部分GPIO都是有复用功能的,比如有些GPIO可能是串口的TX或RX,也可能是I2C的SCL或SDA线。 所以,我们不仅要知道GPIO能够输出高低电平,还要理解为什么有些GPIO可以复用某些功能,而其他的不可以。 一、GPIO内部结构 我们在使用GPIO的时候,可能不会去想为什么通过写代码或者操作寄存器就可以控制一个引脚的高低电平。 今天就让我们一起来看看,为什么通过操作寄存器(其实写代码的过程就是在操作寄存器)就能控制引脚输入或者输出。 我们想要想控制一个GPIO口的需要操作7个寄存器,分别是CRL,CRH,IDR,ODR,BRR,BSRR,LCKR我们对GPIO的操作本质上就是在对这些寄存器进行读写操作,以下是这些寄存器的名称:GPIOxCRL(xA。。E)端口配置低寄存器32位寄存器GPIOxCRH(xA。。E)端口配置高寄存器32位寄存器GPIOxIDR(xA。。E)端口输入数据寄存器32位寄存器但仅用低16位GPIOxODR(xA。。E)端口输出数据寄存器32位寄存器但仅用低16位GPIOxBRR(xA。。E)端口位清除寄存器16位寄存器GPIOxBSRR(xA。。E)端口位设置清除寄存器16位寄存器GPIOxLCKR(xA。。E)端口配置锁定寄存器32位寄存器 首先,我们分析一下上面的结构电路。 1、保护二极管 保护二极管从它的名字就不难想到他是用来对系统进行保护的,通过两个二极管的导通可以防止引脚外部输入电压过低或过高。当电压过高时,上方的保护二极管导通。当电压过低时,下方的二极管导通,防止不正常电压导入到芯片内部造成芯片烧毁。 2、PMOS管和NMOS管 GPIO经过两个二极管的保护后向上流入输入模式,向下流入输出模式,而输出模式的控制是由一个由PMOS管和NMOS管组成的单元电路,该电路主要是控制输出的模式,由该结构狗策划给你的单元电路具有推挽输出和开漏输出两种模式。 当系统配置为推挽输出模式时:若向该结构中输入高电平,经过反向后,上方的PMOS导通,下方的NMOS关闭,对外输出高电平;若向该结构中输入低电平时,经过反向后,下方的NMOS管导通,上方的PMOS关闭,对外输出低电平。当引脚高低电平切换时,两个MOS管轮流导通,P管负责灌电流,N管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0V,高电平为3。3V。 当系统配置为开漏输出模式时:上方的PMOS管完全不工作;如果我们控制输出为0,低电平,则PMOS管关闭,NMOS管导通,使输出接地;若控制输出为1(它无法直接输出高电平)时,则PMOS管和NMOS管都关闭,所以开漏输出模式下引脚既不输出高电平,也不输出低电平,为高阻态。 推挽输出模式一般应用在输出电平为0和3。3V而且需要高速切换开关状态的场合。开漏输出模式一般应用在I2C、SMBUS通信等需要线与功能的总线电路中。 在单片机中除了必须用开漏模式的场合,一般习惯使用推挽输出模式。 3、输出数据寄存器 前面我们知道双了MOS管结构电路的输入信号,是由GPIO输出数据寄存器GPIOxODR提供的,因此我们可以通过修改输出数据寄存器的值,就可以修改GPIO引脚的输出电平。而置位复位寄存器GPIOxBSRR可以通过修改输出数据寄存器的值,从而影响电路的输出。 4、复用功能输出 复用功能输出中的复用是指STM32的其他片上外设对GPIO引脚进行控制,此时GPIO引脚用作该外设功能的一部分,算是第二用途。从其他外设引出来的复用功能输出信号与GPIO本身的数据寄存器都连接到双MOS管结构的输入中。二、输入输出模式 GPIO共有8中输入输出模式,分别是:上拉输入、下拉输入、浮空输入、模拟输入、开漏输出、推挽输出、开漏复用输出、推挽复用输出,下面我们详细介绍以下上面的八种输入输出模式。上拉输入:GPIOModeIPU下拉输入:GPIOModeIPD浮空输入:GPIOModeINFLOATING模拟输入:GPIOModeAIN开漏输出:GPIOModeOutOD推挽输出:GPIOModeOutPP开漏复用:GPIOModeAFOD推完复用:GPIOModeAFPP 下面,详细讲一下几个常用的模式。 1、浮空输入 浮空输入模式下,IO端口的电平信号直接进入输入数据寄存器。也就是说,IO的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的,通常用于IIC、USART等总线设备上。 2、上拉输入模式 上拉输入模式下,IO端口的电平信号直接进入输入数据寄存器。但是在IO端口悬空(在无信号输入)的情况下,输入端的电平保持在高电平(并且在IO端口输入为低电平的时候,输入端的电平也是低电平)。 3、下拉输入模式 下拉输入模式下,IO端口的电平信号直接进入输入数据寄存器。但是在IO端口悬空(在无信号输入)的情况下,输入端的电平保持在低电平;并且在IO端口输入为高电平的时候,输入端的电平也是高电平。 4、模拟输入模式 模拟输入模式下,IO端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等。 5、开漏输出模式 见上面二中的详细介绍。6、开漏复用输出模式 开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的,一般用于片内外设功能:TX1,MOSI,MISO,SCK,SS。7、推挽输出模式 见上面二中的详细介绍。8、推挽复用输出模式 推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的,常见采用推挽输出模式的一般为片内外设功能IIC的SCL、SDL。 三、开漏输出和推挽输出的区别 开漏输出和推挽输出模式的区别主要是开漏输出只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);推挽输出可以输出强高、低电平,连接数字器件。 四、STM32中GPIO的配置 在固件库开发中,操作寄存器CRH和CRL来配置IO口的模式和速度是通过GPIO初始化函数完成:voidGPIOInit(GPIOTypeDefGPIOx,GPIOInitTypeDefGPIOInitStruct);第一个参数是用来指定GPIO,取值范围为GPIOAGPIOG。第二个参数为初始化参数结构体指针,结构体类型为GPIOInitTypeDef 初始化GPIO的常用格式是:GPIOInitTypeDefGPIOInitStructure;GPIOInitStructure。GPIOPinGPIOPin5;LED0PB。5端口配置GPIOInitStructure。GPIOModeGPIOModeOutPP;推挽输出GPIOInitStructure。GPIOSpeedGPIOSpeed50MHz;速度50MHzGPIOInit(GPIOB,GPIOInitStructure);根据设定参数配置GPIO IO口速度设置有三个可选值:typedefenum{GPIOSpeed10MHz,GPIOSpeed2MHz,GPIOSpeed50MHz}GPIOSpeedTypeDef; 模式则有8个可选定义如下:typedefenum{GPIOModeAIN0x0,模拟输入GPIOModeINFLOATING0x04,浮空输入GPIOModeIPD0x28,下拉输入GPIOModeIPU0x48,上拉输入GPIOModeOutOD0x14,开漏输出GPIOModeOutPP0x10,通用推挽输出GPIOModeAFOD0x1C,复用开漏输出GPIOModeAFPP0x18复用推挽}GPIOModeTypeDef;五、总结 今天主要介绍了GPIO的定义,以及GPIO不同模式之间的区别与实现方式。相信看完本文,你会对GPIO有一个更深的理解。 如果是做软件的小伙伴,可以不用太关注于GPIO是如何实现的,但是需要知道每个模式下GPIO的特点和应用场合。只有这样,我们在实际应用中才能更好的配置出最合适的那个。 END文章链接:https:mp。weixin。qq。comsqHZPtQBXfwpp8GraAqnpEg 转载自:嵌入式微处理器 文章来源:嵌入式悦翔园,作者JamesBin 文章链接:一文弄懂GPIO不同模式之间的区别与实现原理 版权申明:本文来源于网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。