划线上方为输入部分,下方为输出部分。
首先看输入部分,I/O引脚接入两个保护二极管是对电压进行限幅.
VDD为3.3V,VSS为0V。
当输入电压大于3.3V,上面二极管导通,输入电压产生的电流直接;流入VDD而不流入内部电路。
当输入电压小于0V,下面二极管导通,输入电压产生的电流直接;流入VSS而不流入内部电路。
然后电流来到这里,这里连接了一个上拉电阻和下拉电阻
上拉至VDD,下拉至VSS,这个开关是通过程序进行配置
上面导通,下面断开就是上拉输入模式
上面断开,下面导通就是下拉输入模式
两个都断开就是浮空输入模式
上拉下拉是为了给输入提供一个默认的输入电平
因为对于一个数字的端口,输入不是高电平就是低电平
上拉就是默认为高电平输入模式
下拉就是默认为低电平输入模式
接着就来到施密特触发器 其作用是对输入电压整形
执行逻辑为 如果输入电压大于某一阈值,输出就会瞬间升为高电平
如果输入电压低于某一阈值,输出就会瞬间升为低电平
因为这个引脚的波形是外界输入,可能会产生各种失真失真
如图,红色信号为外界输入,有失真:绿色为两个阈值:蓝色为经过触发器整形的信号
可以明显看出,经过整形信号变为没有失真的数字信号,只有高低电平没有中间值
经过施密特触发器整形的波形就可以直接写入输入数据寄存器
我们再用程序读取输入数据寄存器对应的某一位数据就可以知道端口的输入电平
最后上面还有两路线路,是连接到片上外设的一些端口,其中有模拟输入,这个是连接至ADC上的,因为ADC需要的是模拟量,所以这根线是连接在触发器前的
另一个是复用功能输入,这个是连接到其他需要读取端口的外设上的,比如串口的输入引脚等,这根线接收到的是数字信号量,所以连在触发器后面
接下来看输出部分
数字部分可以由输出数据寄存器或片上外设两种方式控制
两种控制方式通过输出控制前面的数据选择器才来到输出控制部分
如果选择通过输出数据寄存器进行控制,就是普通IO口输出,写这个数据寄存器的某一位就可以操作对于的端口了
在输出数据寄存器左边还有一个位设置/清除寄存器,这个是可以用来单独操作输出数据寄存器的某一位,而不影响其他位
因为输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写
所以如果想单独控制其中某一个端口而不影响其他端口的话就需要一些特殊操作方式
第一种操作方式是先读取这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回去,在C语言中就是&=和|=的操作
第二种操作方式是通过设置位设置/清除寄存器,如果我们要对某一位进行置1操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0:要对某一位进行置0操作,在位清除寄存器的对应位写1即可,剩下不需要操作的位写0
最后信号就来到了两个MOS管,上面是P-MOS,下面是N-MOS,都是一种电子开关,我们的信号来控制开关的导通与关闭,开关将IO口接到VDD或者VSS,在这里可以选择推挽、开漏或者关闭三种输出方式。
在推挽输出模式下,P-MOS和N-MOS均有效。数据寄存器为1时,上管导通,下管断开,输出直接接到VDD,就是输出高电平。数据寄存器为0时,上管断开,下管导通,输出直接接到VSS,就是输出低电平。这种模式下,高低电平均有较强的驱动能力,所以推挽输出模式又叫强退输出模式
在开漏输出模式下,P-MOS是无效的,只有NMOS在工作。数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式。数据寄存器为0时,下管导通,这时输出直接接到VSS,也就是输出低电平。这种模式下,只有低电平有驱动能力,高电平没有驱动能力 。这个开漏模式可以作为通信协议的驱动方式。比如I2C通信的引脚,就是使用的开漏模式。在多机模式的情况下,这个模式可以避免各个设备的相互干扰。另外开漏模式还可以由于输出5V的电平信号,比如在IO口外接一个上拉电阻到5V的电源,当输出低电平时,由的N-MOS直接接VSS;当输出高电平时,由外部的上拉电阻拉高至5V,这样就可以输出5V的电平信号,用于兼容一些5V电平的设备
关闭模式是当引脚配置为输入模式的时候,两个MOS管都无效,也就是输出关闭,端口的电平由外部信号来控制文章来源:https://www.toymoban.com/news/detail-826509.html
文章来源地址https://www.toymoban.com/news/detail-826509.html
到了这里,关于STM32 GPIO口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!