参考链接已放至最上方,大家如果有疑惑也可直接观看参考链接。
[1]https://www.eefocus.com/component/405097/r0
[2]https://blog.csdn.net/techexchangeischeap/article/details/72569999
GPIO支持三种最大翻转速度:2MHz、10MHz、50MHz。每个I/O口可以自由编程,但I/O寄存器必须按32位字被访问。GPIO共有8种工作模式,通过编程选择相应的工作模式。
一、输入:
浮空输入、上拉输入、下拉输入、模拟输入 [1]
(一)浮空输入
1)外部通过IO口输入电平(上下拉电阻处于关闭状态)
2)传输到施密特触发器(此时施密特触发器为打开状态)
3)继续传输到输入数据寄存器IDR
4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值
施密特触发器可以解决基本IO电路在读取外部信号的跳变沿时出现的抖动现象 [2]。浮空输入容易受外部噪声信号干扰,改变输入端检测到的电平 [2]。
(二)上拉输入
外部输入通过上拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。
输入上拉模式有上拉电阻连接至VDD,上拉电阻开关接通,阻值约30-50K [1]。当输入管脚悬空时不受外部噪声信号干扰。对于此种输入方式,无论输入管脚悬空或者被高电平驱动时,读取的都是1。只有在输入端为0的时候,读取到的值才是0。因此采取的时非0输入模式。即若读取非0,即为1,若读取为0,即为0 [2]。
(三)下拉输入
与上拉模式相同,外部输入通过下拉电阻,施密特触发器存入输入数据寄存器IDR,被CPU读取。
输入下拉模式有下拉电阻连接至VSS,下拉电阻开关接通,阻值约30-50K [1]。但是该电路对外呈现的不是高阻,某种意义上说也在向外输出,当外部驱动电路不同时可能出现错误的检测结果 [2]。
(四)模拟输入
此时,上下拉处于关闭状态。施密特触发器处于截止状态。通过模拟输入通道输入到CPU,IO口外部电压为模拟量(电压形式非电平形式),作为模拟输入范围一般为0~3.3V [1]。
二、输出:
推挽输出、开漏输出、推挽复用输出IO、开漏复用输出IO
(一)开漏输出
开漏输出即三极管的集电极或者MOS管的漏极进行输出。开漏输出可以实现线与功能。开漏输出只能输出强低电平,高电平需要依靠外部上拉电子拉高,适合做电流型驱动,吸收电流能力较强[1]。
1)CPU写入位设置/清楚寄存器BSRR,映射到输出数据寄存器ODR
2)联通到输出控制电路(也就是ODR的电平)
3)ODR电平通过输出控制电路进入N-MOS管
1、ODR输出0:
N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定
在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平
所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1
2、ODR输出1:
N-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平。此时输出的低电平同样可以被CPU读取到
(二)推挽输出
与开漏式输出不同,推挽式输出采用上图结构。推挽输出可以采取强高/强低输出,可以连接数字电路。[1-2]
但推挽输出的一个缺点是,如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。这也是为什么推挽输出不能实现" 线与"的原因。[2]
(三)推挽复用输出IO
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源,推挽输出模式的输出电平是由CPU写入输出数据寄存器控制的,推挽复用输出模式的输出电平是由复用功能外设输出决定的。其他与开漏输出模式相似。
(四)开漏复用输出IO
与开漏输出模式唯一的区别在于输出控制电路之前电平的来源。开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的,开漏复用输出模式的输出电平是由复用功能外设输出决定的。其他与开漏输出模式相似。
https://blog.csdn.net/qq_38410730/article/details/79858906
https://blog.csdn.net/huanggenda568/article/details/7723238