STM32中GPIO分析

今天从软件使用的角度做一下STM32的GPIO的硬件上的分析。

STM32的GPIO内部的结构大致如下所示:


这个结构中主要有两块路,一个是蓝色线包含的部分是输入驱动电路。一个是红色线包含的部分,输出驱动电路。下面分开分析这两部分。

输出驱动电路


当对相应的寄存器设置成输出模式的时候,上面的输入驱动电路就会被屏蔽掉,不工作,下面的输出驱动电路工作由图可知,数据的输出有两种方式,一种是通过写操作向位设置/清除寄存器中进行操作来改变输出数据寄存器中的值,另一种是直接对输出数据寄存器进行写,当然也可以对输出寄存器中的数据读取操作。大家都知道STM32为了节省I/O口,使用了I/O口的复用功能。所以当该I/O口设置为复用功能的时候,图中圆圈标识的“门”就会选择复用功能的数据就行输出。输出驱动电路中有两个MOS管,这两个管子是相反的,控制着输出“1”或者“0”,输出驱动电路根据不同的需要可以配置成4种不同的输出方式分别是开漏输出(P-MOS管断开),推挽输出(两个MOS管都正常工作),复用开漏输出,复用推挽输出。

输入驱动电路

当对相应的寄存器设置成输入模式的时候,上面的输出驱动电路就会被屏蔽掉,不工作。输入驱动电路中有两个开关,控制着输入的上拉、下拉或者浮空,I/O可以根据不同的需要设置成4种输入模式,分别是模拟输入,浮空输入(两个开关断开),上拉输入(下面的开关断开),下拉输入(上面的开关断开)。加上输出的四种模式共有8种模式。  输入驱动电路中有一个施密特触发器,能够滤除高峰,进行滤波,对电压与信号进行整形,再一个作用就是对数据进行锁存(施密特触发器的详细解释这里不再阐述,有兴趣的朋友可以自行查阅资料)。由图中可以看出,输入的数据有三个去向,一个是不经过施密特触发器的模拟输入,另外两个是经过施密特触发器的复用功能输入和存入输入数据寄存器。根据相关寄存器的配置选择具体的需要。

GPIO的相关寄存器

每个GPI/O端口有两个32位配置寄存器(GPIOx_CRLGPIOx_CRH),两个32位数据寄存器(GPIOx_IDRGPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR),锁存寄存器就是用来控制施密特触发器的,对数据进行锁存。每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访
)GPIOx_BSRRGPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。


猜你喜欢

转载自blog.csdn.net/david_361/article/details/80034435