【STM32HAL-----GPIO】

news2025/1/24 16:30:19

1. 什么是GPIO?(了解)

2. STM32 GPIO简介

2.1. GPIO特点

2.2. GPIO电气特性

2.3. GPIO引脚分布图

IO引脚分布特点:按组存在、组数视芯片而定、每组最多16个IO引脚。

3. IO端口基本结构介绍

4. GPIO八种工作模式

4.1. 输入浮空

特点:空闲时(高阻态),IO状态不确定,由外部环境决定。

4.2. 输入上拉

特点:空闲时(高阻态),IO呈现高电平。

4.3. 输入下拉

特点:空闲时(高阻态),IO呈现低电平。

4.4. 模拟功能

特点:专门用于模拟信号输入或输出,如ADC和DAC

4.5. 开漏输出

特点:不能输出高电平,必须有外部(或内部)上拉才能输出高电平。

4.6. 开漏式复用功能

特点:不能输出高电平,必须有外部(或内部)上拉才能输出高电平。由其他外部控制输出。

4.7. 推挽输出

特点:可输出高低电平,驱动能力强。

4.8. 推挽式复用功能

特点:可输出高低电平,驱动能力强,由其他外设控制输出。

5. GPIO寄存器

5.1. 端口配置寄存器(GPIOx_CRL和GPIOx_CRH)(x=A..E)

这两个寄存器都是GPIO口配置寄存器,不过CRL控制端口的低8位(GPIOx_0~7),CRH控制端口的高8位(GPIOx_8~15)。寄存器的作用是控制GPIO的工作模式工作速度

STM32F103为例,每组GPIO下有16个IO口,一个寄存器共32位,每4个位控制1个IO口,所以才需要俩个寄存器完成。我们看看这个寄存器的复位值,然后用复位值举例说明一下这样的配置值代表什么意思。比如 GPIOA_CRL 的复位值是 0x44444444,4 位为一个单位都是 0100,以寄存器低四位说明一下,首先位 1:0 为 00 即是设置为 PA0 为输入模式,位 3:2 为 01 即设置为浮空输入模式。所以假如 GPIOA_CRL 的值是 0x44444444,那么 PA0~PA7 都是设置为输入模式,而且是浮空输入模式。

上面这 2 个配置寄存器就是用来配置 GPIO 的相关工作模式和工作速度,它们通过不同的配置组合方法,就决定我们所说的 8 种工作模式。下面,我们来列表阐述,如表 13.1.3.1。

5.2. 端口输出数据寄存器(GPIOx_ODR)(x=A..E)

该寄存器用于控制GPIOx的输出高低电平。该寄存器32位,低16位为数据有效位,高16位为保留位

该寄存器低 16 位有效,分别对应每一组 GPIO 的 16 个引脚。当 CPU 写访问该寄存器,如果对应的某位写 0(ODRy=0),则表示设置该 IO 口输出的是低电平,如果写 1(ODRy=1),则表示设置该 IO 口输出的是高电平,y=0~15。

此外,除了 ODR 寄存器,还有一个寄存器也是用于控制 GPIO 输出的,它就是 BSRR 寄存器。

5.3. 端口输入数据寄存器(GPIOx_IDR)(x=A..E)

该寄存器可以读出GPIOx的端口的引脚状态。

5.4. 端口置位/复位寄存器(GPIOx_BSRR) (x=A..E)

该寄存器用于控制GPIOx的输出高低电平。该寄存器位32位,高16位为清除位,低16位为设置位。

5.5. 端口位设置/清除寄存器(GPIOx_BRR) (x=A..E)

该寄存器用于清除GPIOx组的位,高16位用于保留,低16位用来清除0~15口。

5.6. ODR和BSRR寄存器控制输出有什么区别?

使用ODR,在读和修改访问之间产生中断时,可能会发生风险,BSRR则无风险。

总的来说,建议大家使用BSRR寄存器控制输出。

6. 通用外设驱动模型(四步法)

7. GPIO配置步骤

8. 点亮一个LED灯(成为点灯大师的第一步)

分析IO应该设置为什么模式?推挽输出。开漏输出需要接外部或内部上拉电阻。

        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
        HAL_Delay(500);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
        HAL_Delay(500);
        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
        HAL_Delay(500);
        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);
        HAL_Delay(500);

9. 按键控制控制LED

如何消除抖动波形?

两种方法:软件消抖,通过延时跳过抖动的时间段,在判断IO输入电平。

硬件消抖,通过电路设计去除抖动波形,比如RS触发器、电容滤波。

按键原理图(精英板)

有三个按键,PA0、PE4、PE3。

分析IO应该设置为什么模式?

KEY_UP(PA0):接VCC,按下时为高电平,不按下为低电平。所以要设置为下拉输入,默认低电平。

KEY0(PE4):接GND,按下时为低电平,不按下为高电平。所以要设置为上拉输入,默认高电平。

KEY1(PE3):接GND,按下时为低电平,不按下为高电平。所以要设置为上拉输入,默认高电平。

int main(void)
{
    HAL_Init();                              
    sys_stm32_clock_init(RCC_PLL_MUL9);      
    delay_init(72);                          
    led_init();                             
    key_init();                              
    while(1)
    { 
        int ret=key_scan();       
        if(ret==1)
        {
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
        }
    }
}
void key_init(void)
{
    GPIO_InitTypeDef key_init_struct;
    __HAL_RCC_GPIOE_CLK_ENABLE();                          /* IO口PE时钟使能 */
    key_init_struct.Pin = GPIO_PIN_3;                      /* KEY0引脚 */
    key_init_struct.Mode = GPIO_MODE_INPUT;                /* 输入模式 */
    key_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    key_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(GPIOE, &key_init_struct) ;                /* 初始化KEY0引脚 */
}

uint8_t key_scan(void)
{
    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0)
    {
        delay_ms(10);       //消抖
        if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0)   //读取按键返回值
        {
            while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0);       //等待按键松开
            return 1;       //按键按下时返回1,没有返回0
        }
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘

解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal,选择版本后点击“install”执行安装

低代码系统-产品架构案例介绍、简道云(七)

今天分析另外一个零代码、低代码产品-简道云,跟所有低代码产品的架构图一样,高、大、炫、美。 依然是从下至上,从左到右的顺序。 开发层 搭建中心 表单、流程、报表、用户中心,还是这些内容,自定义打印很多平台都有&am…

Chrome 132 版本新特性

Chrome 132 版本新特性 一、Chrome 132 版本浏览器更新 1. 在 iOS 上使用 Google Lens 搜索 在 Chrome 132 版本中,开始在所有平台上推出这一功能。 1.1. 更新版本: Chrome 126 在 ChromeOS、Linux、Mac、Windows 上:在 1% 的稳定版用户…

计算机网络三张表(ARP表、MAC表、路由表)总结

参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…

cursor重构谷粒商城04——vagrant技术快速部署虚拟机

前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…

【玩转全栈】----Django连接MySQL

阅前先赞,养好习惯! 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings,连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改(更新)数据: 获取数据 1、OR…

Jmeter使用Request URL请求接口

简介 在Jmeter调试接口时,有时不清楚后端服务接口的具体路径,可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…

mock可视化生成前端代码

介绍:mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件,来解决我们的问题。目前支持vite和webpack。(配置超级简单!) 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…

输入网址到网页显示,发生了什么--讲述

输入www.baidu.com作为网址, 孤身的人-HTTP 浏览器要做的第一步就是 解析URL,根据url里面的资源路径,确认服务器资源和路径,生成http请求消息,包括请求消息(请求行 消息头 请求体) 举例&am…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…

Lock和Synchronized的区别,源码分析

Lock和Synchronized的区别&#xff0c;源码分析 探究Lock锁&#xff08;指实现Lock接口的锁&#xff0c;比如是ReentrantLock锁&#xff09;与Synchronized的区别。 以上区别都体现在Lock接口里定义的方法&#xff0c;以及实现Lock接口的类&#xff08;比如ReentrantLock&#…

如何把jupyter的一个.ipynb文件的多个单元格cell合并为1个cell

1 jupyter的一个.ipynb文件的多个单元格cell合并为1个cell 步骤 1&#xff1a;打开 your_notebook.ipynb 文件 启动 Jupyter Notebook。 导航到你的工作目录&#xff08;例如 F:\main&#xff09;。 打开 your_notebook.ipynb 文件。 步骤 2&#xff1a;选择所有单元格 点击…

Linux中的几个基本指令(二)

文章目录 1、cp指令例一&#xff1a;例二&#xff1a;例三&#xff1a;例四&#xff1a;例五&#xff1a; 2、mv 指令例一&#xff1a;例二&#xff1a; 3、cat指令例一&#xff1a; 4、tac指令5、which指令6、date指令时间戳&#xff1a;7、zip指令 今天我们继续学习Linux下的…

SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别

目录 JAVA 框架 javaEE spring springmvc springboot SSM SSH maven JAVA 一种面向对象、高级编程语言&#xff0c;Python也是高级编程语言&#xff1b;不是框架(框架&#xff1a;一般用于大型复杂需求项目&#xff0c;用于快速开发)具有三大特性&#xff0c;所谓Jav…

GS论文阅读--GeoTexDensifier

前言 本文是一个关于高斯致密化策略对高斯地图进行优化&#xff0c;他主要关注了几何结构和纹理信息。我最近对于高斯点的分布比较感兴趣&#xff0c;因为高斯点的分布决定了之后重建质量的好坏&#xff0c;初始化高斯很重要&#xff0c;但之后的维护需要致密化与修建策略&…

计算机视觉算法实战——无人机检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​ 1. 引言✨✨ 随着无人机技术的快速发展&#xff0c;无人机在农业、物流、监控等领域的应用越来越广泛。然而&#xff0c;无人机的滥用也带…

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…

软件测试 —— Postman(断言)

软件测试 —— Postman&#xff08;断言&#xff09; 断言示例断言检查状态码验证响应体中的特定字段检查响应时间验证响应头检查响应体中的字符串验证JSON数组长度 使用环境变量运行集合并查看结果 检查状态码检查响应体中的字符串检查响应体字符串是否相等验证响应头字段检查…

高并发处理 --- 超卖问题+一人一单解决方案

在高并发场景下&#xff0c;超卖和一人一单是两个典型的并发问题。为了解决这两个问题&#xff0c;我们可以使用乐观锁&#xff08;CAS&#xff09;和悲观锁&#xff0c;这两者分别有不同的实现方式和适用场景。下面我们详细介绍如何通过 乐观锁&#xff08;CAS&#xff09; 和…

汇编实验·分支程序设计

一、实验目的: 1.能够熟练的进行分支程序的编写,掌握条件语句对应的汇编语言指令的实现 2.掌握多个条件的分支语句的实现原理,理解C语言中的逻辑运算“短路”特征 二、实验内容 1.对2和3任务中的C代码在VS2022中运行,设置生成对应的汇编代码,观察生成代码的不同,着重…