I/O口的八种工作方式:
输入浮空:
浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。通常该模式用于接一些传感器的信号端或者按键等外设,通过读取外部信号的电平变化确定该状态。
输入上拉:
内部接上拉电阻,作用就是把默认电压拉高 ,相当于单片机上电后在该模式下默认GPIO引脚为高电平。当外部输入一个低电平时,该引脚也会变成低电平。
输入下拉:
内部接下拉电阻,作用就是把默认电压拉成低电平 ,相当于单片机上电后在该模式下默认GPIO引脚为低电平。当外部输入一个高电平时,该引脚也会变成高电平。
模拟输入:
即关闭施密特触发器,将电压信号传送到片上外设模块(不接上、下拉电阻)。通常是用于ADC采集电压输入通道,进行AD转换。
开漏输出:
开漏输出模式下,只有N-MOS管工作,当我们输出控制为0时,N-mos管导通,这个时候会把I/O引脚的电平通过N-mos拉到地,I/O端口的电平变成低电平。当我们输出控制为1时,则P-MOS管和N-MOS管都会关闭,输出指令就不会起作用。同时I/O端口的电平状态由外部的上拉电阻或者下拉电阻决定,如果没有上拉或者下拉 IO口就处于悬空状态。(注意,悬空状态下的电平是不确定的)。同时,施密特触发器处于打开状态,意味着I/O端口的电平可以通过输入电路进行读取;需要注意,I/O端口的电平不一定是输出的电平。通常使用开漏输出时外部要加一个上拉电阻。
推挽式输出:
N-MOS管和P-MOS管都工作
控制输出为0(低电平)时,P-MOS管关闭,N-MOS管导通,I/O端口的电平为低电平。
控制输出为1(高电平)时,P-MOS管导通,N-MOS管关闭,I/O端口的电平为高电平。
同时,施密特触发器处于打开状态,意味着I/O端口的电平可以通过输入电路进行读取;此时,I/O端口的电平一定是输出的电平。
推挽式复用功能:
复用推挽输出,与推挽输出功能类似,区别是——不再通过CPU直接输出寄存器的状态,而是通过其它外设输出高低电平。其它功能与推挽输出完全相同。
开漏复用功能:
复用开漏输出,与开漏输出功能类似,区别是——不再通过CPU直接输出寄存器的状态,而是通过其它外设输出高低电平。其它功能与开漏输出完全相同。
推挽输出与开漏输出的区别:推挽可以输出强高低电平(连接数字器件),开漏输出只可以输出强低电平,高电平得靠外部电阻拉高,适用于电流型驱动。
每个GPI/O端口有7个寄存器控制:
两个32位端口配置寄存器(GPIOx_CRL,GPIOx_CRH)
两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR,输入和输出)
一个32位置位/复位寄存器(GPIOx_BSRR)
一个16位复位寄存 器(GPIOx_BRR)
一个32位锁存寄存器(GPIOx_LCKR)
端口配置寄存器:
GPIOX_CRL ,GPIOx_CRH(C是Config,R是寄存器,L和H是low,high)每四位控制一个IO口,CRL控制0-7口,CRH控制8-15口
把每个IO口分为两半CNF[1,0],MODE[1,0],两位配置具体输入输出模式,另外两位用来配置输入输出模式和速度。
当CRL寄存器配置输入模式的10,则通过ODR寄存器输入配置ODR0的0或1来选择下拉/上拉输入
数据寄存器 (GPIOx_IDR和GPIOx_ODR,输入和输出):
只用低16位,IDR只读,ODR可读写。
端口位设置/清除寄存器(GPIOx_BSRR):