目录
- 【超详细】output level 和 pull up/ pull down 的真正区别
- 1. Output Level
- 2. Pull up/ Pull down
- 3. 两者的区别
- 1)对于Output口来说
- 2)而对于Input口来说
- 总结
- 参考资料
【超详细】output level 和 pull up/ pull down 的真正区别
今天在使用stm32f103c8t6,利用GPIO口实现开关信号的时候遇见了这个问题。我将开关的两端分别接在两个GPIO口上,一个IO口设为Input,一个IO口设为Output。我希望开关未导通时,Input口为高电平,导通后为低(这么做的原因见下文)。当我看见output level和pull up/ pull down这两个选项的时候,晕乎乎不知道到底有什么区别。查了很多资料,加上亲自利用串口输出和万用表做实验,终于有了眉目。这里总结一下。
1. Output Level
这一条仅适用于被设置为Output
的GPIO口。通常有两种选项:高电平/ 低电平
,分别代表将该Output口设为默认输出高电平/ 默认输出低电平
。
这点很好理解,完全就是字面意思:程序初始化之后该Output口输出的电平信号是高还是低。
在随后的程序中可以随时改变这个输出信号,改变之后就保持不变直至下次被改变。
这里需要注意的是,Output口意味着电平不会被外界输入电平所改变。而Input口意味着,当接收到任何外界输入电平时,该GPIO口的电平都会与之保持一致。
2. Pull up/ Pull down
这一条对Output和Input的GPIO口都适用。
这里摘录一段文字,很好的介绍了Pull up(拉高)/ Pull down(拉低)的意思。
上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平。而在信号输入为低电平是输入端的电平应该也为低电平。如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的,上拉电阻就是为了保证无信号输入时输入端的电平为高电平,同样还有下拉电阻它是为了保证无信号输入时输入端的电平为低电平。
3. 两者的区别
这两种设置都适用于GPIO中的Output口。那么他们的区别是什么呢?实践中该如何使用呢?
如果看懂了上面的介绍的话,这个问题就很好理解了。
1)对于Output口来说
由于是用来做输出用的,它的电平不会受到外界输入电平影响。为了让Output口按我们的想法输出电平,有两种调整方法:
- 代码中调整。如:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, 1); // 向A1这个GPIO口写入1(高电平)
便是将A1口(假设A1已经被设为Output类型的GPIO口了)的输出电平设为高电平。
- 在初始化GPIO的时候调整。就像在讲解Output Level时用到的图片中的那样,设置初始化之后该Output口的输出电平(之后在代码里可以随时对其做更改)。
因此,设置Output口成为上拉(Pull up)或是下拉(Pull down)就没什么意义了。因为我们不会去接收任何外界电平信号,自然就谈不上“没有外界信号输入时的默认电平状态”了。
但是好像还是有其他方面的影响,这点我不是很确定。
2)而对于Input口来说
上拉/ 下拉的设置可能非常重要。这决定了没有外界输入电平时,该Input口的电平状态。
比如,我希望开关没有连通时,Input口为高电平;按下开关导通Output口和Input口时,Input口变为Output口的低电平状态。
原因是这样的:
我在开关和GPIO口之间连接了一段不短的导线,可能造成电压的损耗,导致传输的高电平电压不足,被误认为低电平。而传输低电平信号达到了同样的目的,却不会出现这种问题。
总结
Output Level | Pull up/ Pull down | |
Output口 | 设置output口的默认输出电平 | 一般没什么用(不确定) |
Input口 | (不适用) | 无外部电平信号输入时,表现为高电平还是低电平 |
Input口 | Output口 | |
没有外界信号输入 | 1.高电平(Pull up) 2.低电平(Pull down) 3.随机不可控(no pull) | 输出想要输出的信号 |
有外界电平信号输入 | 与外界信号保持一致 | 不受影响,输出想要输出的信号 |
参考资料