STM32基础篇--GPIO
1. 引言
GPIO的全称是Genral purpose input output,简称IO口,一般用于控制连接在GPIO口上的外设。大家可能只看了STM32的固件库怎么配置,但是可能会遗漏为什么要这样配置。本讲将从GPIO的工作原理出发进行讲解。
2. GPIO工作原理
GPIO的每个位可由软件配置成多种模式,如下图所示:
总结来说,GPIO可配置为输入和输出。接下来根据GPIO原理图来介绍各个输入/输出方式,其原理图如下所示:
从又往左介绍一下上述原理图中的几个关键部分:
2.1 输入
保护二极管:二极管由于单向导电性,具有钳位的作用。此处用于防止外部IO引脚电压过高或者过低,当IO引脚电压过高时,上方二极管导通,此时电压被拉到VDD;当IO引脚电压过低时,下方二极管导通,电压被拉到VSS。这样做的目的是防止不正常的电压进入芯片导致芯片烧毁。
输入驱动器:很明显,当配置成输入模式时,信号需要从输入驱动器进入。输入驱动器由上下拉电阻、肖特基触发器组成。先来说上拉以及下拉电阻。上、下拉电阻的作用是将浮空的引脚拉到一个固定的状态(0或者1)。比如当配置成上拉输入时,代表将浮空引脚上拉到VDD,此时初始的状态确定为1,代表该输入IO口期望输入一个低电平;配置成下拉输入时,代表将引脚拉到GND,此时初始状态确定为0,代表该输入IO口期望输入一个高电平;当都不配置时,默认为浮空输入,此时该输入IO口高电平和低电平都有效(现在明白了配置IO口时不同的输入方式的区别了吗,当你期望给IO口输入一个低电平时,此时就该配置成上拉输入)。
引申:当使用外部中断时需要指定期望的输入方式,如果不指定,默认为浮空输入,此时无论高电平或者低电平都能误触中断。
肖特基触发器:当信号经过该触发器以后,模拟信号转换为数字信号0和1。因此当你用ADC功能时,需要配置成模拟输入,就不会经过该触发器,输入的就是模拟信号。
输入数据寄存器:从该寄存器将输入值读出到芯片。
2.2 输出
说完了输入方式,接下来介绍输出。首先是输出数据寄存器:此寄存器的值会通过输出驱动器输出,用于决定是P-MOS导通,还是N-MOS导通。
输出驱动器:输出驱动器里边的关键部分是一对P-MOS和N-MOS组成的推挽结构。当配置成推挽输出时,当连接到P-MOS的栅极信号为低电平时,此时P-MOS管导通,VDD经过P-MOS输出到IO口,此时代表输出1;当连接到N-MOS的栅极信号为高电平时,此时N-MOS导通,VSS经过N-MOS输出到IO口,代表输出0(看上图)。因此,实际上点亮一颗LED时,都是靠的外部电源VDD/VSS供电进行点亮的,此时P-MOS/N-MOS就是一个开关。
当配置成开漏输出时,只能输出低电平0。即N-MOS管导通时,输出低电平;P-MOS断开不能使用,此时为高阻态。当为开漏时要想输出高电平,可在外部接上拉电阻来实现。
当配置成复用功能输出时,此时外部IO引脚和输出数据寄存器断开,并和片上外设的输出信号连接,即输出信号不再经过输出数据寄存器。
引申:开漏和推挽的区别--如果想要电平转换速度快,选推挽,但功耗相对较高;如果想要功耗低,且实现“线与”功能,选择开漏。
3. 软件设计
了解上述GPIO工作原理之后,怎么通过代码将GPIO用起来呢?答案在寄存器上,通过上述GPIO的工作原理了解到需要从输入/输出数据寄存器上去读或者写。而一般半导体厂商会将寄存器映射到某个地址(如下图所示),因此就可以通过操作地址去操控寄存器了,这也是用C语言开发的原因(由于指针特性)。
即当将数据写入某个寄存器时,也就是将数据写入到某个地址;当将数据从某个寄存器读出来时,也是去取某个地址的数据。STM32的固件库底层原理就是这样实现的。其他的代码及寄存器配置本讲不再多说,大家可以自行去看一下固件库的具体实现。
4. 参考文献
[1] STM32中文参考手册_V10;
[2] STM32F103开发指南