深圳网站建设怎样选,h5制作工具免费版,mysql导入wordpress,在线写网页GPIO全称General Purpose Input Output #xff0c;即通用输入/输出。其实GPIO的本质就是芯片的一个引脚#xff0c;通常在ARM中所有的I/O都是通用的。不过#xff0c;由于每个开发板上都会设计不同的外围电路#xff0c;这就造成了GPIO的功能可能有所不同。大部分GPIO都是…GPIO全称General Purpose Input Output 即通用输入/输出。其实GPIO的本质就是芯片的一个引脚通常在ARM中所有的I/O都是通用的。不过由于每个开发板上都会设计不同的外围电路这就造成了GPIO的功能可能有所不同。大部分GPIO都是有复用功能的比如有些GPIO可能是串口的TX或RX也可能是I2C的SCL或SDA线。
所以我们不仅要知道GPIO能够输出高低电平还要理解为什么有些GPIO可以复用某些功能而其他的不可以。
一、GPIO内部结构 我们在使用GPIO的时候可能不会去想为什么通过写代码或者操作寄存器就可以控制一个引脚的高低电平。
今天就让我们一起来看看为什么通过操作寄存器其实写代码的过程就是在操作寄存器就能控制引脚输入或者输出。
我们想要想控制一个GPIO口的需要操作7个寄存器分别是 CRLCRHIDRODRBRRBSRRLCKR 我们对GPIO的操作本质上就是在对这些寄存器进行读写操作以下是这些寄存器的名称 GPIOx_CRL(x A…E)端口配置低寄存器 32位寄存器 GPIOx_CRH(x A…E)端口配置高寄存器 32位寄存器 GPIOx_IDR(x A…E)端口输入数据寄存器 32位寄存器但仅用低16位 GPIOx_ODR(x A…E)端口输出数据寄存器 32位寄存器但仅用低16位 GPIOx_BRR(x A…E)端口位清除寄存器 16位寄存器 GPIOx_BSRR(x A…E)端口位设置/清除寄存器 16位寄存器 GPIOx_LCKR(x A…E)端口配置锁定寄存器 32位寄存器 首先我们分析一下上面的结构电路。
1、保护二极管
保护二极管从它的名字就不难想到他是用来对系统进行保护的通过两个二极管的导通可以防止引脚外部输入电压过低或过高。当电压过高时上方的保护二极管导通。当电压过低时下方的二极管导通防止不正常电压导入到芯片内部造成芯片烧毁。
2、P·MOS管和N·MOS管
GPIO经过两个二极管的保护后向上流入输入模式向下流入输出模式而输出模式的控制是由一个由P·MOS管和N·MOS管组成的单元电路该电路主要是控制输出的模式由该结构狗策划给你的单元电路具有 推挽输出 和 开漏输出 两种模式。
当系统配置为推挽输出模式时 若向该结构中输入高电平经过反向后上方的P-MOS导通下方的N-MOS关闭对外输出高电平 若向该结构中输入低电平时经过反向后下方的N-MOS管导通上方的P-MOS关闭对外输出低电平。 当引脚高低电平切换时两个MOS管轮流导通P管负责灌电流N管负责拉电流使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0V高电平为3.3V。
当系统配置为开漏输出模式时 上方的P-MOS管完全不工作 如果我们控制输出为0低电平则P-MOS管关闭N-MOS管导通使输出接地 若控制输出为1它无法直接输出高电平时则P-MOS管和N-MOS管都关闭所以开漏输出模式下引脚既不输出高电平也不输出低电平为高阻态。
推挽输出模式一般应用在输出电平为0和3.3V而且需要高速切换开关状态的场合。开漏输出模式一般应用在I2C、SMBUS通信等需要 线与功能的总线电路中。
在单片机中除了必须用开漏模式的场合一般习惯使用推挽输出模式。
3、输出数据寄存器
前面我们知道双了MOS管结构电路的输入信号是由GPIO输出数据寄存器GPIOx_ODR提供的因此我们可以通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。而置位/复位寄存器GPIOx_BSRR可以通过修改输出数据寄存器的值从而影响电路的输出。
4、复用功能输出
复用功能输出中的复用是指STM32的其他片上外设对GPIO引脚进行控制此时GPIO引脚用作该外设功能的一部分算是第二用途。从其他外设引出来的复用功能输出信号与GPIO本身的数据寄存器都连接到双MOS管结构的输入中。
二、输入输出模式
GPIO共有8中输入输出模式分别是上拉输入、下拉输入、浮空输入、模拟输入、开漏输出、推挽输出、开漏复用输出、推挽复用输出 下面我们详细介绍以下上面的八种输入输出模式。
上拉输入 GPIO_Mode_IPU 下拉输入 GPIO_Mode_IPD 浮空输入 GPIO_Mode_IN_FLOATING 模拟输入 GPIO_Mode_AIN 开漏输出 GPIO_Mode_Out_OD 推挽输出 GPIO_Mode_Out_PP 开漏复用 GPIO_Mode_AF_OD 推完复用 GPIO_Mode_AF_PP
下面详细讲一下几个常用的模式。
1、浮空输入
浮空输入模式下I/O端口的电平信号直接进入输入数据寄存器。也就是说I/O的电平状态是不确定的完全由外部输入决定如果在该引脚悬空在无信号输入的情况下读取该端口的电平是不确定的通常用于IIC、USART等总线设备上。 2、上拉输入模式
上拉输入模式下I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空在无信号输入的情况下输入端的电平保持在高电平并且在I/O端口输入为低电平的时候输入端的电平也是低电平。 3、下拉输入模式
下拉输入模式下I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空在无信号输入的情况下输入端的电平保持在低电平并且在I/O端口输入为高电平的时候输入端的电平也是高电平。 4、模拟输入模式
模拟输入模式下I/O端口的模拟信号电压信号而非电平信号直接模拟输入到片上外设模块比如ADC模块等。 5、开漏输出模式
见上面二中的详细介绍。
6、开漏复用输出模式
开漏复用输出模式与开漏输出模式很是类似。只是输出的高低电平的来源不是让CPU直接写输出数据寄存器取而代之利用片上外设模块的复用功能输出来决定的一般用于片内外设功能TX1MOSIMISOSCKSS。
7、推挽输出模式
见上面二中的详细介绍。
8、推挽复用输出模式
推挽复用输出模式与推挽输出模式很是类似。只是输出的高低电平的来源不是让CPU直接写输出数据寄存器而是利用片上外设模块的复用功能输出来决定的常见采用推挽输出模式的一般为片内外设功能IIC的SCL、SDL。 三、开漏输出和推挽输出的区别
开漏输出和推挽输出模式的区别主要是开漏输出只可以输出强低电平高电平得靠外部电阻拉高。输出端相当于三极管的集电极适合于做电流型的驱动其吸收电流的能力相对强(一般20ma以内)推挽输出可以输出强高、低电平连接数字器件。 四、STM32中GPIO的配置
在固件库开发中操作寄存器 CRH 和 CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
/*第一个参数是用来指定 GPIO取值范围为 GPIOA~GPIOG。*第二个参数为初始化参数结构体指针结构体类型为 GPIO_InitTypeDef*/初始化 GPIO 的常用格式是
GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_5; //LED0-- PB.5 端口配置GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//速度 50MHzGPIO_Init(GPIOB, GPIO_InitStructure);//根据设定参数配置 GPIOIO 口速度设置有三个可选值
typedef enum{GPIO_Speed_10MHz,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;模式则有8个可选定义如下
typedef enum{ GPIO_Mode_AIN 0x0, //模拟输入GPIO_Mode_IN_FLOATING 0x04, //浮空输入GPIO_Mode_IPD 0x28, //下拉输入GPIO_Mode_IPU 0x48, //上拉输入GPIO_Mode_Out_OD 0x14, //开漏输出GPIO_Mode_Out_PP 0x10, //通用推挽输出GPIO_Mode_AF_OD 0x1C, //复用开漏输出GPIO_Mode_AF_PP 0x18 //复用推挽}GPIOMode_TypeDef;五、总结
今天主要介绍了GPIO的定义以及GPIO不同模式之间的区别与实现方式。相信看完本文你会对GPIO有一个更深的理解。
如果是做软件的小伙伴可以不用太关注于GPIO是如何实现的但是需要知道每个模式下GPIO的特点和应用场合。只有这样我们在实际应用中才能更好的配置出最合适的那个。