我用的是正点的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口。
|