GPIO 简介3 d% G9 G' Z5 S. y4 q* o# [ + H! A" H# x% t/ W GPIO=General Purpose Input Output,通用输入输出。简称为“IO口”。/ l. {1 W4 ~8 e/ E+ M5 R; ` i! g( C GPIO 是通用输入输出端口的简称,STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组,每组有 16 个引脚,如型号为 STM32F4IGT6 型号的芯片有 GPIOA、GPIOB、GPIOC至 GPIOI 共 9 组 GPIO,芯片一共 176 个引脚,其中 GPIO 就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能。 1 x% x; ^- X7 M' t& [2 O w 最基本的输出功能是由 STM32 控制引脚输出高、低电平,实现开关控制,GPIO口是怎么被控制的呢?通过软件代码。需要亮灯的时候调用GPIO口拉高的函数,需要熄灯的时候调用GPIO拉低的函数,即可实现控制。如把 GPIO 引脚接入到 LED 灯,那就可以控制 LED 灯的亮灭。最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过电平高低区分按键是否被按下。5 ]" |# h, b, H: k6 d GPIO除了简单的输入输出之外,还可以做一些相对复杂的操作,例如模拟I2C或SPI数据线、ADC电压检测、输出PWM波形等。 0 G8 \0 X) a- w5 L9 P0 I6 h w GPIO框图/ L4 z1 P' ?2 ?5 X1 A% ]7 c & D/ h7 Z* U7 x- d; A* ] 7 P- u: K; g1 g5 ^: s7 U 保护二极管及上、下拉电阻3 H* E% N/ Z7 D& b4 R# `+ N; }: y+ H 通过上、下拉对应的开关配置,我们可以控制引脚默认状态的电压,开启上拉的时候引脚电压为高电平,开启下拉的时候引脚电压为低电平,这样可以消除引脚不定状态的影响。如引脚外部没有外接器件,或者外部的器件不干扰该引脚电压时,STM32 的引脚都会有这个默认状态。也可以设置“既不上拉也不下拉模式”,我们也把这种状态称为浮空模式,配置成这个模式时,直接用电压表测量其引脚电压为 1 点几伏,这是个不确定值。所以一般来说我们都会选择给引脚设置“上拉模式”或“下拉模式”使它有默认状态。/ Z+ L3 c3 ]# u. v! N) F STM32 的内部上拉是“弱上拉”,即通过此上拉输出的电流是很弱的,如要求大电流还是需要外7 P7 H3 Q# q/ ~3 t0 a 部上拉。通过“上拉/下拉寄存器 GPIOx_PUPDR”控制引脚的上、下拉以及浮空模式。 用于输入模式时,可设置为上拉、下拉或浮空模式- ? Q7 w Z+ @6 \ 5 p/ A/ b u! G) I P-MOS 管和 N-MOS 管6 V/ x/ X7 ~/ B' P z" p 输出模式部分,线路经过一个由 P-MOS 和 N-MOS 管组成的单元电路。这个结构使 GPIO 具有了“推挽输出”和“开漏输出”两种模式。 推挽输出模式,是根据这两个 MOS 管的工作方式来命名的。输入高电平时,上方的 P-MOS 导通,下方的 N-MOS 关闭,对外输出高电平,输入低电平时反之。 推挽输出的低电平为0 伏,高电平为3.3 伏,它是推挽输出模式时的等效电路。 & z& I9 {- Y5 z/ W 通过“输出类型寄存器 GPIOx_OTYPER 可以控制 GPIO 端口是推挽模式还是开漏模式。/ \5 i$ }1 j+ |" ?$ y+ ^ 1 v. j: E- D" e. c; l* V2 m' q 输出数据寄存器 置位/复位寄存器GPIOx_BSRR可以通过修改输出数据寄存器的值从而影响电路的输出。- B( \# K6 B% ` ) p/ u9 _/ c5 s2 O% C& g3 D 复用功能输出5 B. U5 D0 m3 T9 { d& q ) `0 H+ p' v5 V; J- s 使用 USART 串口通讯时,需要用到某个 GPIO 引脚作为通讯发送引脚,这个时候就可以把该 GPIO 引脚配置成 USART 串口复用功能,由串口外设控制该引脚,发送数据。4 W0 B8 m W Q 输入数据寄存器 连接到施密特触发器,信号经过触发器后,模拟信号转化为 0、1 的数字信号,然后存储在“输入数据寄存器GPIOx_IDR”中,通过读取该寄存器就可以了解 GPIO 引脚的电平状态。/ {# n7 }( B0 @; u4 Q. b4 | + K7 \7 q# o2 y; f( ?6 |& D! Z! _ 复用功能输入 和复用功能输出一致,发送变接收。7 L, V( r$ c! _. @! M, @9 A7 g 模拟输入输出 1 o* {& i& C1 I9 n$ [ 当 GPIO 引脚用于 ADC 采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有 0、1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。反之作为模拟输出,当 GPIO 用于模拟功能时 (包括输入输出),引脚的上、下拉电阻是不起作用的,即使在寄存器配置了上拉或下拉模式,也不会影响到模拟信号的输入输出。 # e. A% O* j% `% t; V5 T 正点原子F429原理图4 \% u5 T$ [2 ? 4 }( i0 q, w( L* z3 S. d: O) N ' E/ y( m% ~; s1 ?$ g) n: |$ X 图中PB0和PB1就是控制正点原子板子上两个LED灯的IO口。9 M/ i& m& a a 1 Y# h7 _5 O& T8 e |
STM32固件库分享,超全系列整理
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32F4中文用户手册
基于STM32F407的FreeRTOS阶段性的总结(13)
STM32F400、STM32F402 Cortex-M4超值单片机
基于STM32F407的FreeRTOS获取各任务运行时间及占用情况(4)
基于STM32F407的FreeRTOS任务的挂起与恢复(3)
基于STM32F407的FreeRTOS任务的创建与删除经验分享(2)
基于STM32F407的FreeRTOS环境搭建经验分享(1)