【STM32】GPIO和AFIO标准库使用框架

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发

快速导航

GPIO框架汇总

AFIO引脚重映射框架

AFIO中断配置框架


GPIO简介

GPIO(General Purpose Input Output),通用输入输出口

引脚电平:0V~3.3V,部分引脚可容忍5V

输出模式下可控制端口输出高低电平,可以模拟通信协议输出时序等

输入模式下可读取端口的高低电平,可以模拟通信协议接收数据等

GPIO时钟使能

已知所有GPIO都在APB2总线(如图)

再由RCC时钟树,需要使能APB2外设的GPIO时钟

复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

第一个参数选择 RCC_APB2Periph_GPIOX(X为A,B,C...)

第二个参数 为 ENABLE

在每一次复位以后,所有除SRAM和 FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。

GPIO初始化

工作模式

复位后,I/O端口被配置成浮空输入模式

GPIO有8种工作模式

输入模式

|------|-----------------------|
| 输入模式 | 标准库枚举定义 |
| 浮空输入 | GPIO_Mode_IN_FLOATING |
| 上拉输入 | GPIO_Mode_IPU |
| 下拉输入 | GPIO_Mode_IPD |
| 模拟输入 | GPIO_Mode_AIN |

输出模式

|--------|------------------|
| 输出模式 | 标准库枚举定义 |
| 推挽输出 | GPIO_Mode_Out_PP |
| 开漏输出 | GPIO_Mode_Out_OD |
| 复用推挽输出 | GPIO_Mode_AF_PP |
| 复用开漏输出 | GPIO_Mode_AF_OD |

推挽输出默认输出低电平

1.如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。

2.如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定

3.外设可以读取输入模式下GPIO值,例如定时器输入捕获和编码器模式等

GPIO中每一位的具体电路结构:

图片来源:STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili

选择引脚

选择你需要的引脚:GPIO_Pin_X X为1,2 ...

输出速度

GPIO的输出速度可以限制输出引脚的最大翻转速度(为了低功耗和稳定性)

有三个选择:

最大输出速度为10MHz

最大输出速度为2MHz

最大输出速度为50MHz

(输出速度,输入模式下无作用)

函数应用

GPIO初始化框架

复制代码
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

8个电平读写函数

实际是读写寄存器

写端口电平

即写输出模式下输出的电平

设置高电平

通过*|*可以设置多个端口

复制代码
GPIO_SetBits(GPIOA, GPIO_Pin_13 | GPIO_Pin_1);

设置低电平

通过*|*可以设置多个端口

复制代码
GPIO_ResetBits(GPIOA, GPIO_Pin_13);

一位写入

复制代码
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
//GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);也可

十六位整体写入

复制代码
GPIO_Write(GPIOA, ~0x0001);

读端口电平

读取一位输入端口电平

复制代码
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取十六位输入端口电平

复制代码
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

读取一位输出端口电平

复制代码
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

读取十六位输出端口电平

复制代码
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

GPIO框架汇总

复制代码
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

//8个读写函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

默认复用功能不需要AFIO,设置复用输出模式即可

AFIO简介

AFIO(Alternate Function I/O),复用IO口。即一个IO口用在多个外设上,以节省IO资源,提高IO利用率。

作用:复用功能引脚重映射;中断引脚选择

AFIO时钟使能

同GPIO一样,AFIO在APB2总线。

复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

1.引脚重映射

调用一个函数即可

复制代码
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

部分引脚复位后有默认复用功能,需要先解除复用变为普通的GPIO,再使用 引脚重映射函数。例如:

复制代码
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式

来自:参考手册

AFIO引脚重映射框架

复制代码
//选择重映射的IO口为普通GPIO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

//选择重映射的IO口不是普通GPIO口
//需要解除复用功能,变为普通GPIO口

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);

2.中断引脚选择

事件控制寄存器(AFIO_EVCR)

AFIO中断配置框架

复制代码
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度,输入无用
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
相关推荐
追兮兮6 小时前
MCUQuickStart v1.1.0发布,一键生成Keil工程+RTOS模板
stm32·单片机·嵌入式硬件·freertos·gd32·keil5
国科安芯6 小时前
ASP7A84AS与主流架构兼容替代及系统级电源完整性解决方案的深度研究
单片机·嵌入式硬件·架构
kaikaile19956 小时前
STC8单片机实现简单花样DMX512控制器
单片机·嵌入式硬件
rit84324996 小时前
STM32移植NES模拟器指南
stm32·单片机·嵌入式硬件
都在酒里7 小时前
STM32 I2C通信协议详解——标准库函数实现(通讯协议总结一)
stm32·嵌入式硬件·i2c
fengfuyao9857 小时前
STM32 HAL库实现串口DMA接收不定长数据
stm32·单片机·嵌入式硬件
yuan199977 小时前
STM32直流无刷电机六拍方波控制器程序
stm32·单片机·嵌入式硬件
ZhiqianXia7 小时前
流畅的Python笔记
笔记·python
玄米乌龙茶1237 小时前
LLM成长笔记(四):大语言模型(LLM)基础认知
人工智能·笔记·语言模型