此篇文章重点讨论STM32的GPIO的配置种类以及上拉输入、下拉输入、浮空输入、模拟输入的区别
经过学习STM32发现,GPIO有8种工作方式
输入模式:输入浮空、输入上拉、输入下拉、模拟输入
输出模式:开漏输出、开漏复用功能、推挽式输出、推挽式复用功能
输入模式参照图片来讲
浮空输入:浮空输入状态下上拉电阻和下拉电阻都是断开的,信号经过I/O端口——施密特触发器——输入数据寄存器——CPU读取
上拉输入:相比浮空输入状态,就是上拉电阻闭合(下拉电阻仍然处于断开状态)
下拉输入:相比浮空输入状态,就是下拉电阻闭合(上拉电阻仍然处于断开状态)
模拟输入:上拉电阻和下拉电阻都处于断开状态,并且信号不是经过施密特触发器,而是直接进入施密特触发器之前的模拟输入通道
输出模式也参照图片来讲:
开漏输出模式:其中1号区域,两个寄存器有两种读写方式,这个后面会介绍,这是关于寄存器的配置原因,对于输出驱动器部分,当输出控制电路输出逻辑1(高电平)时,外部的I/O端口输出的电平由外部电路决定,如果外部连接有上拉电阻,则输出高电平,如果接有下拉电阻,则输出低电平;当输出控制电路输出逻辑0(低电平)时,外部的电路不管是否接有上拉电阻还是下拉电阻,都输出低电平;所有应用开漏输出模式的时候想要输出高电平切记要加上拉电阻
开漏复用功能输出:此模式与开漏输出模式只有一个不同的地方,就是在1号区域,此模式是直接在复用功能输出引输出部分输出的
推挽输出模式:也是走的1、2、3、4号路线,其中在2号区域输出控制电路部分,如果输出逻辑1,则3号区域P-MOS导通,N-MOS截止,输出高电平(不管外部有没有上拉电阻);如果输出逻辑0,则3号区域P-MOS截止,N-MOS导通,输出低电平(不管外部有没有上拉电阻和下拉电阻)
推挽复用功能输出:此模式与推挽输出模式不同的地方就是1号区域,此模式是直接在复用功能输出部分输出的
下面讲解一下输出模式与寄存器的关系
在STM32的参考手册中我们可以找到GPIOx_CRL和GPIOx_CRH寄存器,这两个寄存器功能相同,就是GPIOx_CRL是用来配置低8位(例:PA0_PA7)I/O口的,GPIOx_CRH是用来配置高8位(例:PA8_PA15)I/O口的
这是一个32位寄存器,每4位配置一个端口,例:第1位和第0位即MODE0[1:0],用来设置Px0(PA0 or PB0 or PC0 and so on)是输入还是输出,第3位和第2位即CNF0[1:0],用来选择Px0的输入或者输出的具体模式。
其中有一个地方值得注意,就是在输入模式下,CNFx=10的状态:上拉/下拉输入模式,到底是上拉输入模式还是下拉模式就要用到另一个寄存器GPIOx_ODR,并且这个寄存器对输入和输出有着不同的作用
这是一个32位寄存器,高16位保留,低16位每位对应Px的一个I/O口
在输入模式下,如果对应位置1,则为上拉输入;如果对应位置0,则为下拉输入
在输出模式下,如果对应位置0,则是要求输出端口输出默认输出高电平,注意:此处,若为开漏输出模式,若想输出高电平需要外界上拉电阻
具体对应关系见下表:
还有一个寄存器需要介绍,端口位设置/清除寄存器(GPIOx_BSRR)
在输出模式下,可以通过配置这个寄存器决定到底是输出高电平还是低电平,低16位置1,则对应端口输出高电平,高16位置1,则对应端口输出低电平
这个寄存器就是上面讲解输出模式时的疑问
配置输出模式时,可以通过配置寄存器GPIOx_BSRR然后映射到寄存器GPIOx_ODR,也可以直接配置寄存器GPIOx_ODR,但是对于运行效率来说,还是通过GPIOx_BSRR映射到GPIOx_ODR效率更高。