当前位置: 首页 > news >正文

【STM32HAL-----GPIO】

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;
}

相关文章:

【STM32HAL-----GPIO】

1. 什么是GPIO?(了解) 2. STM32 GPIO简介 2.1. GPIO特点 2.2. GPIO电气特性 2.3. GPIO引脚分布图 IO引脚分布特点:按组存在、组数视芯片而定、每组最多16个IO引脚。 3. IO端口基本结构介绍 4. GPIO八种工作模式 4.1. 输入浮空 特…...

Java Web开发高级——单元测试与集成测试

测试是软件开发的重要环节,确保代码质量和功能的正确性。在Spring Boot项目中,单元测试和集成测试是常用的两种测试类型: 单元测试:测试单个模块(如类或方法)是否按预期工作。集成测试:测试多个…...

编译chromium笔记

编译环境: windows10 powershell7.2.24 git 2.47.1 https://storage.googleapis.com/chrome-infra/depot_tools.zip 配置git git config --global user.name "John Doe" git config --global user.email "jdoegmail.com" git config --global …...

Web开发 -前端部分-CSS3新特性

1 CSS概述 2 CSS3私有前缀 3 CSS3的长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

【基础篇】什么是SQL注入,如何防止?

什么是 SQL 注入&#xff0c;如何防止&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;它发生在 Web 应用程序中&#xff0c;当恶意用户在输入数据时&#xff0c;将恶意的 SQL 代码插入到输入中&#xff0c;从而导致应用程序…...

Swift语言的数据结构

Swift语言的数据结构 Swift是一种现代化的编程语言&#xff0c;它以安全性、性能和简洁性著称。尽管Swift通常被视为面向对象的语言&#xff0c;但它也支持函数式编程的特性&#xff0c;使得开发者可以以多种方式构建应用程序。在Swift中&#xff0c;数据结构是编程的基础&…...

牛客周赛 Round 77

题目链接&#xff1a;牛客周赛 Round 77 A. 时间表 tag&#xff1a;签到 B. 数独数组 tag&#xff1a;签到 Description&#xff1a;给定n个数&#xff0c;每个数的范围为1-9&#xff0c;问能否经过排列&#xff0c;使其每个长度为9的连续子数组都包含1-9这9个数字。 Sol…...

浅谈云端编辑器,分析其亮点与不足

浅谈云端编辑器&#xff0c;分析其亮点与不足 这个云端编辑器界面可以分为左侧题目筛选栏、中间题目描述与代码编辑区域、右侧AI提示功能三部分。以下是详细的分析&#xff1a; 1. 左侧题目筛选栏 层次结构清晰&#xff1a;左侧栏展示了一个层级结构&#xff0c;题目按主题分…...

web应用引入cookie机制的用途和cookie技术主要包括的内容

web应用引入cookie机制&#xff0c;用于用户跟踪。 &#xff08;1&#xff09;HTTP响应报文中的Cookie头行&#xff1a;set-Cookie &#xff08;2&#xff09;用户浏览器在本地存储、维护和管理的Cookie文件 &#xff08;3&#xff09;HTTP请求报文中的Cookie头行&#xff1a;…...

【HTML+CSS】使用HTML与后端技术连接数据库

目录 一、概述 1.1 HTML前端 1.2 后端技术 1.3 数据库 二、HTML表单示例 三、PHP后端示例 3.1 连接数据库 3.2 接收数据并插入数据库 四、安全性 4.1 防止SQL注入 4.2 数据验证与清洗 五、优化 5.1 索引优化 5.2 查询优化 六、现代Web开发中的最佳实践 6.1 使用…...

「2024·我的成长之路」:年终反思与展望

文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日&#xff0c;2024年博客之星入围公布&#xff0c;很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年&#xff0c;是意义非凡的一年&#xff0c;是充…...

C#PaddleOCRSharp使用

using PaddleOCRSharp;namespace PaddleOCRSharpDemo {internal class Program{static void Main(string[] args){//中英文模型V3模型OCRModelConfig config null;//OCR参数OCRParameter oCRParameter new OCRParameter();oCRParameter.cpu_math_library_num_threads 6;//预…...

【Excel】【VBA】Reaction超限点筛选与散点图可视化

【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能&#xff1a; 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…...

京华春梦,守岁这方烟火人间

文章目录 准备篇温度公共交通人流情况年货采购 文化体验传统庙会博物馆与展览烟花灯会祈福仪式民俗集市现代氛围其他活动 美食盛宴传统美食与特色小吃传统老字号京城新宠特色小吃街多元美食街 准备篇 温度 北京春节期间气温较低&#xff0c;室外通常在零下几度到零上几度之间…...

学Python的人…

学Python的人… 一、Python能干什么&#xff1f; 1.爬虫&#xff1a;前几年&#xff0c;深度学习还没发展起来的时候&#xff0c;书店里Python就和爬虫挂钩&#xff0c;因为Python写爬虫确实方便。 2.数据分析&#xff1a;Python有各种的数据分析库可以方便使用&#xff0…...

WebSocket 和 Socket 的区别

一、协议层次和工作方式 1.1 &#xff09;Socket 1.1.1&#xff09;Socket位于传输层&#xff0c;通常使用TCP或UDP协议 1.1.2&#xff09;提供了一个通用的网络编程接口&#xff0c;允许应用程序通过它发送和接收数据 1.1.3&#xff09;一般需要手动管理连接&#xff0c;错…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证6)

重新创建WebApi项目&#xff0c;安装Microsoft.AspNetCore.Authentication.JwtBearer包&#xff0c;将之前JwtBearer测试项目中的初始化函数&#xff0c;jwt配置类、token生成类全部挪到项目中。   重新编写login函数&#xff0c;之前测试Cookie和Session认证时用的函数适合m…...

【SpringBoot】SpringBoot中分页插件(PageHelper)的使用

目录 1.分页概念 2.原生写法 3.PageHelper插件分页查询 3.1 介绍 3.2?使用 3.3 Page对象和PageInf对象 1.分页概念 用户查询的数据不可能一次性全部展示给用户&#xff08;如果用户有一万条数据呢&#xff09;&#xff0c;而是分页展示给用户&#xff0c;这就是分页查询…...

【优选算法】4----盛最多水的容器

开始有点上强度了铁子们&#xff0c;这道算法题也是可以说很难理解的~ 想了好久才想明白~ ---------------------------------------begin--------------------------------------- 题目解析&#xff1a; 这一道题刚看题目&#xff0c;根本不知道在讲啥&#xff0c;但看到体积…...

EDI安全:2025年数据保护与隐私威胁应对策略

在数字化转型的浪潮中&#xff0c;电子数据交换&#xff08;EDI&#xff09;已成为企业间信息传递的核心基础设施。然而&#xff0c;随着数据规模的指数级增长和网络威胁的日益复杂化&#xff0c;EDI安全正面临前所未有的挑战。展望2025年&#xff0c;企业如何构建一套全面、高…...

代码随想录刷题day13|(链表篇)24.两两交换链表中的结点

目录 一、链表理论基础 二、思路及易错点 易错点 三、相关算法题目 四、错误代码分析 一、链表理论基础 代码随想录 (programmercarl.com) 二、思路及易错点 该题使用虚拟头结点正常进行模拟即可&#xff0c;有两个关键点&#xff0c;一是循环何时终止&#xff1f;终止…...

集群、分布式及微服务间的区别与联系

目录 单体架构介绍集群和分布式架构集群和分布式集群和分布式区别和联系 微服务架构的引入微服务带来的挑战 总结 单体架构介绍 早期很多创业公司或者传统企业会把业务的所有功能实现都打包在一个项目中&#xff0c;这种方式就称为单体架构 以我们都很熟悉的电商系统为例&…...

MySQL(4)多表查询

引言&#xff1a;为什么需要多表的查询&#xff1f; A&#xff1a;提高效率&#xff0c;多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询&#xff1a; SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…...

web前端3--css

注意&#xff08;本文一切代码一律是在vscode中书写&#xff09; 1、书写位置 1、行内样式 //<标签名 style"样式声明"> <p style"color: red;">666</p> 2、内嵌样式 1、style标签 里面写css代码 css与html之间分离 2、css属性:值…...

【Nacos】Nacos快速上手

Nacos快速上手 项目环境介绍一、服务注册/服务发现1.引入Spring Cloud Alibaba依赖2.引入Nacos相关的依赖3.引入Load Balance依赖4.配置Nacos的地址 二、修改远程调用代码三、测试四、启动多个服务&#xff0c;测试负载均衡五、可能出现的问题 项目环境介绍 请你确保你的服务器…...

C++otlv4连接sql serveer使用记录(注意点)

C使用otlv4在做插入时&#xff0c;有一些设计的坑需要注意 插入数据&#xff1a; 当要给表中插入单个字符时&#xff0c;数据库表设计使用varchar(1)是合理的&#xff0c;但是otlv4一直报错char。 后续查很久才知道&#xff0c;otlv4所写的绑定的字符数组的长度应该实际数组…...

在Linux中,如何查询已安装软件包的版本信息?

在Linux中&#xff0c;查询已安装软件包的版本信息可以使用多种方法&#xff0c;具体取决于你使用的Linux发行版及其所采用的包管理器。 RPM-based Linux系统&#xff08;如Red Hat、CentOS、Dedora&#xff09; 使用rpm命令查询所有已经安装的特定软件包及其版本&#xff1a…...

搜广推实习面经四

字节跳动TAC 广告算法 一、回归任务的评价指标有哪些 1.均方误差&#xff08;Mean Squared Error, MSE&#xff09;/均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09; M S E 1 n ∑ i 1 n ( y i − y ^ i ) 2 MSE \frac{1}{n} \sum_{i1}^{n} (y_i - \ha…...

【Elasticsearch】inference ingest pipeline

Elasticsearch 的 Ingest Pipeline 功能允许你在数据索引之前对其进行预处理。通过使用 Ingest Pipeline&#xff0c;你可以执行各种数据转换和富化操作&#xff0c;包括使用机器学习模型进行推理&#xff08;inference&#xff09;。这在处理词嵌入、情感分析、图像识别等场景…...

AQS公平锁与非公平锁之源码解析

AQS加锁逻辑 ReentrantLock.lock public void lock() {sync.acquire(1);}AbstractQueuedSynchronizer#acquire public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();}addWaiter就是将节点加入…...