STM32中IO端口位的基本结构及相关寄存器

1. GPIO概述

GPIO是通用输入/输出端口的简称、是STM32可控制的引脚。GPIO的引脚与外部硬件设备链接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。每个通用 I/O 端口包括4 个 32 位配置寄存器:GPIO 端口模式寄存器(GPIOx_MODER)、GPIO 端口输出类型寄存器(GPIOx_OTYPER)、GPIO 端口输出速度寄存器(GPIOx_OSPEEDR)、GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR);2 个 16位数据寄存器:GPIO 端口输入数据寄存器(GPIOx_IDR) 、GPIO 端口输出数据寄存器(GPIOx_ODR);1 个 32 位置位/复位寄存器(GPIOx_BSRR);1 个 32 位配置锁定寄存器(GPIOx_LCKR);2 个 32 位复用功能选择寄存器:GPIO 复用功能低位寄存器(GPIOx_AFRL)、GPIO 复用功能高位寄存器(GPIOx_AFRH)——配置对应的 IO 口。

以下是经典IO端口位的基本结构:

STM32中IO端口位的基本结构及相关寄存器_第1张图片

1.1 保护二极管

IO引脚上下两边两个⼆极管⽤于防⽌引脚外部过⾼/过低的电压输⼊,当引脚电压⾼于VDD时,上⽅的⼆极管导通,当引脚电压低于VSS时,下⽅的⼆极管导通,防⽌不正常电压引⼊芯⽚导致芯⽚烧毁。尽管如此,还是不能直接外接⼤功率器件,须加⼤功率及隔离电路驱动,防⽌烧坏芯⽚或者外接器件⽆法正常⼯作。

1.2 P-MOS管和N-MOS管

GPIO为输出模式,由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这两个MOS管接管电路的输⼊信号是由GPIO的输出数据寄存器GPIOx_ODR提供的,也就是我们可以通过编程修改GPIOx_ODR寄存器的值从⽽影响该单元电路的输出。

设置置位/复位寄存器GPIOx_BSRR和复位寄存器GPIOx_BRR也能影响GPIOx_ODR,进⽽影响单元电路输出。

除此,还有复⽤功能输出,意思是指STM32的其它⽚上外设对GPIO引脚进⾏控制,此时该引脚作为外设功能的⼀部分。⽚上外设数据信号作为双MOS管接管的输⼊,进⽽输出到GPIO引脚中。例如USART串⼝通讯,要⽤到某个GPIO 引脚作为通讯发送引脚,就可以把该GPIO 引脚配置成USART 串⼝复⽤功能,由串⼝外设控制该引脚,发送数据。

1.3 TTL施密特触发器

GPIO为输入模式,GPIO引脚经过内部上/下拉电阻配置成上/下拉、或者浮空输⼊,然后连接到施密特触发器。信号经过触发器后,模拟信号转化为0和1的数字信号,然后存储在输⼊寄存器GPIOx_IDR中,通过读取GPIOx_IDR寄存器就可以知道GPIO的电平状态。

同理,与复⽤功能输出类似,也有复⽤功能输⼊,GPIO引脚的输⼊信号会传输到STM32的其他⽚上外设,由外设去读取该引脚状态。例如使⽤USART串⼝通讯,⽤某个GPIO引脚作为通讯的接收引脚。

另外,当GPIO引脚作为ADC采集电压的输⼊通道时,⽤其“模拟输⼊”功能,此时信号不再经过触发器进⾏TTL电平转换。ADC外设要采集到的原始的模拟信号。类似的,当GPIO引脚⽤于DAC模拟电压输出通道时,此时作为“模拟输出”功能,DAC信号输出不经过双MOS管。

2. GPIO端口模式

2.1 输入配置

对 I/O 端口进行编程作为输入时:

● 输出缓冲器被关闭

● 施密特触发器输入被打开

● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻

● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

● 对输入数据寄存器的读访问可获取 I/O 状态

2.2输出配置

对 I/O 端口进行编程作为输出时:

● 输出缓冲器被打开:

        — 开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端口保持高组态         (Hi-Z)(P-MOS 始终不激活)。

        — 推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活P-MOS。

● 施密特触发器输入被打开

● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

● 对输入数据寄存器的读访问可获取 I/O 状态

● 对输出数据寄存器的读访问可获取最后的写入值

2.3 复用功能配置

对 I/O 端口进行编程作为复用功能时:

● 可将输出缓冲器配置为开漏或推挽

● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)

● 施密特触发器输入被打开

● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

● 对输入数据寄存器的读访问可获取 I/O 状态

2.4 模拟配置

对 I/O 端口进行编程作为模拟配置时:

● 输出缓冲器被禁止。

● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。

● 弱上拉和下拉电阻被关闭。

● 对输入数据寄存器的读访问值为“0”。

 

你可能感兴趣的:(stm32,单片机,arm)