单片机学习小组
直播中

梅利号

8年用户 1467经验值
擅长:可编程逻辑
私信 关注

STM32 IO口可以配置的模式有哪几种?

STM32 IO口可以配置的模式有哪几种?
常见的I/O配置是什么?
I/O操作步骤是怎样的?

回帖(1)

常静娜

2022-1-17 10:51:34
STM32 IO口可以配置的8种模式:



  • 输入浮空;
  • 输入上拉;
  • 输入下拉;
  • 模拟输入;
  • 开漏输出;
  • 推挽输出;
  • 推挽输出
  • 推挽式复用输出;
  • 开漏复用功能;

I/O 5V兼容:

I/O Level 标 FT 的就是 5V 电平兼容的 ;
I/O 控制寄存器说明:



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

STM32 I/O 配置表:

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

[tr]MODE1MODE0意义模式[/tr]
00保留输入
01最大输出速度为10MHz输出
10最大输出速度为20MHz输出
11最大输出速度为50MHz输出
常见的I/O配置(CRL/CRH):

[tr]CRL/CRH寄存器值功能使用[/tr]
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);
上述函数有两个参数:


  • 第一个用来指定GPIO,取值范围为GPIOA~GPIOG;
  • 第二个用来初始化参数结构体(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; //速度50MHzGPIO_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):

[tr]位功能[/tr]
31:16保留,始终为0
15:0IDR                                             y                                      y                        y[15:0]:端口输入数据 (                                             y                               =                               0....15                                      y=0....15                        y=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);


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

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



  • 位31:16 BRy: 清除端口x的位y(y=0…15),置1有效;
  • 位15:0 BSy: 设置端口x的位y(y=0…15),置1有效;
  • 若同时设置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操作步骤:



  • 使能IO口时钟。调用函数为__RCC_APB2PeriphClockCmd();__

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能 GPIOB,GPIOE 端口时钟

  • 初始化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);

  • 操作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;
举报

更多回帖

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