stm32 GPIO学习

关键词: stm32,GPIO,寄存器

Day 1 2022-4-22:库函数配置CRL,CRH寄存器

STM32的一组GPIO有16个IO口,比如GPIOA这一组,有GPIOA0~GPIOA15一共16个IO口。每一个IO口需要寄存器的4位用来配置工作模式。
那么一组GPIO就需要16x4=64位的寄存器来存放这一组GPIO的工作模式的配置,但STM32的寄存器都是32位的,所以只能使用2个32位的寄存器来存放了。CRL用来存放低八位的IO口(GPIOx0—GPIOx7)的配置,CRH用来存放高八位的IO口(GPIOx8—GPIOx15)的配置。
这两个寄存器的全称是:端口配置低寄存器(GPIOx_CRL) (x=A…E) 和 端口配置高寄存器(GPIOx_CRH) (x=A…E)
也就是每一组GPIO都有两个32位的寄存器是用来配置IO口的工作模式的。
版权声明:本文为CSDN博主「39度C」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45915259/article/details/123878323

STM32的每个I/O端口都由7个寄存器来控制

寄存器大小功能
CRL32端口低配置寄存器,用来配置模式
CRH32端口高配置寄存器,功能同上
IDR32端口输入数据寄存器
ODR32输出数据寄存器
BSRR32置位/复位寄存器
BRR16复位寄存器
LCKR32锁存寄存器

一、CRL/CRH 端口配置寄存器

CRL和CRH寄存器控制着每个I/O口的模式及输出速率

1.操作寄存器CRH和CRL来配置I/O口的模式和速度由GPIO初始化函数完成

void GPIO_Init(GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_InitStruct);

该函数有两个参数

参数详情
指定GPIO取值范围为GPIOA~GPIOG
初始化参数结构体指针结构体类型为GPIO_InitTypeDef

初始化参数结构体定义

下面使用一个GPIO初始化实例来说明,通过初始化结构体初始化GPIO的常用格式是:

GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50Mhz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
成员变量功能
GPIO_Pin设置是要初始化哪个或者哪些*I/O口
GPIO_Mode设置对应I/O端口输出输入模式
GPIO_SpeedI/O口速度设置

多I/O口可使用"|"来分隔

2.I/O端口输入输出模式

枚举类型定义

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;

3.I/O口速度设置

枚举类型定义

typedef enum
{
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz,
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

二、IDR 端口输入数据寄存器

IDR是端口输入数据寄存器

要知道某个I/O口的电平状态,读该寄存器的指定位即可

函数调用

GPIO_Read_inputDataBit(GPIOA,GPIO_Pin_8);

三、ODR 端口输出数据寄存器

ODR是端口输出数据寄存器

从寄存器读出来的数据用于判断当前I/O口的输出状态

从寄存器写数据则可以控制某个I/O口的输出电平

四、BSRR 端口位设置/清除寄存器

五、BRR 端口位清除寄存器

六、BRR/BSRR和ODR寄存器的关系

本质上BRR和BSRR寄存器都是通过对ODR寄存器来进行写入操作的,也就是说BBR和BSRR“调用”ODR寄存器来实现端口位设置/清除功能

关于STM32 BSRR寄存器的问题

七、另行参考

深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)

文章作者:四文鱼Max

本文链接:https://blog.awolon.fun/archives/stm32-gpio.html

许可协议:CC BY-SA 4.0

标签: gpio, stm32

添加新评论