【stm32】IO口详解

STM32 的 IO 口

1 概述

  • 每个IO口都可以自由编程,IO口寄存器要按 32 位字被访问。
  • 很多IO口都是 5V 兼容的,I/O Level 标 FT 的就是 5V 电平兼容的。

2 IO口模式

可以由软件配置成如下 8 种模式:

  1. 输入浮空
  2. 输入上拉
  3. 输入下拉
  4. 模拟输入
  5. 开漏输出
  6. 推挽输出
  7. 推挽式复用功能
  8. 开漏复用功能

2.1 第一种配置:

直接在GPIOMode_TypeDef中就配置完成,只需要一步。
用在stm32f1系列

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

2.2 第二种配置:

用在stm32L1系列

1先选GPIOMode_TypeDef //GPIO_Mode模式:

  • 输入GPIO_Mode_IN
  • 输出GPIO_Mode_OUT
  • GPIO_Mode_AF复用功能
  • GPIO_Mode_AN模拟功能
typedef enum
{ 
  GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */
  GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */
  GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
  GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
}GPIOMode_TypeDef;

2再选GPIOOType_TypeDef //GPIO_OType输出类型(只对输出起作用):

  • 推完输出GPIO_OType_PP、
  • 漏极输出GPIO_OType_OD
typedef enum
{ GPIO_OType_PP = 0x00,
  GPIO_OType_OD = 0x01
}GPIOOType_TypeDef;

3最后选择GPIOPuPd_TypeDef//GPIO_PuPd上下拉:

  • 浮空GPIO_PuPd_NOPULL、
  • 上拉GPIO_PuPd_UP、
  • 下拉GPIO_PuPd_DOWN
typedef enum
{ GPIO_PuPd_NOPULL = 0x00,
  GPIO_PuPd_UP     = 0x01,
  GPIO_PuPd_DOWN   = 0x02
}GPIOPuPd_TypeDef;

3 寄存器

STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:

  • 2 个 32 位的端口配置寄存器 CRL 和 CRH;
  • 2 个 32 位的数据寄存器 IDR 和 ODR;
  • 1 个 32 位的置位/复位寄存器BSRR;
  • 1个 16 位的复位寄存器 BRR;
  • 1 个 32 位的锁存寄存器 LCKR。

CRLCRH 控制着每个 IO 口的模式及输出速率。

IDR 是一个端口输入数据寄存器,只用了低 16 位。该寄存器为只读寄存器,并且只能以16 位的形式读出。

ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。

BSRR 寄存器是端口位设置/清除寄存器。该寄存器和 ODR 寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是 1 还是 0,该寄存器通过举例子可以很清楚了解它的使用方法。例如:
你要设置 GPIOA 的第 1 个端口值为 1,那么你只需要往寄存器 BSRR 的低 16 位对应位写 1 即可:GPIOA->BSRR=1<<1;你要设置 GPIOA 的第 1 个端口值为 0,你只需要往寄存器高 16 位对应为写 1 即可:GPIOA->BSRR=1<<(16+1)

BRR 寄存器是端口位清除寄存器。该寄存器的作用跟 BSRR 的高 16 位雷同,

4 输出速度

I/O口输出模式下有三种输出速度可选(2MHz10MHz50MHz),这个速度是指I/O口驱动电路的响应速度;I/O管脚内部有多个响应不同的驱动电路,用户可以根据自己的需要选择合适的驱动电路。

4.1 高低频比较
高频驱动电路:输出频率高,噪音大,功耗高,电磁干扰强;
低频驱动电路:输出频率低,噪音小,功耗低,电磁干扰弱;提高系统EMI(电磁干扰)性能;

通过选择速度来选择不同的输出驱动模块,达到最佳的噪音控制和降低功耗的目的如果需要选择较高频率信号,但是却选择了低频驱动模块,很有可能会失真的输出信号;所以GPIO的引脚速度应与应用匹配。

4.2 举例

  1. 对于串口来说,加入最大波特率为115200,这样只需要用2M的GPIO的引脚速度就可以了,省电噪音又小;
  2. 对于I2C接口,假如使用400 000波特率,若想把余量留大一些,2M的GPIO引脚速度或许是不够,这时可以选用10M的GPIO引脚速度;
  3. 对于SPI接口,假如使用18M或9M的波特率,用10M的GPIO口也不够用了,需要选择呢50M的GPIO引脚速度

5 其它

  • GPIO口设置为输入时,输出驱动电路与端口是断开的,所以这时配置输出速度是无意义的;
  • 在复位期间和刚复位后,复位功能未开启,I/O端口被配置成浮空输入模式;
  • 所有端口都有外部中断能力,当使用外部中断功能时,端口必须设置成输入模式;
  • GPIO的配置具有上锁的功能,当配置好GPIO后,可以通过程序锁住配置组合,知道下次芯片复位才能解开;

你可能感兴趣的:(STM32)