GPIO原理与寄存器

发布时间 2023-04-05 18:16:41作者: wxk1213

GPIO的工作方式

输入

浮空输入模式

输出缓冲器被禁止,施密特触发输入被激活,不接上拉和下拉电阻,出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器。

 

上拉输入模式

输出缓冲器被禁止,施密特触发输入被激活,上拉电阻接通,不接下拉电阻,当I/O引脚无输入信号时,读取到的数据为1,即高电平

 

下拉输入模式

输出缓冲器被禁止,施密特触发输入被激活,上拉电阻不接,下拉电阻接通,当I/O引脚无输入信号时,读取到的数据为0,即低电平

 

有些传感器等元气件,他们的信号输出有效时候会输出一个高电平(或者低电平),无效时候不输出,为开路。此时我们就必须用上拉电阻(或下拉电阻)。

 

模拟输入模式

输出缓冲器被禁止,禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0’;上拉和下拉电阻被禁止; I/O引脚的信号交由片上外设(比如ADC)处理。

 

 

输出

推挽输出模式

输出缓冲器被激活,施密特触发输入被激活,上拉电阻和下拉电阻被禁止,若通过输出数据寄存器输出1,则P-mos管导通,N-MOS管截止,I/O脚得到高电平;输出0,则相反

输出低电平时0v,输出高电平时3.3v;对输出数据寄存器的读访问得到最后一次写的值

 

 

复用推挽输出

 

开漏输出模式

输出缓冲器被激活,施密特触发输入被激活,上拉电阻和下拉电阻被禁止,输出寄存器上的’0’激活N-MOS,端口得到低电平;而输出寄存器上的’1’将端口置于高阻状态(P-MOS从不被激活)。

 

复用开漏输出

 

输出对比

  • 推挽输出:
    可以输出高低电平,连接数字器件,两个MOS管轮流导通,使其负载能力
    和开关速度都比普通方式有很大提高
  • 开漏输出:
    只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电
    极。要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收
    电流的能力相对强(一般20ma以内)。
  • 非复用输出方式其输出值由cpu执行指令控制,复用
    输出方式其输出值来自片上外设

 

输出引脚的速度

  • “速度”指输出驱动电路的响应速度,并不是输出信号的速度。芯片内部在
    I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据
    自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模
    块,达到最佳的噪声控制和降低功耗的目的。
  • GPIO的引脚速度应与应用相匹配,如果输出信号的频率超过了驱动电路的
    响应速度,就有可能信号失真。(比如:信号频率为10MHz,而你配置了
    2MHz的带宽,则10MHz的方波很可能就变成了正弦波),另一方面,速度
    配置越高,噪声越大,功耗越大。
  • 常用的选择:
    ① USART串口,若最大波特率只需115.2k,那用2M的速度就够了,既省
    电也噪声小。
    ② I2C接口,若使用400k波特率,若想把余量留大些,可以选用10M的
    GPIO引脚速度。
    ③ SPI接口,若使用18M或9M波特率,需要选用50M
  • 当GPIO的I/O引脚配置为输入模式时,不需要配置输出速度。

 

 

GPIO寄存器

实现对GPIO端口初始化配置和数据输入输出控制

 

1. 配置寄存器:GPIOx_CRL、GPIOx_CRH
用来选择引脚功能,例如输入或输出


2. 数据寄存器:GPIOx_IDR、GPIOx_ODR
用来保存引脚输入电平或输出电平


4. 位控寄存器:GPIOx_BSRR、GPIOx_BRR
用来控制某引脚为1或0


4. 锁定寄存器:GPIOx_LCKR
用来锁定引脚配置(不允许修改)

 

每个寄存器只能以32位(字)进行访问

不允许16位(半字)或8位(字节)访问

 

每组端口有两个32位配置寄存器


• 配置寄存器低(Low) 字GPIOx_CRL
• 配置寄存器高(High)字GPIOx_CRH
(x是A~G)

配置寄存器低字CRL对应配置  低8位引脚Px0、Px1、……Px7

配置寄存器高字CRH对应配置  高8位引脚Px8、Px9、……Px15

 

两个32位(一个64位)配置寄存器


每4位对应一个引脚(64位对应16个引脚)
低2位设置其工作模式(MODE)
高2位设置其配置(CNF:Configuration)


共有4种输入功能、4种输出功能

 

 

GPIO的引脚配置功能表

 

GPIO的数据寄存器

 

举例

使GPIOE的第5管脚输出低电平,使GPIOE端口的第11管脚输出高电平
如果使用端口输出数据寄存器GPIOE_ODR,按照“读出—修改—写回”策略,其语句为:


GPIOE_ODR &=~(1uL<<5);
GPIOE_ODR |= (1uL<<11);

 

位输出问题

对输出数据寄存器某位写入时
• 要考虑其他位的状态,不能任意改变


需要首先读出输出数据寄存器的内容
• 修改相应位再写入(读出-修改-写回)


GPIO的输出数据寄存器ODR可以读出
• 用以支持位输出控制

 

GPIO的位控制器

每个端口有两个位控寄存器
• 只能写入、不能读出
• 某位写入1实现I/O引脚复位或置位
• 写入0对I/O引脚无影响(作用)

一个是位置位/复位寄存器BSRR
• 高16位控制引脚为低电平(复位BR:Bit Reset)
• 低16位控制引脚为高电平(置位BS:Bit Set)


一个是位复位寄存器BRR
• 低16位控制引脚为低电平(复位BR:Bit Reset)

 

 

举例

使GPIOE的第5管脚输出高电平:
GPIOE_BSRR=(1uL<<5);

使GPIOE端口的第11管脚输出低电平:
GPIOE_BSRR = (1uL<<11)<<16;

 

 

GPIO的锁定寄存器

 

端口配置锁定寄存器GPIOx_LCKR(32位)
• 用于冻结配置寄存器对I/O引脚功能的设定


当对端口执行了写入锁定序列后
• 被锁定引脚配置的工作模式不能再改变
• 直到下次复位后才被解锁


锁定功能可以防止程序随意改变GPIO配置

举例

要锁定GPIOE端口的第5脚和第11脚的配置,
则使用以下语句:
GPIOE_LCKR = (1uL<<16) | (1uL<<11) | (1uL<<5); 
GPIOE_LCKR = (1uL<<11) | (1uL<<5); 
GPIOE_LCKR = (1uL<<16) | (1uL<<11) | (1uL<<5); 
GPIOE_LCKR = (1uL<<11) | (1uL<<5); 
v1 = GPIOE_LCKR;

/*这里v1为无符号32位整型*/