STM32F103RCT6芯片IO口模式个人理解


IO端口位:如PA5/PC10/PE7等

IO端口位可以配置为8种模式,给人眼花缭乱、不知所措的感觉。如何才能正确掌握端口位的配置,成为悬在每一位嵌入式初级工程师心上的难题。接下来,我们就试图破除阻碍我们继续前进的这块石头。

虽然IO端口位在单片机内部分为输入通道和输出通道,但对外共用一个通道。为什么要设计为共用呢?因为可以节约硬件资源、简化硬件设计。不过,虽然是共用,但在任意时刻,输入和输出只能二选一。这是很好理解的:一条只有一车宽的马路,面对面行驶的两辆车必然冲突。所以,当端口位在输出模式时,读取输入数据寄存器,实际上读的是输出的内容;当端口位在输入模式时,读取输出数据寄存器,实际上读的是上次输出的内容。

 图1 IO端口硬件电路

 

为了避免混淆和冲突,在使用IO端口位时,输入时刻请配置为输入模式,输出时刻请配置为输出模式。为了更好地理解输入模式和输出模式之间的区别,下面我们结合图1进行讲解。

 

输出模式

 

输出模式其实只有两种:推挽输出模式和开漏输出模式(使用复用功能就配置为复用输出模式,区别在于输出源的不同)。
配置IO端口位为推挽输出模式。当我们输入1到“输出控制”单元,则“输出控制”单元就输出A为1,B为1,从而使PMOS导通,NMOS截止,IO端口位就和VDD导通,从而输出1;当我们输入0到“输出控制”单元,则“输出控制”单元就输出A为0,B为0,从而使PMOS截止,NMOS导通,IO端口位就和GND导通,从而输出0。(至于“输出控制”单元内部原理,我们不需要知道)
配置IO端口位为开漏输出模式。“输出控制”单元始终输出A为0,也就是PMOS始终截止。当我们输入1到“输出控制”单元,则“输出控制”单元就输出B为1,从而使NMOS截止,IO端口位浮空,状态不定;当我们输入0到“输出控制”单元,则“输出控制”单元就输出B为0,从而使NMOS导通,IO端口位就和GND导通,从而输出0。所以,开漏输出模式下,只能输出低电平,反而是输入1到“输出控制”单元使IO口浮空时,就可以读取外部输入了。很奇怪,输出模式反而成为输入模式了。

因此,配置IO端口位为开漏输出模式时,我们一般要外接上拉电阻。上拉电阻和上拉PMOS是有区别的:上拉电阻诞生了所谓的“准双向口”(所以读取外部输入状态要先写1)。
参考图1并想象外部上拉电阻,我们重新分析配置IO端口位为开漏输出模式时的输出情况。“输出控制”单元始终输出A为0,也就是PMOS始终截止。当我们输入1到“输出控制”单元,则“输出控制”单元就输出B为1,从而使NMOS截止,IO端口位被上拉电阻上拉到VDD,从而输出1(根据阻值大小分为弱上拉和强上拉);当我们输入0到“输出控制”单元,则“输出控制”单元就输出B为0,从而使NMOS导通,IO端口位就和GND导通,从而输出0(注意,强上拉再强也强不过直连导通,所以不会上拉到VDD)。很好,开漏输出模式也能输出0和1了。此外,如果要把IO端口位作为准双向口使用,就必须先写1使NMOS截止。

最后呢,我不建议将其作为准双向口,不规范,也没必要,如果要输入就配置为输入模式呗。好的,下面我们再说说输入模式。

 

输入模式

 

除了模拟输入一般作为ADC输入使用,其余三个大多数时候通用哦。上拉输入和下拉输入正如前面所说,强拉再强也强不过直连导通,所以都是可以正常获取外部的输入状态。采用上拉和下拉的好处是可以避免出现不定状态,防止外部干扰。在浮空输入模式下,IO端口位的输入阻抗很高,不过易受干扰。至于浮空输入模式有什么用,后续还需要学习补充。

 

 

STM32F103上拉/下拉输入模式

GPIOMode_TypeDef中关于上拉/下拉输入模式的两个枚举常量的定义如下

GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,

这两个的低位都是1000,高位一个是0010一个是0100,在GPIO的初始化函数最后进行如下区分

if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)  GPIOx->BRR = (((uint32_t)0x01) << pinpos);  /* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)  GPIOx->BSRR = (((uint32_t)0x01) << pinpos);  /* Set the corresponding ODR bit */

说明高位是用来区分设置的模式是IPU还是IPD,从而用来初始化IO端口的输出用的。
那么,为什么要有上拉/下拉输入模式呢?
如果没有上拉/下拉输入模式而选择浮空输入,那么就要由外设决定电平,但是这有局限性:外设不能有高阻态。因为浮空输入时IO口电平不稳定、受外界影响较大。比如按键通常在松开时就处于浮空状态。而上拉/下拉提供了一个强抗干扰模式,比如低电平有效,就可以设置上拉输入模式,这样就在没有触发电平的时候,IO口维持一个高电平,就可以抵抗较强的干扰!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM