STM32
直播中

张红

7年用户 1228经验值
私信 关注
[问答]

IO口的知识点汇总,错过绝对后悔

IO口的知识点汇总,错过绝对后悔

回帖(1)

蔡丹青

2021-12-15 11:25:10
  1 概述

  


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

  2 IO口模式

  可以由软件配置成如下 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 举例
  

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

  5 其它

  


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

更多回帖

发帖
×
20
完善资料,
赚取积分