1.什么是GPIO口
GPIO即通用I/O口是STM32可控制的引脚 ,STM32有7组I/O,即GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口。STM32中有很多内置外设,这些外设的外部引脚都是和GPIO所共用这种情况就是gpio的复用。
2.GPIO框图
保护二极管:
用于防止引脚过高或过低的电压输入当电压大于VDD时上方二极管导通,当电压小于vss时下方二极管导通。
P-MOS和N-MOS:
GPIO 引脚线路经过两个保护二极管后,向上流向“输入模式”结构,向下流向“输出模式”结构。先看输出模式部分,线路经过一个由P-MOS 和N-MOS 管组成的单元电路。这个结构使GPIO具有了“推挽输出”和“开漏输出”两种模式。
所谓的推挽输出模式,是根据这两个MOS 管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的P-MOS 导通,下方的N-MOS 关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS 管导通,P-MOS 关闭,对外输出低电平,推挽输出的低电平为0 伏,高电平为3.3伏,它是推挽输出模式时的等效电路。
而在开漏输出模式时,上方的P-MOS 管完全不工作。如果我们控制输出为0,低电平,则P-MOS 管关闭,N-MOS 管导通,使输出接地,若控制输出为1 (它无法直接输出高电平)时,则P-MOS 管和N-MOS 管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平,0 伏。
推挽输出模式一般应用在输出电平为0 和3.3 伏而且需要高速切换开关状态的场合。在STM32 的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。
复用功能输出:
“复用功能输出”中的“复用”是指STM32 的其它片上外设对GPIO 引脚进行控制,此时GPIO 引脚用作该外设功能的一部分,算是第二用途。从其它外设引出来的“复用功能输出信号”与GPIO本身的数据据寄存器都连接到双MOS 管结构的输入中,通过图中的梯形结构作为开关切换选择。
例如我们使用USART 串口通讯时,需要用到某个GPIO引脚作为通讯发送引脚,这个时候就可以把该GPIO引脚配置成USART 串口复用功能,由串口外设控制该引脚,发送数据。
复用功能输入
与“复用功能输出”模式类似,在“复用功能输入模式”时,GPIO引脚的信号传输到STM32 其它片上外设,由该外设读取引脚状态。
3.GPIO的八种输入模式
浮空输入_IN_FLOATING
VDD和VSS所在路径的两个开关同时断开。此时没有上拉和下拉的情况,所以当IO口没有接输入的时候,此时的电平会是一个不确定的值,这一种输入模式的电平会完全取决于外部电路而与内部电路无关。有时候会用作对开关按键的读取。但是在没有外部电路接入的时候,IO脚浮空会使得电平不确定。
带上拉输入_IPU
如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的,上拉电阻就是为了保证无信号输入时输入端的电平为高电平
带下拉输入_IPD
下拉电阻它是为了保证无信号输入时输入端的电平为低电平。
模拟输入_AIN
用AD采集输入信号此时既不能上拉也不能下拉电阻也不能通过TTL
开漏输出_OUT_OD
一般只用N-MOS,给低电平MOS管不导通输出悬空,给高电平MOS管导通输出低电平。只能输出低电平不能输出高电平,线与,有一个低电平全为低电平
推挽输出_OUT_PP
利用P-MOS和N-MOS,当给一个高电平的时候,N-MOS导通,P-MOS不导通,此时IO口接通在VSS,此时输出的是低电平。当给一个低电平的时候,P-MOS导通,N-MOS导通,此时IO口接通在VDD电源上面,此时输出的是高电平。
开漏复用输出_AF_OD
与开漏输出类似,2的输入由输出数据寄存器变为复用功能输出
推挽复用输出_AF_PP
GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)
GPIO的配置方法
GPIO_InintTypeDef GPIO_InitStructure;//定义结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO,ENABLE);//开启GPIO时钟,AHB1
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//选择pin9引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//设定输出模式
/GPIO_Mode_IN//输入模式
GPIO_Mode_OUT//输出模式
GPIO_Mode_AF//复用模式
GPIO_Mode_AN//模拟模式/
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//设置引脚的输出类型为推挽输出
/GPIO_OType_PP;//推挽
GPIO_OType_OD;//开漏/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHZ;//设定速度为100MHZ高速模式
/速度:GPIO_Speed_100MHZ;
GPIO_Speed_50MHZ;
GPIO_Speed_25MHZ;
GPIO_Speed_2MHZ;/
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//设置引脚为上拉形式
GPIO_Init(GPIOB,&GPIO_InitStructure)://初始化GPIO
参考资料:野火stm32学习
正点原子stm32F407ZGT6最小系统板