STM32 GPIO使用

news/2025/1/27 13:40:38/文章来源:https://www.cnblogs.com/jeikerxiao/p/18690777

1.GPIO是什么

GPIO(General Purpose Input/Output)通用输入输出,是STM32开发板中的通用输入输出接口,用于连接外部设备。
GPIO 有时候简称为“IO口”。

  • 通用,说明它是常见的。
  • 输入输出,就是说既能当输入口使用,又能当输出口使用。
  • 端口,就是元器件上的一个引脚。

输入模式和输出模式是GPIO的基本特性,当然GPIO还有其它模式可选。

GPIO端口模式

IO耐压情况

STM32是一款3.3V电压的芯片。
在STM32中,GPIO的输入和输出都是3.3V的,但是有些IO可以输入5V电压,有些IO不可以输入5V电压。

img

2.GPIO输入输出模式

(一)模式汇总

输入模式:

  • 浮空输入(GPIO_Mode_IN_FLOATING):引脚电平是真实的外部连接器件电压,电平有不确定性
  • 上拉输入 (GPIO_Mode_IPU):默认通过电阻上拉到VCC,不接外部器件时可以读出高电平
  • 下拉输入 (GPIO_Mode_IPD):默认通过电阻下拉到GND,不接外部器件时可以读出低电平
  • 模拟输入 (GPIO_Mode_AIN):将外部信号直接传输到数模转换通道上

输出模式:

  • 开漏输出(GPIO_Mode_Out_OD):只能输出低电平,高电平由电阻上拉决定
  • 开漏复用功能(GPIO_Mode_AF_OD):用于外设功能使用
  • 推挽式输出(GPIO_Mode_Out_PP):可以输出强高和强低,通常使用该功能控制LED
  • 推挽式复用功能(GPIO_Mode_AF_PP):用于外设功能使用

GPIO的基本结构:

GPIO输入输出模式

TTL肖特基触发器其实可以理解为用肖特基管构成的施密特触发器,作用简单说就是将相对缓慢变化的模拟信号变成矩形(方波)信号,便于后面读取。这里有一个阈值电压的概念,比如从低到高达到多少才会导通,从高到底多少才会关闭。

输入模式

浮空输入(GPIO_Mode_IN_FLOATING)

浮空就是逻辑器件与引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构和外部引脚所接的器件决定电平状态。一般实际运用时,引脚不建议悬空,易受干扰。通俗讲就是浮空就是浮在空中,就相当于此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。浮空最大的特点就是电压的不确定性,它可能是0V,页可能是VCC,还可能是介于两者之间的某个值(最有可能) 浮空一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响。

浮空输入

上拉输入 (GPIO_Mode_IPU)

上拉就是把点位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平。电阻同时起到限流的作用。弱强只是上拉电阻的阻值不同,没有什么严格区分。

电阻通常为30-50KΩ

上拉输入

下拉输入 (GPIO_Mode_IPD)

下拉就是把点位拉低,比如拉到GND。下拉就是将不确定的信号通过一个电阻嵌位在低电平。电阻同时起到限流的作用。弱强只是下拉电阻的阻值不同,没有什么严格区分

下拉输入

模拟输入 (GPIO_Mode_AIN)

模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的

模拟输入

开漏输出 (GPIO_Mode_Out_OD)

开漏输出就是输出低电平,高电平由电阻上拉决定。
IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。
当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能。

只能输出强低电平。

开漏输出

开漏复用功能 (GPIO_Mode_AF_OD)

开漏复用功能

开漏复用功能

推挽式输出 (GPIO_Mode_Out_PP)

IO输出0-接GND, IO输出1 -接VCC。这是使用最多的了。控制LED基本都是使用这种模式。

可以输出强高低电平,连接外部数字器件。

推挽式输出

推挽式复用功能 (GPIO_Mode_AF_PP)

用于外设使用

推挽式复用功能

3.配置GPIO输入输出

输入

输入

GPIO Pull-up/Pull-down:

IO上下拉配置

  • No pull-up and no pull-down,浮空输入,配置为不上拉和下拉
  • Pull-up,上拉输入
  • Pull-down,下拉输入

输出

输出

(1) GPIO output level

  • Low:IO初始化默认输出低电平
  • High:IO初始化默认输出高电平

(2) GPIO mode

  • Output Open Drain,开漏输出,可以输出低电平
  • Output Push Pull,推挽输出,可以输出低电平和高电平

(3) GPIO Pull-up/Pull-down:

IO上下拉配置

  • No pull-up and no pull-down,浮空输入,配置为不上拉和下拉
  • Pull-up,上拉输入
  • Pull-down,下拉输入

(4) Maximum output speed

  • Low,GPIO速度为低速,通常为2MHZ
  • Medium,GPIO速度为中速,通常为10MHZ
  • High,GPIO速度为高速,通常为50MHZ

4.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位字被访问(不允许半字或字节访问)

端口配置低寄存器(GPIOx_CRL)

端口配置低寄存器

端口配置高寄存器(GPIOx_CRH)

端口配置高寄存器

端口输入数据寄存器(GPIOx_IDR)

端口输入数据寄存器

端口输出数据寄存器(GPIOx_ODR)

端口输出数据寄存器

5. GPIO 输出编程

测试有GPIOA1和GPIOA2设置为输出测试

CubeMX 配置

img

img

初始化函数

初始化函数
宏定义

#define DONG_OUT_1_Pin GPIO_PIN_1
#define DONG_OUT_1_GPIO_Port GPIOA
#define DONG_OUT_2_Pin GPIO_PIN_2
#define DONG_OUT_2_GPIO_Port GPIOA

初始化函数是自动生成的

void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();//使能GPIOC时钟__HAL_RCC_GPIOD_CLK_ENABLE();//使能GPIOD时钟__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin, GPIO_PIN_RESET); //设置上电电平为低 0/*Configure GPIO pins : PAPin PAPin */GPIO_InitStruct.Pin = DONG_OUT_1_Pin|DONG_OUT_2_Pin; //两个GPIO_PINGPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;          //推挽输出模式GPIO_InitStruct.Pull = GPIO_NOPULL;                  //浮空,不上拉也不下拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;         //低速HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);              //初始化GPIOA
}

输出相关函数

设置或清除选定的数据端口位

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

参数:

  • GPIOx :其中x可以(A..G取决于所使用的设备)来选择GPIO外设

  • GPIO_Pin :指定要写入的端口位。此参数可以是GPIO_PIN_x之一,其中x可以是( 0..15 )。

  • PinState :指定要写入选定位的值。此参数可以是GPIO_PinState枚举值之一:

  • GPIO_PIN_RESET: 清除端口Pin, 低电平 0

  • GPIO_PIN_SET: 设置端口Pin, 高电平 1

例子:

HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin, GPIO_PIN_RESET); //两个设置为低电平
HAL_Delay(1000);//1s
HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin, GPIO_PIN_SET); //单独设置为高电平
HAL_GPIO_WritePin(GPIOA,DONG_OUT_2_Pin, GPIO_PIN_SET);  //单独设置为高电平
HAL_Delay(1000);//1s

切换指定的GPIO pin

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

参数:

GPIOx :其中x可以(A..G取决于所使用的设备)来选择GPIO外设

GPIO_Pin :指定要写入的端口位。此参数可以是GPIO_PIN_x之一,其中x可以是(0..15 )。

例子:

HAL_GPIO_TogglePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin);//两个输出电平取反
HAL_Delay(1000);//1s
HAL_GPIO_TogglePin(GPIOA, DONG_OUT_1_Pin); //单独输出电平取反
HAL_GPIO_TogglePin(GPIOA,DONG_OUT_2_Pin);  //单独输出电平取反
HAL_Delay(1000);//1s

输入编程(轮询检测)

CubeMX设置

img

img

初始化函数

宏定义

#define DONG_IN_1_Pin GPIO_PIN_3
#define DONG_IN_1_GPIO_Port GPIOA
GPIO_InitTypeDef GPIO_InitStruct = {0}; //初始化结构体
__HAL_RCC_GPIOA_CLK_ENABLE();           //GPIO时钟开启
GPIO_InitStruct.Pin = DONG_IN_1_Pin;    //引脚
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入模式
GPIO_InitStruct.Pull = GPIO_PULLUP;     //上拉
HAL_GPIO_Init(DONG_IN_1_GPIO_Port, &GPIO_InitStruct);

输入相关函数

读取指定的输入端口引脚

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

参数:

  • GPIOx :其中x可以(A..G取决于所使用的设备)来选择GPIO外设
  • GPIO_Pin :指定要写入的端口位。此参数可以是GPIO_PIN_x之一,其中x可以是(0..15 )

返回:

typedef enum
{GPIO_PIN_RESET = 0u,//低电平GPIO_PIN_SET//高电平
} GPIO_PinState;

例子

GPIO_PinState res=HAL_GPIO_ReadPin(DONG_IN_1_GPIO_Port,DONG_IN_1_Pin);//读取电平
if(res==GPIO_PIN_RESET){HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin, GPIO_PIN_SET);//两个设置为高电平
}else{HAL_GPIO_WritePin(GPIOA, DONG_OUT_1_Pin|DONG_OUT_2_Pin, GPIO_PIN_RESET);//两个设置为低电平
}

输入编程(中断检测)

CubeMX设置

img

img

GPIO mode:

  • 上升沿触发检测的外部中断模式(External Interrupt Mode with Rising edge trigger detection)
  • 下降沿触发检测的外部中断模式(External Interrupt Mode with Falling edge trigger detectiort)
  • 上升/下降沿触发检测的外部中断模式(External Interrupt Mode with Risinq/Falling edge trigger detection)
  • 上升沿触发检测的外部事件模式(External Event Mode with Rising edge trigger detection)
  • 下降沿触发检测的外部事件模式(External Event Mode with Falling edge trigger detection)
  • 上升/下降沿触发检测的外部事件模式(External Event Mode with Rising/Falling edge trigger detectiont)

还需要手动开启(图片仅参考,并非当前工程使用)

img

中断和事件的区别:

  • 中断是当IO达到中断条件后会向CPU产生中断请求
  • 事件是事先设置好的任务,当单片机达到要求将通过硬件的方式处理事先设置好的任务,而不向CPU请求中断,比如DMA、AD转换等

初始化函数

宏定义

#define KEY1_Pin GPIO_PIN_3
#define KEY1_GPIO_Port GPIOA
#define KEY1_EXTI_IRQn EXTI3_IRQn

初始化部分

__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);

中断输入相关函数

中断回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

参数:

  • GPIO_Pin :指定连接EXTI线的引脚

例子:

//GPIO中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
//判断进入中断的GPIOs
if(KEY1_Pin==GPIO_Pin){HAL_GPIO_TogglePin(GPIOA, DONG_OUT_1_Pin);//单独输出电平取反HAL_GPIO_TogglePin(GPIOA,DONG_OUT_2_Pin);//单独输出电平取反}
}

关于防抖

关于按键防抖的问题:

  • 软件防抖可以检测到电平延时一段时间再确认电平,延时时间一般为10-20ms
  • 硬件防抖可以在按键上并联一个电容,一般为0.1uf

img

参考文章:
https://www.cnblogs.com/dongxiaodong/p/14128088.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/875539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html图片音频视频标签

1 图片 src 规定显示图像的URL height 图像高度 width 图像宽度 2 音频 src 规定音频的URL controls 显示播放控件 3 视频 src 规定视频的URL controls 显示播放控件 例子:

C#Socket通讯采用UTF8编码发送接收中英文混合消息出现乱码???

采用UTF8编码发送和接收中英文混合消息,中文呈???的乱码?,请问各位大咖问题出在哪里了?如下图:

面向长文本的多模型协作摘要架构:多LLM文本摘要方法

多LLM摘要框架在每轮对话中包含两个基本步骤:生成和评估。这些步骤在多LLM分散式摘要和集中式摘要中有所不同。在两种策略中,k个不同的LLM都会生成多样化的文本摘要。然而在评估阶段,多LLM集中式摘要方法使用单个LLM来评估摘要并选择最佳摘要,而分散式多LLM摘要则使用k个LLM进行…

Qt监控系统辅屏预览/可以同时打开4个屏幕预览/支持5x64通道预览/onvif和rtsp接入/性能好

一、前言说明 在监控系统中,一般主界面肯定带了多个通道比如16/64通道的画面预览,随着电脑性能的增强和多屏幕的发展,再加上现在监控摄像头数量的增加,越来越多的用户希望在不同的屏幕预览不同的实时画面,一个办法是打开多个软件实例,拖动到不同的屏幕,这个办法不可取,…

云手机通过CTS和GTS测试的重要性

云手机通过CTS和GTS测试的重要性 在云手机的开发和运营中,通过CTS(Compatibility Test Suite兼容性测试套件)和GTS(Google Services TestSuite谷歌服务测试套件)测试是确保设备兼容性和性能的关键环节。以下是CTS和GTS测试的重要性及其在云手机中的应用场景。CTS和GTS测试…

国产板卡设计原理图:2226-基于JFM7K325T PCIeX8 四路光纤卡

一、板卡概述 板卡主芯片采用JFM7K325T FPGA,pin_to_pin兼容FPGAXC7K410T-2FFG900,支持8-Lane PCIe、64bit DDR3、四路SFP+连接器、四路SATA接口、内嵌16个高速串行收发器RocketIO GTX,软件具有windows驱动。 二、功能和技术指标: 板卡功能参数内容主处理器JFM7K325T板卡标…

国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡

3U PXIe , FMQL45T900I , K7图形图像硬件加速器 , PXIe接口卡 , JFM7K325T 芯片一、板卡概述本板卡基于 FPGAJFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持PXIE标准协议,其中XJ3标准高速差分接口,支持P…

2024年最被过度炒作的AI初创企业的兴衰

你知道吗,大约90%的AI初创公司会失败?一些AI初创企业近几年吸引了大量关注,但最终以失败告终。我们不能被AI的热潮冲昏头脑,而是应该仔细研究导致这些过度炒作的AI初创企业失败的原因。作为一个亲身经历了这段旅程约1年半的人,我想在这篇文章中分享我的学习心得。那么,让…

泥石流滑坡监测识别摄像机

泥石流滑坡监测识别摄像机具有重要意义。山区地势复杂、易发生泥石流滑坡等灾害,给当地居民和交通运输带来巨大风险。通过部署这种设备,可以实时监测潜在危险区域,并利用智能分析技术识别出可能发生泥石流滑坡的迹象,及时发出预警信号通知相关部门和居民进行疏散和避险,最…

跌倒识别摄像机

跌倒识别摄像机是一种结合了智能分析技术和监控技术的先进设备,在保障弱势群体安全、减少意外伤害方面具有重要意义。随着社会老龄化程度加剧以及对健康保障需求增加,相信这种先进设备将会在更多领域得到广泛应用,并为我们创造更加关爱、安全的社会环境。跌倒识别摄像机是一…