STM32 GPIO
参考 STM32-GPIO介绍_KevinFlyn的博客-CSDN博客_stm32gpio是什么
GPIO通用输入输出端口(General-purpose input/output)
一、GPIO工作原理
1.GPIO工作模式
-
浮空输入 编码器,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时,下方的二极管导通,这样就可以防止不正常的电压引入芯片导致芯片烧毁
3.GPIO端口复用
为了最大限度的利用端口资源,STM32的大部分端口都具有复用功能。
所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。
复用情况可以查找数据手册【STM32F103xCDE_数据手册第3章】
4.GPIO端口重映射
为了方便布线 ,STM32配有端口重映射功能,所谓重映射就是可以把某些功能引脚映射到其他引脚。比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7。
端口的映射情况也可以通过查找重映射表来获得【STM32F10XXX参考手册8.3章节】
5.工作模式示例
二、库函数
#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是什么接口
2.RCC
HSE外部高速时钟Crystal/Ceramic Resonator
晶振选择为3种:
Disable 这个是不用外部晶振
Crystal/Ceramic Resontor 这个是用无源外部晶振
BYPASS Clock Source 这个是有源外部晶振
3.时钟配置
选HSE后,自己填好8M
HCLK一般选最大72MHz,回车确定,其他自动分好
4.GPIO_Output
随便选一脚左键点一下,选GPIO_Output
左边点GPIO即可作相应配置
User Lable可以自己重起一个名字,生成的代码多个宏定义#define
5.GPIO_Input
同理
6.工程管理
红框都弄完右上角生成代码就行了
7. 编写代码
stm32f1xx_hal_gpio.h
四、GPIO寄存器
参考【STM32F10XXX参考手册8.2章节】
偏移地址:32位的微处理器,一次可以处理32位的数据,但是地址的编排是按照byte来编排的,也就是8位,那么32位的数据就占用了4个byte,才构成了一个完成的32位寄存器,所以地址的偏移是相隔4(0x04)
1.端口配置低寄存器(GPIOx_CRL )
Configuration Low Register
2.端口配置高寄存器(GPIOx_CRH )
Configuration High Register
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
在固件库中操作 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
在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现的
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
该函数一般用来往一次性一个GPIO的多个端口设值
5.端口位设置/清除寄存器(GPIO_BSRR)
Bit Set/Reset Register
该寄存器和 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
五、AFIO寄存器
重映射表在【STM32F10XXX参考手册8.3章节】
重映射寄存器在【STM32F10XXX参考手册8.4章节】
【Alternate Fuction复用功能】
-
AFIO主要用于引脚复用功能的选择和重定义
-
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择
事件控制寄存器(AFIO_EVCR)
event control register
复用重映射和调试I/O配置寄存器(AFIO_MAPR)
Multiplexed Remap and Debug I/O Configuration Registers
外部中断配置寄存器 1-4(AFIO_EXTICR1-4)
External Interrupt Configuration Register
0)]
复用重映射和调试I/O配置寄存器(AFIO_MAPR)
Multiplexed Remap and Debug I/O Configuration Registers
外部中断配置寄存器 1-4(AFIO_EXTICR1-4)
External Interrupt Configuration Register