|
我用的是正点的STM32F767来进行学习。之后的这个系列笔记开头未标明的话,用的也是这个板子。
GPIO的控制部分还未完成,理解这一部分对于我这个小菜鸡属实吃力不少
七、GPIO基础知识
1、GPIO介绍
GPIO(全称:General Purpose Input Output(通用输入输出端口))是一款端口扩展器,可以做输入也可以做输出。GPIO端口可通过程序配置成输入或者输出。
GPIO具有低功耗、小封装、低成本、布线简单等优点。
STM32的引脚中,有部分是做GPIO使用,部分是电源引脚/复位引脚/启动模式引脚/晶振引脚/调试下载引脚。
2、GPIO八种工作模式解释(STM32)
本小节图片引用自【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
在Cortex-M3里,对于GPIO的配置种类有8种:
GPIO_Mode_AIN 模拟输入GPIO_Mode_IN_FLOAtiNG 浮空输入GPIO_Mode_IPD 下拉输入GPIO_Mode_IPU 上拉输入GPIO_Mode_Out_OD开漏输出GPIO_Mode_Out_PP 推挽输出GPIO_Mode_AF_OD 复用开漏输出GPIO_Mode_AF_PP 复用推挽输出 
1)4种输入模式
(1)浮空输入
GPIO_Mode_IN_FLOATING- 作用:
当输入一个高电平时,会检测到高电平; 当输入低电平时,会检测到低电平; 当无信号输入时,该端口的电平是不确定的。 - 原理:
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。 当引脚悬空(在无信号输入)的情况下,I/O的电平状态是不确定的,会因为各种各样的情况受到干扰。  - 参考资料:
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图) GPIO工作模式
(2)上拉输入
GPIO_Mode_IPU- 作用:
当输入一个高电平时,会检测到高电平; 当输入低电平时,会检测到低电平; 当无信号输入时,会检测到高电平。 - 原理:
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。 当输入一个高电平时,VDD不产生影响; 当输入低电平时,上拉电阻压降为VDD,VDD不产生影响; 当无信号输入时,由于上拉电阻电流很小,所以降压很低,故会检测到高电平。  - 参考资料:
视频12分50秒 【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图) GPIO工作模式
(3)下拉输入
GPIO_Mode_IPD- 作用:
当输入一个高电平时,会检测到高电平; 当输入低电平时,会检测到低电平; 当无信号输入时,会检测到低电平。 - 原理:
下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。 当输入一个高电平时,下拉电阻电流很小,VSS不产生影响; 当输入低电平时,VSS不产生影响; 当无信号输入时,下拉电阻两端皆为低电平,故会检测到低电平。  - 参考资料:
【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图) GPIO工作模式
(4)模拟输入
GPIO_Mode_AIN- 作用:
将不会检测到电平信息,会检测到完整的电压变化。 - 原理:
模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到外设模块,比如ADC模块等等。  - 参考资料:
GPIO工作模式 【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
2)4种输出模式(带上下拉)
(1)开漏输出(带上拉或者下拉)
GPIO_Mode_Out_OD- 作用:
当设置输出为高电平时,端口输出高低电平由端口外的上拉或下拉决定。 当设置输出为低电平时,端口输出低电平。 当输出低电平以后,端口可以进行输入。 - 原理:
当设置输出为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定; 当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。 同时,I/O端口的电平也可以通过输入电路进行读取; 注意,I/O端口的电平不一定是输出的电平,电平由上拉电阻控制。  - 参考资料:
GPIO工作模式 【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
(2)复用开漏输出(带上拉或者下拉)
GPIO_Mode_AF_OD- 作用:
当外设输出为高电平时,端口输出高低电平由端口外的上拉或下拉决定。 当外设输出为低电平时,端口输出低电平。 当输出低电平以后,端口可以进行输入。 - 原理:
与开漏输出相同,只不过由外设控制高低电平。  - 参考资料:
GPIO工作模式 【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
(3)推挽式输出(带上拉或者下拉)
GPIO_Mode_Out_PP- 作用:
当设置输出为高电平时,端口输出高电平。 当设置输出为低电平时,端口输出低电平。 当输出低电平以后,端口可以进行输入。 - 原理:
当设置输出为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的高电平由P-MOS管的VDD决定; 当设置输出的值为低电平的时候,N-MOS管处于开启状态,P-MOS管处于关闭状态,此时I/O端口的电平就是低电平。  - 参考资料:
GPIO工作模式 【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
(4)复用推挽输出(带上拉或者下拉)
GPIO_Mode_AF_PP- 作用:
当外设输出为高电平时,端口输出高电平。 当外设输出为低电平时,端口输出低电平。 当输出低电平以后,端口可以进行输入。 - 原理:
与推挽输出相同,只不过由外设控制高低电平。  - 参考资料:
GPIO工作模式 【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)
3)八种工作模式的区别
(1)什么是推挽结构和推挽电路?
推挽结构一般是指两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定。 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
(2)开漏输出和推挽输出的区别?
开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内); 推挽输出:可以输出强高、低电平,连接数字器件。 关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:  该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。右边的则可以理解为开漏输出形式,需要接上拉。
(3)在STM32中选用怎样选择I/O模式?
- 浮空输入
_IN_FLOATING ——浮空输入,可以做KEY识别,RX1 - 带上拉输入
_IPU——IO内部上拉电阻输入 - 带下拉输入
_IPD—— IO内部下拉电阻输入 - 模拟输入
_AIN ——应用ADC模拟输入,或者低功耗下省电 - 开漏输出
_OUT_OD——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51 \ STM32的IO双向功能 - 推挽输出
_OUT_PP——IO输出0接GND, IO输出1接VCC,读输入值是未知的 - 复用功能的推挽输出
_AF_PP ——片内外设功能(I2C的SCL、SDA) - 复用功能的开漏输出
_AF_OD——片内外设功能(TX1、MOSI、MISO.SCK.SS)
(4)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;
4)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 的负载,并且同时只能使用一个引脚!!!
5)上电复位后IO口状态
上电复位后,GPIO默认为输入浮空状态,部分特殊功能引脚为特定状态。
复位后,调试引脚处于复用功能上拉/下拉状态:
PA15:JTDI处于上拉状态PA14:JTCK/SWCLK处于下拉状态PA13:JTMS/SWDAT处于下拉状态PB4:NJTRST处于上拉状态PB3:JTDO处于浮空状态
3、开发板芯片的引脚常用参数
注:由于我使用的是STM32F767,所以本小节分析STM32F767IGT6的参数
 
- 引脚数量:176 / 4个方向
- 主频:180 MHz
- 内核:
ARM Cortex-M7 - Flash:1024 KB
- 封装:
LQFP176 - 通用IO数量:132
- 最低工作电压:1.7 V
- 最高工作电压:3.6 V
- 一共9组IO:
PA ~ PI PA~ PH每组16个IO(Pa0 ~ Pa15),PI只有12个IO(PI0 ~ PI11) 共140个IO口。     
|