wringPi 初始化GPIO 为上拉_stm32 再探GPIO ---5

第一个讲清除了上拉下拉电阻,第二个讲的GPIO的上拉下拉等模式,结合着读会更好!


真心感谢:https://blog.csdn.net/qq_41625394/article/details/79078195

通俗易懂谈"上拉电阻"与"下拉电阻"

  • 所谓上拉电阻就是:将一个不确定信号(高或低电平),通过一个电阻与电源VCC相连,固定在高电平;
  • 同理下拉电阻就是:将一个不确定信号(高或低电平),通过一个电阻与地GND相连,固定在低电平

上拉电阻与下拉电阻怎么接线?

上拉电阻:电阻一端接VCC,一端接逻辑电平接入引脚(如单片机引脚)
下拉电阻:电阻一端接GND,一端接逻辑电平接入引脚(如单片机引脚)

按键的上拉电阻为什么是10k欧姆?

按键的上拉电阻可以是3.3k、4.7k、5.1k、10k都可以,但是电阻越小功耗越大(P=i^2*r),在现在的智能生态下,我们做追求的是低功耗,高效率,10k是大多数智能产品芯片所能识别到的引脚电流,如果电阻太大,电流太小,引脚识别不了,所以10k是个折中的方案。


感谢:https://blog.csdn.net/XG_2013/article/details/51325155

STM32GPIO口8种模式细致分析

GPIO可以输入也可以输出,那就分别看看它的输入和输出吧

  • 上拉输入

b1c24b0d-d514-eb11-8da9-e4434bdf6706.png

如上图所示IO没有输入的时候,IO电平等于VDD即1电平,当然IO输入低电平的事就是VDD和IO口形成一个闭环电路,根据分压法IO口出分担的电压为0。当然IO输入为1时,IO口电压和VDD相等,上拉电阻好比断开了,IO口的电压还是0。

用处:在按键使用的时候特别适用,按键的一端接地,一端接IO口,当按键没有按下的时候电平为高电平,当按键按下的时候IO是低电平。

小计:

上拉输入,不管输入1还是不输入IO的电平都是1,输入0是IO口的电平是0

  • 下拉输入

b3c24b0d-d514-eb11-8da9-e4434bdf6706.png

下拉输入和上拉输入的区别是,上拉电阻的开关打开了,下拉电阻的开关关闭了。

如上图所示IO没有输入的时候,IO电平等于VSS即0电平,当IO输入高电平的时候IO口就和VSS组成一个闭合电路,根据分压法,电压都分担到了电阻上,所以IO口电平为高电平。当然IO输入为低电平的时候,IO口肯定是低电平。

用处:在按键使用的时候特别适用,按键的一端接VCC,一端接IO口,当按键没有按下的时候电平为低电平,当按键按下的时候IO是高电平电平。

  • 浮空输入

b4c24b0d-d514-eb11-8da9-e4434bdf6706.png

注意此时上拉下拉电阻开关都是打开,没有合并

上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时1读出的就是1,外部没有输入IO处于阻塞读不出电平状态。

用处:感觉在信号处理方面用的比较好,比如在读取一段一段的波形,可以清晰的知道什么时候是0信号,什么时候是1信号,什么时候是没有信号的。

  • 模拟输入

b6c24b0d-d514-eb11-8da9-e4434bdf6706.png

大家看上图的红色的标示,模拟输入和其他输入最大的区别

1、 没有连接TTL触发器,这样保留最原始的电压值,不是转换后的0和1信号.

2、 数据连接的终点不一样,其他的输入我们都是读取输入寄存器的值,而模拟输入,数据直接送到片上外设,一般是ADC。


讲完四种输入了接着该四种输出了

  • 推挽输出

b7c24b0d-d514-eb11-8da9-e4434bdf6706.png

上图就是就是推挽输出的过程。标示的“2”便是我们的输出寄存器,我们可以写入1或者0,如果写入1,图上的“3”上面的P-mos导通,N-mos截止,IO口等价直接连接在VDD上,所以IO口电平是高电平。同理输出寄存器的值为0时,P-mos截止,N-mos导通。IO口直接连接在VSS上,所有IO口电平为低电平。

大家可能会问图上标的1是什么?其实1的寄存器就是间接向输出寄存器写入。好处是有的,大家自己百度哈!

用处:适合做一些开关控制,应为推挽输出可以快速的切换0和1,例如继电器,led等

  • 开漏输出

bac24b0d-d514-eb11-8da9-e4434bdf6706.png

上图红色标示便是开漏输出的过程图,图上1和2的标示已经在推挽输出中介绍了,此处不再说明。开漏输出 与 推挽输出 唯一的区别就是开漏输出只有一个N-mos管。当输出寄存器的值为0的时候,n-mos导通,IO口直接连接VSS,输出为低电平。当输出寄存器为1的时候,n-mos截止,IO口直接和输出端断开了,处于浮空状态。电平状态不可控制。

大家可能会说,这样设计不是傻缺么?有什么用设计这种输出方式。其实这种方式很有用的,请看下面的类比

类比:

我们都知道51单片机PO口,是不是想到什么了?对PO口就是类似的开漏输出, PO口作为输出的时候一定要加上拉电阻,加上上拉电阻后,输入寄存器为1的时候,n-mos截止截止了,好比IO和输出端断开,这时IO口点压就等于上拉电阻的电压。这样变输出了高电平,如果IO口的高电平,连接到了外设低电平的,就会产生电流,电流不会流到IO口,(N-mos管截止了)直接流到外设。是不是增大了驱动能力了。(IO口的驱动能力有限,不能容忍大电流)。

通过改变上拉电阻的大小和电压就能完成很多功能。

  • 复用(推挽和开漏)输出

bbc24b0d-d514-eb11-8da9-e4434bdf6706.png

复用推挽开漏和(推挽开漏输出)区别在于起点不一样,复用输出来源片上外设,比如IIC,SPI等。相信大家已经可以理解了,不做解释了。


其实GPIO还有两个寄存器

  • 端口位设置/清除寄存器(BSRR)
  • 端口位清除寄存器(BRR)

先看看下面的介绍:

ODR寄存器可读可写,32位,GPIO管脚对应位写1为高电平,写 0 为低电平。(低 16 位用于设置 GPIO 口对应位输出高/低电平。高 16 位保留地址,读写无效。)

BSRR寄存器 称为端口位设置/清除寄存器,只写寄存器,32位, 对寄存器高16位 写1 对应管脚为低电平,写 0 无动作。

BRR寄存器称为端口位清除寄存器,只写寄存器,32位, 寄存器管脚对应位写 1 相应管脚会变为低电平。写 0 无动作。

读完介绍有没有想过:既然可以直接操作ODR控制引脚输出,为什么还要设置BSRR和BRR?

这是答案:

如果你想改变某个位的状态而不影响其他的,那用BSRR或BRR就很容易了。
直接操作ODR需要“读-操作-写”的过程,速度反而变慢了。

比如说让PA1、PA3、PA7清零而不影响其他位的状态,那就是:
GPIOA->BRR=PA1|PA3|PA7;
你要用ODR来操作的话,那就变成这样了:
GPIOA->ODR&=~(PA1|PA3|PA7);

虽然C的语句都只有一个,但你看汇编代码,就发现使用BRR比ODR快的多。

最后GPIOx_BSRR是32位寄存器,这个寄存器的高16位搞定复位功能,低16位搞定置位功能。但我们从习惯上(注意:是习惯上不是必须)会只用这个寄存器的置位功能,这样的话就能把IO口的置位和复位功能分摊到BSRR和BRR两个寄存器中来,在编程时候就能让你很清晰,但是你非得只只用BSRR一个去搞定置位和复位,那我也不能去说什么。

同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变,也只需一行语句

GPIOD->BSRR = 0xC00A0C21;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值