STM32微控制器通用输入/输出模块详解
目录
概述
通用输入/输出(GPIO)模块是STM32微控制器中最基本且最重要的外设之一。它允许微控制器与外部世界进行数字信号的交互,如读取开关状态、控制LED、与其他数字设备通信等。GPIO模块的灵活性和多功能性使其在各种嵌入式应用中广泛使用。
GPIO模块结构
STM32的GPIO模块通常由多个引脚组成,每个引脚都可以独立配置为输入、输出、复用功能或模拟模式。每个GPIO端口(如GPIOA、GPIOB等)包含16个引脚(PA0-PA15,PB0-PB15,依此类推)。每个引脚的功能和行为由相关寄存器控制。
GPIO寄存器详解
GPIO模块通过一组寄存器来控制每个引脚的功能。这些寄存器包括:
MODER寄存器
- 功能:设置每个引脚的模式(输入、输出、复用功能、模拟)。
- 寄存器地址:
GPIOx_MODER
- 配置:
- 每个引脚占用2位:
00
:输入模式01
:输出模式10
:复用功能模式11
:模拟模式
- 每个引脚占用2位:
OTYPER寄存器
- 功能:配置输出引脚的类型(推挽、开漏)。
- 寄存器地址:
GPIOx_OTYPER
- 配置:
- 每个引脚占用1位:
0
:推挽输出1
:开漏输出
- 每个引脚占用1位:
OSPEEDR寄存器
- 功能:设置输出引脚的速度(低速、中速、高速、非常高速)。
- 寄存器地址:
GPIOx_OSPEEDR
- 配置:
- 每个引脚占用2位:
00
:低速01
:中速10
:高速11
:非常高速
- 每个引脚占用2位:
PUPDR寄存器
- 功能:配置引脚的上拉/下拉电阻。
- 寄存器地址:
GPIOx_PUPDR
- 配置:
- 每个引脚占用2位:
00
:无上下拉01
:上拉10
:下拉11
:保留
- 每个引脚占用2位:
IDR和ODR寄存器
- IDR(输入数据寄存器):
- 功能:读取引脚的输入状态。
- 寄存器地址:
GPIOx_IDR
- ODR(输出数据寄存器):
- 功能:设置引脚的输出状态。
- 寄存器地址:
GPIOx_ODR
BSRR寄存器
- 功能:快速设置或重置引脚的输出状态。
- 寄存器地址:
GPIOx_BSRR
- 配置:
- 前16位用于设置引脚,高16位用于重置引脚。
AFR寄存器
- 功能:配置引脚的复用功能。
- 寄存器地址:
GPIOx_AFRL
(低8引脚)和GPIOx_AFRH
(高8引脚) - 配置:
- 每个引脚占用4位,用于选择复用功能编号(0-15)。
LCKR寄存器
- 功能:锁定引脚配置,防止意外修改。
- 寄存器地址:
GPIOx_LCKR
- 配置:
- 通过特定的锁定序列,可以锁定引脚的配置。
GPIO模式与配置
输入模式
在输入模式下,引脚用于接收外部信号。常用于读取按钮状态、传感器数据等。
配置步骤:
- 将对应位在
MODER
寄存器中设置为00
。 - 根据需要,在
PUPDR
寄存器中启用上拉或下拉电阻。
输出模式
在输出模式下,引脚用于发送信号,控制LED、驱动继电器等。
配置步骤:
- 将对应位在
MODER
寄存器中设置为01
。 - 配置输出类型(推挽或开漏)在
OTYPER
寄存器。 - 设置输出速度在
OSPEEDR
寄存器。 - 使用
ODR
或BSRR
寄存器控制引脚状态。
复用功能模式
复用功能模式允许引脚用于其他外设,如USART、SPI、I2C等。
配置步骤:
- 将对应位在
MODER
寄存器中设置为10
。 - 在
AFR
寄存器中选择所需的功能。
模拟模式
模拟模式用于模拟信号处理,如ADC输入、DAC输出。
配置步骤:
- 将对应位在
MODER
寄存器中设置为11
。
GPIO的电气特性
输入电阻和漏电流
-
输入电阻:GPIO输入引脚具有高输入阻抗,通常在兆欧级别。这意味着它们对外部信号源的负载非常小,几乎不会影响信号源的电压。
R i n ≈ 1 0 6 Ω R_{in} \approx 10^6 \, \Omega Rin≈106Ω
-
漏电流:GPIO输入引脚的漏电流非常低,通常在微安级别。
I l e a k ≈ μ A I_{leak} \approx \mu A Ileak≈μA
输出驱动能力
-
推挽输出:可以同时驱动高电平和低电平,驱动能力强,适用于大多数数字输出需求。
-
开漏输出:只能驱动低电平,需要外部上拉电阻,适用于I2C总线等需要多设备共享总线的场合。
驱动电流公式:
I o u t = V O H − V O L R l o a d I_{out} = \frac{V_{OH} - V_{OL}}{R_{load}} Iout=RloadVOH−VOL
- V O H V_{OH} VOH:高电平输出电压
- V O L V_{OL} VOL:低电平输出电压
- R l o a d R_{load} Rload:负载电阻
电压等级和容限
-
电压等级:GPIO引脚的工作电压通常与微控制器的供电电压一致(如3.3V或5V)。
-
电压容限:GPIO引脚对输入电压有一定的容限,过高或过低的电压可能会损坏微控制器。
V m i n ≤ V i n ≤ V m a x V_{min} \leq V_{in} \leq V_{max} Vmin≤Vin≤Vmax
其中,通常 V m a x = V D D + 0.3 V V_{max} = V_{DD} + 0.3V Vmax=VDD+0.3V, V m i n = − 0.3 V V_{min} = -0.3V Vmin=−0.3V。
GPIO数学基础
电阻分压公式
在配置上拉或下拉电阻时,常用电阻分压公式来计算引脚电压。
V p i n = V C C × R 2 R 1 + R 2 V_{pin} = V_{CC} \times \frac{R_2}{R_1 + R_2} Vp