STM32 GPIO控制指南
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
GPIO(General Purpose Input/Output)是一种通用输入/输出接口,可以用来连接各种外部设备和传感器。它是一种在计算机和其他电子设备中使用的标准接口,用于控制和监测数字和模拟信号。
GPIO接口通常具有多个输入和输出引脚,可以与外部设备进行通信。这些引脚可以在程序中被设置为输入模式或输出模式,并可以读取输入信号或写入输出信号。通过使用适当的编程语言和库,可以通过GPIO接口控制和监测外部设备的状态。
在嵌入式系统中,GPIO接口是非常常用的接口之一,可以连接各种传感器、执行器、开关和其他外部设备。通过读取和写入GPIO引脚的状态,嵌入式系统可以与外部世界进行交互和通信。
在树莓派等单板计算机中,GPIO接口通常是通过引脚排针或扩展板等形式提供的。开发者可以直接将外部设备连接到GPIO引脚上,并使用相应的控制和读取方法进行操作。
通过使用GPIO接口,开发者可以实现各种功能,包括控制LED灯、读取按钮状态、驱动电机、采集传感器数据等。它提供了一种简单而灵活的方式,将计算机与外部世界连接起来,扩展计算机的功能和应用范围。
提示:以下是本篇文章正文内容,下面案例可供参考
一、GPIO基本结构和工作方式
1、STM32引脚说明:
STM32F103ZET6 – 一共有7组IO口 – 每组IO口有16个IO – 一共16X7=112个IO GPIOA,GPIOB—GPIOG
STM32F103RCT6 – 一共有4组IO口 – 一共16X3+3=51个IO GPIOA0~A15 GPIOB0~B15 GPIOC0~C15 GPIOD0~D2
2、GPIO基本结构
stm32的大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(比如串口)。
3、io端口位的基本结构
4、GPIO工作方式
4种输入模式: 输入浮空 输入上拉 输入下拉 模拟输入 4种输出模式: 开漏输出 开漏复用功能 推挽式输出 推挽式复用功能 8种工作模式的区别:STM32八种IO口模式区别,3种最大翻转速度: -2MHZ -10MHz -50MHz。
二、GPIO寄存说明
5、GPIO的输入工作模式1—输入浮空模式
6、GPIO的输入工作模式2—输入上拉模式
7、GPIO的输入工作模式3—输入下拉模式
8、GPIO的输入工作模式4—模拟模式
9、GPIO的输出工作模式1—开漏输出模式
11、GPIO的输出工作模式3—推挽输出模式
12、GPIO的输出工作模式4—推挽复用输出模式
13、GPIO工作方式
上电复位后,GPIO默认为浮空状态,部分特殊功能引脚为特定状态。
推挽输出: 可以输出强高低电平,连接数字器件 开漏输出: 只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)
14、GPIO相关配置寄存器
每组GPIO端口的寄存器包括: 两个32位配置寄存器(GPIOx_CRL ,GPIOx_CRH) , 两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR), 一个32位置位/ 复位寄存器(GPIOx_BSRR), 一个16位复位寄存器(GPIOx_BRR), 一个32位锁定寄存器(GPIOx_LCKR)。 每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问) 。
是每组IO口含下面7个寄存器。也就是7个寄存器, 一共可以控制一组GPIO的16个IO口。
– GPIOx_CRL :端口配置低寄存器 – GPIOx_CRH:端口配置高寄存器 – GPIOx_IDR:端口输入寄存器 – GPIOx_ODR:端口输出寄存器 – GPIOx_BSRR:端口位设置/清除寄存器 – GPIOx_BRR :端口位清除寄存器 – GPIOx_LCKR:端口配置锁存寄存器。
15、 端口配置低寄存器(GPIOx_CRL)
三、STM32F10x GPIO引脚说明
1、端口复用功能 STM32的大部分端口都具有复用功能。 所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一 些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。 作用:最大限度的利用端口资源。
2、端口重映射功能 就是可以把某些功能引脚映射到其他引脚。 比如串口1默认引脚是PA9,PA10可以通过配置重映射映 射到PB6,PB7 作用:方便布线
1.引入库
代码如下:
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
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);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
2.读入数据
代码如下(示例):
#include "stm32f10x.h"
// 假设我们使用GPIOA的Pin0作为事件输出源
#define GPIO_PortSource GPIOA
#define GPIO_PinSource GPIO_Pin_0
void EXTI0_IRQHandler(void) // EXTI0中断处理函数
{
// 检查是否是GPIOA的Pin0产生的中断
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
// 清除中断标志
EXTI_ClearITPendingBit(EXTI_Line0);
// 这里添加中断处理代码
printf("GPIOA Pin0 interrupt occurred!\n");
}
}
int main(void)
{
// 系统初始化代码(略)
// 配置GPIOA的Pin0作为事件输出源!!!!!!!!!!!
GPIO_EventOutputConfig(GPIO_PortSource, GPIO_PinSource);
// 启用GPIOA的Pin0的事件输出功能
GPIO_EventOutputCmd(GPIO_PortSource, GPIO_PinSource, ENABLE);
// 配置GPIOA的Pin0为上拉输入,并配置为中断模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 上拉
GPIO_Init(GPIO_PortSource, &GPIO_InitStructure);
// 配置EXTI线为中断模式
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_Init(&EXTI_InitStructure);
// 使能中断!!!!!!!!!!!
NVIC_EnableIRQ(EXTI0_IRQn);
// 主循环
while (1)
{
// 可以在这里添加其他代码
}
}
该处使用的url网络请求的数据。
总结
GPIO是学习一款单片机的基础,本文针对于STM32单片机GPIO的整体架构和工作模式进行了详细的介绍,在工程应用中需要根据需求选择合适的工作模式,最后结合一段代码对具体使用流程进行了拆解与分析。
作者:梁文军