STM32IO端口相关配置

本文详细介绍了STM32微控制器中IO口的8种配置模式,包括输入浮空、输入上拉、输入下拉等,并解释了相关寄存器如CRL、CRH、IDR的作用。同时,提供了GPIO初始化函数的使用方法,以及如何通过不同寄存器读取和设置IO口的状态。

STM32 IO口可以配置的8种模式:

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

I/O 5V兼容:

I/O Level 标 FT 的就是 5V 电平兼容的 ;

I/O 控制寄存器说明:

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

STM32 I/O 配置表:

功能配置模式CNF1CNF0PxODR寄存器
通用输出推挽式(Push-Pull)000或1
通用输出开漏(Open-Drain)010或1
复用功能输出推挽式(Push-Pull)10不使用
复用功能输出开漏(Open-Drain)11不使用
输入模拟输入00不使用
输入浮空输入01不使用
输入下拉输入100
输入上拉输入101

STM32输出模式配置表:

MODE1MODE0意义模式
00保留输入
01最大输出速度为10MHz输出
10最大输出速度为20MHz输出
11最大输出速度为50MHz输出

常见的I/O配置(CRL/CRH):

CRL/CRH寄存器值功能使用
0X0模拟输入模式ADC
0X3推挽输出模式输出口,50M 速率
0X8上/下拉输入模式输入口
0XB复用输出使用 IO 口的第二功能, 50M 速

CRH控制高8位I/O口,CRL控制低8位I/O口。

GPIO 初始化函数:

GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
上述函数有两个参数:

  1. 第一个用来指定GPIO,取值范围为GPIOA~GPIOG;
  2. 第二个用来初始化参数结构体(GPIO_InitTypeDef)指针;

通过初始化结构体初始化GPIO:

GPIO_InitTpyeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定的参数配置 GPIO

8个模式的枚举类型定义:

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;

I/O 口速度枚举类型定义:

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

端口输入数据寄存器 (IDR):

功能
31:16保留,始终为0
15:0IDRyyy[15:0]:端口输入数据 (y=0....15y=0....15y=0....15)

要想知道某个 IO 口的电平状态,只要读这个寄存器,再看某个位的状态就可以。
这些位只能以字(16位)的形式读出。

操作 IDR 寄存器读取 IO 端口数据 :

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint6_t GPIO_Pin)
例如要读GPIOA.5的电平状态:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);

端口输出数据寄存器 (ODR):

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

  1. 只用了低 16 位;
  2. 从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态;
  3. 向该寄存器写数据,则可以控制某个 IO 口的输出电平 ;
  4. 该函数一次性对一个 GPIO 的多个端口设值;

端口位设置/清除寄存器 (BSRR):

  1. 位31:16 BRy: 清除端口x的位y(y=0…15),置1有效;
  2. 位15:0 BSy: 设置端口x的位y(y=0…15),置1有效;
  3. 若同时设置BSy和BRy的对应位,BSy位起作用;
    例如:要设置 GPIOA 的第 1 个端口值为 1,则向BSRR 的低 16 位对应位写 1 :
    GPIOA->BSRR=1<<1;
    例如:要设置 GPIOA 的第 1 个端口值为 0,则向BSRR 的高 16 位对应位写 1 :
    GPIOA->BSRR=1<<(16+1)

端口位清除寄存器 (BRR):

通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数GPIO_SetBits()和函数 GPIO_ResetBits()来完成的 。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

例如:要设置GPIOB.5 输出1:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
例如:要设置GPIOB.5 输出1:
GPIO_Resetits(GPIOB, GPIO_Pin_5);

I/O操作步骤:

  1. 使能IO口时钟。调用函数为__RCC_APB2PeriphClockCmd();__
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 GPIOB,GPIOE 端口时钟
  1. 初始化IO参数。调用函数为__GPIO_Init();__
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
  1. 操作IO;
LED0=1; //通过位带操作控制 LED0 的引脚 PB5 输出高电平
LED0=0; //通过位带操作控制 LED0 的引脚 PB5 输出低电平
GPIO_SetBits(GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 1,等同 LED0=1;
GPIO_ResetBits (GPIOB, GPIO_Pin_5); //设置 GPIOB.5 输出 0,等同 LED0=0;
GPIOB->BRR=GPIO_Pin_5; //设置 GPIOB.5 输出 1,等同 LED0=1;
GPIOB->BSRR=GPIO_Pin_5; //设置 GPIOB.5 输出 0,等同 LED0=0;
<think>好的,我现在需要帮助用户查找关于STM32F103微控制器IO端口配置寄存器的详细信息和教程。用户明确提到了CRL、CRH等寄存器,所以我要先回顾一下之前提供的引用内容,确保信息准确。 首先,引用[1]提到STM32的每个IO端口有7个寄存器,其中常用的四个是CRL、CRH、IDR、ODR。CRL和CRH分别负责低8位和高8位的配置,这点很重要。用户可能需要了解如何具体设置这些寄存器来配置引脚的模式,比如输入、输出、复用功能等。然后,引用[3]详细列出了每个寄存器的名称和作用,比如GPIOx_CRL和GPIOx_CRH用于配置模式,IDR和ODR用于数据输入输出。同时,用户可能对寄存器的位设置感兴趣,比如每个引脚占用的4个配置位,对应不同的模式(如推挽输出、开漏输出等)。接下来,我需要确保回答结构清晰,分步骤解释每个寄存器的作用。例如,先介绍CRL和CRH的结构,再说明如何设置不同的模式,接着讲解数据寄存器的使用,以及BSRR和BRR的作用。此外,时钟配置也是一个关键点,因为在使用GPIO前必须启用对应的时钟,这在引用[3]中提到过。 用户可能需要具体的例子,比如如何将PA0设置为推挽输出,这需要配置CRL的相应位,并设置时钟使能。同时,需要注意寄存器的访问方式,必须按32位字访问,不能半字或字节操作,这点需要强调,避免用户出错。最后,生成相关问题时要围绕寄存器配置、常见问题、时钟设置和应用场景展开,帮助用户深入理解。需要确保引用正确,比如引用[1]和[3]中的内容,并在适当的位置添加引用标识,保持回答的可信度。</think>### STM32F103 IO端口配置寄存器详解 STM32F103的每个IO端口通过**7个寄存器**进行控制,其中核心配置寄存器为**GPIOx_CRL**和**GPIOx_CRH**。以下为关键寄存器功能及配置方法: --- #### 1. **端口配置寄存器(CRL/CRH)** - **GPIOx_CRL**:控制端口低8位(Pin0-Pin7)的模式与速率。 - **GPIOx_CRH**:控制端口高8位(Pin8-Pin15)的模式与速率[^1]。 - **每个引脚占用4个位**,用于配置以下模式: - **输入模式**:浮空输入、上拉/下拉输入。 - **输出模式**:推挽输出、开漏输出。 - **复用功能**:复用推挽/开漏。 - **速率**:2MHz、10MHz、50MHz。 示例:将PA0设置为推挽输出(50MHz): ```c GPIOA->CRL |= 0x3 << 0; // 输出模式,50MHz GPIOA->CRL |= 0x0 << 2; // 推挽输出 ``` --- #### 2. **数据寄存器(IDR/ODR)** - **GPIOx_IDR**:读取引脚输入状态(低16位有效)。 - **GPIOx_ODR**:设置引脚输出电平(直接写入值)[^1]。 示例:读取PA1电平并设置PA2输出高电平: ```c uint8_t input = (GPIOA->IDR & (1 << 1)) >> 1; // 读取PA1 GPIOA->ODR |= (1 << 2); // PA2输出高电平 ``` --- #### 3. **快速操作寄存器(BSRR/BRR)** - **GPIOx_BSRR**:通过高16位复位引脚,低16位置位引脚。 - **GPIOx_BRR**:快速复位引脚(仅低16位有效)[^3]。 示例:快速设置PA3为高电平,PA4为低电平: ```c GPIOA->BSRR = (1 << 3) | (1 << (4 + 16)); // PA3置位,PA4复位 ``` --- #### 4. **配置流程** 1. **使能时钟**:通过RCC寄存器开启对应GPIO端口的时钟(如`RCC_APB2ENR |= 1 << 2`开启GPIOA时钟)[^3]。 2. **配置CRL/CRH**:设置引脚模式与速率。 3. **操作IDR/ODR**:读写数据。 --- #### 注意事项 - **寄存器访问必须按32位操作**,不可使用半字或字节访问[^3]。 - **复用功能需配合外设寄存器**(如USART、SPI)使用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值