【嵌入式STM32-02】STM32 GPIO 工作原理|库函数|CubeMx|寄存器

STM32 GPIO

参考 STM32-GPIO介绍_KevinFlyn的博客-CSDN博客_stm32gpio是什么

GPIO通用输入输出端口(General-purpose input/output)

一、GPIO工作原理

1.GPIO工作模式

image-20211206090735777

image-20211206090815348

  • 浮空输入 编码器,PWM捕获

  • 上拉输入 按键、UART(Rx)

    默认为高

  • 下拉输入

  • 模拟输入 ADC

  • 开漏输出 IIC

    使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。有线与特性

    使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。

  • 推挽输出 一般输出

    使用方法:直接使用

    输出电平:推挽输出的低电平是0V,高电平是3.3V。

  • 复用开漏输出 硬件IIC

  • 复用推挽输出 PWM输出、SPI、UART(Tx)

    外设的GPIO配置见【STM32F10XXX参考手册8.1.11章节】

    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.GPIO保护二极管(FT5V容忍)

为了防止芯片被外部过高或者过低的输入电压烧坏,STM32内置保护二极管,当引脚输入电压高于VDD-FT(FT标识代表可以容忍5V电压,不同的引脚对电压的容忍值不同,需要在芯片数据手册上查找,见下图)时上方的二极管导通,当引脚电压低于Vss时,下方的二极管导通,这样就可以防止不正常的电压引入芯片导致芯片烧毁
image-20220922134624978

3.GPIO端口复用

为了最大限度的利用端口资源,STM32的大部分端口都具有复用功能。

所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。

复用情况可以查找数据手册【STM32F103xCDE_数据手册第3章】

4.GPIO端口重映射

为了方便布线 ,STM32配有端口重映射功能,所谓重映射就是可以把某些功能引脚映射到其他引脚。比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7。

端口的映射情况也可以通过查找重映射表来获得【STM32F10XXX参考手册8.3章节】

5.工作模式示例

image-20211206090910804

二、库函数

#ifndef _LED_H_
#define _LED_H_

#define LED1_ON   GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#define LED1_OFF  GPIO_SetBits(GPIOA,GPIO_Pin_5)

void Led_Init(void);

#endif
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);	//打开GPIOA的时钟

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	    //设置为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 				//初始化Pin5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//承载的最大频率
GPIO_Init(GPIOA, &GPIO_InitStructure);					//初始化GPIOA

LED1_OFF;

三、CubeMX

【小蜜蜂笔记】基于STM32CubeMX的嵌入式开发基础教程_哔哩哔哩_bilibili

STM32F103RCT6

1.选SWD

SWD是一种串行调试接口_嵌入式历练者的博客-CSDN博客_swdio是什么接口

image-20221012095814271

2.RCC

HSE外部高速时钟Crystal/Ceramic Resonator

晶振选择为3种:
Disable 这个是不用外部晶振
Crystal/Ceramic Resontor 这个是用无源外部晶振
BYPASS Clock Source 这个是有源外部晶振

image-20221012100059976

3.时钟配置

选HSE后,自己填好8M

HCLK一般选最大72MHz,回车确定,其他自动分好

image-20221012100932589

4.GPIO_Output

随便选一脚左键点一下,选GPIO_Output

左边点GPIO即可作相应配置

User Lable可以自己重起一个名字,生成的代码多个宏定义#define

image-20221012101301566

5.GPIO_Input

同理

image-20221012101533305

6.工程管理

image-20221012102410529

image-20221012102509421

红框都弄完右上角生成代码就行了

7. 编写代码

stm32f1xx_hal_gpio.h

image-20221014082435168

image-20221014082905872

四、GPIO寄存器

参考【STM32F10XXX参考手册8.2章节】

偏移地址:32位的微处理器,一次可以处理32位的数据,但是地址的编排是按照byte来编排的,也就是8位,那么32位的数据就占用了4个byte,才构成了一个完成的32位寄存器,所以地址的偏移是相隔4(0x04

image-20220922204652882

1.端口配置低寄存器(GPIOx_CRL )

Configuration Low Register

image-20220922135537223

2.端口配置高寄存器(GPIOx_CRH )

Configuration High Register

image-20220922135604772

CRH 的作用和 CRL 完全一样,只是 CRL 控制的是低 8 位输出口,而 CRH 控制的是高 8位输出口。

该寄存器的复位值为 0X4444 4444,从图可以看到,复位值其实就是配置端口为浮空输入模式。

在固件库开发中,操作寄存器CRH 和CRL 来配置 IO 口的模式和速度是通过GPIO初始化函数完成
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
第一个参数是用来指定GPIO,取值范围为GPIOA~GPIOG。 第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef

typedef struct
{ 
   uint16_t GPIO_Pin; 
   GPIOSpeed_TypeDef GPIO_Speed; 
   GPIOMode_TypeDef GPIO_Mode; 
}GPIO_InitTypeDef;

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;//速度 50MHz 
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置GPIO

3.端口输入数据寄存器(GPIO_IDR)

input data register

image-20220922135626298

在固件库中操作 IDR寄存器读取 IO 端口数据是通过GPIO_ReadInputDataBit 函数实现的
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
例如
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);

4.端口输出数据寄存器(GPIO_ODR)

output data register

image-20220922140019306

在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现的
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

该函数一般用来往一次性一个GPIO的多个端口设值

5.端口位设置/清除寄存器(GPIO_BSRR)

Bit Set/Reset Register

image-20220922140039839

该寄存器和 ODR 寄存器具有类似的作用,都可 以用来设置GPIO端口的输出位是 1 还是 0

例如你要设置 GPIOA 的第 1 个端口值为 1,那么你只需要往寄存器 BSRR的低 16 位对应位写 1 即可
GPIOA->BSRR=1<<1;
如果你要设置GPIOA的第 1 个端口值为 0,你只需要往寄存器高 16 位对应为写 1 即可
GPIOA->BSRR=1<<(16+1)

6.端口位清除寄存器(GPIO_BRR)

Bit Reset Register

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czXrtmdI-1672624744590)(C:\Users\bbcen\AppData\Roaming\Typora\typora-user-images\image-20220922140130415.png)]

通过 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);

7.端口配置锁定寄存器(GPIOx_LCKR)

Configuration Lock Register

image-20220922140242661

五、AFIO寄存器

重映射表在【STM32F10XXX参考手册8.3章节】

重映射寄存器在【STM32F10XXX参考手册8.4章节】

【Alternate Fuction复用功能】

  • AFIO主要用于引脚复用功能的选择和重定义

  • 在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择

image-20220922204801467

事件控制寄存器(AFIO_EVCR)

event control register

image-20220922205325245

复用重映射和调试I/O配置寄存器(AFIO_MAPR)

Multiplexed Remap and Debug I/O Configuration Registers

image-20220922205442533

image-20220922205509920

外部中断配置寄存器 1-4(AFIO_EXTICR1-4)

External Interrupt Configuration Register

image-20220922205809408

0)]

复用重映射和调试I/O配置寄存器(AFIO_MAPR)

Multiplexed Remap and Debug I/O Configuration Registers

image-20220922205442533

image-20220922205509920

外部中断配置寄存器 1-4(AFIO_EXTICR1-4)

External Interrupt Configuration Register

image-20220922205809408

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值