STM32 基于HAL库和STM32cubeIDE的应用教程 (二)--GPIO的使用
如果有什么不懂的地方欢迎私聊博主,欢迎小白,博主必一一解答。
在 STM32 中,GPIO(通用输入输出)是与外部硬件接口进行交互的主要方式之一。STM32 HAL 库提供了简洁的接口来配置和控制 GPIO 引脚。下面是使用 STM32 HAL 库进行 GPIO 操作的详细教程。
1. 环境准备
确保您已经按照以下步骤准备好开发环境:
- STM32CubeIDE 已安装。
- 创建了 STM32 项目,配置了目标 STM32 微控制器或开发板。
2. 配置 GPIO 外设
在 STM32CubeIDE 中,我们通过 STM32CubeMX 来配置 GPIO 引脚。
步骤:
- 打开 STM32CubeIDE,选择新建一个 STM32 项目。
- 在
Pinout & Configuration页面,选择您要使用的 GPIO 引脚。例如,选择GPIOA上的引脚如PA5(通常用作 LED 灯),并设置为GPIO_Output,或GPIOA上的引脚如PA0设置为GPIO_Input。 - 在 Configuration 选项卡中,设置引脚的模式、输出类型等。
- 对于输出引脚,选择
Push-Pull,并设置速率。 - 对于输入引脚,选择
Pull-up或Pull-down,以决定输入信号的默认状态。
- 对于输出引脚,选择
- 在 Project 设置中,选择项目名称和代码生成选项(选择 STM32CubeIDE 为 IDE,选择 HAL 库作为中间件)。
- 点击 Generate Code,STM32CubeMX 会生成初始化代码。
3. HAL 库的 GPIO 操作
生成代码后,您可以开始在 main.c 文件中编写应用程序,利用 STM32 HAL 库操作 GPIO 引脚。
GPIO 输入输出操作
1.初始化 GPIO
STM32CubeMX 会自动生成用于初始化 GPIO 的代码,您只需调用 HAL_GPIO_Init() 函数。例如,在 main.c 中可以看到类似这样的初始化代码,我以注释的方式,解释了代码。
// main.c
#include "main.h"int main(void)
{HAL_Init(); // 初始化 HAL 库SystemClock_Config(); // 配置系统时钟MX_GPIO_Init(); // 初始化 GPIOwhile (1){// 在主循环中进行其他任务}
}void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟// 配置 PA5 为输出GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 设置输出速度HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化 GPIOA5// 配置 PA0 为输入GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿中断模式GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化 GPIOA0
}
GPIO 输出操作
要设置 GPIO 引脚的输出状态(高电平或低电平),您可以使用 HAL_GPIO_WritePin() 函数。例如:
// 设置 PA5 为高电平(点亮 LED)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 高电平// 设置 PA5 为低电平(熄灭 LED)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 低电平
GPIO 输入操作
要读取 GPIO 引脚的输入状态,可以使用 HAL_GPIO_ReadPin() 函数。例如,读取 PA0 的状态:
GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);if (pinState == GPIO_PIN_SET) {// 引脚 PA0 为高电平
} else {// 引脚 PA0 为低电平
}
GPIO 中断操作
STM32 HAL 库还支持 GPIO 中断。通过 STM32CubeMX 配置中断模式,例如将 PA0 设置为上升沿触发的中断。下面介绍中断的概念。
额外(中断是什么?)
中断(Interrupt)是微控制器(单片机)处理外部事件或任务的一种机制。它允许微控制器在执行程序的过程中,能够中断当前的工作,立即响应外部事件,然后在处理完事件后恢复到原来的工作状态。中断是实时操作系统(RTOS)和高效嵌入式系统设计中常用的一种技术。
中断的工作原理
当一个中断发生时,微控制器会:
-
暂停当前程序:当前正在执行的代码(包括主程序或其他中断服务程序)会被暂停。微控制器保存当前的执行状态(程序计数器、寄存器值等)。
-
跳转到中断处理函数(ISR):程序计数器会被修改,跳转到对应的中断服务程序地址。该中断服务程序通常是用户编写的代码,用来处理特定的中断事件。
-
处理中断:在中断服务程序中,微控制器执行相应的代码以响应中断,比如读取传感器数据、处理外部设备的请求等。
-
恢复执行:中断处理完毕后,微控制器恢复执行原来的程序,继续之前被暂停的操作。
回归正题 ,将 PA0 设置为上升沿触发的中断
在代码中,您需要启用和配置外部中断:
// 在 MX_GPIO_Init 函数中启用中断
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn); // 启用 EXTI0_1 中断
中断服务程序(ISR)通常放在 stm32f1xx_it.c 中:
// 中断回调函数
void EXTI0_1_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 处理外部中断
}// 回调函数,当发生中断时调用
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_0) {// 对 PA0 引脚的中断进行处理}
}
4. 使用外设和其他功能
- 配置和使用多个 GPIO 引脚:通过 STM32CubeMX 配置多个 GPIO 引脚进行输入、输出或中断操作。
- 控制 LED:在
main.c中使用HAL_GPIO_WritePin()控制连接到开发板的 LED。 - 配置按键:配置外部按键,并在中断或轮询模式下读取按键状态。
5. 示例代码:点亮 LED
下面是一个完整的示例,展示如何通过 GPIO 控制 LED:
#include "main.h"// 主函数
int main(void)
{HAL_Init(); // 初始化 HAL 库SystemClock_Config(); // 配置系统时钟MX_GPIO_Init(); // 初始化 GPIOwhile (1){// 点亮 LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);HAL_Delay(500); // 延时 500ms// 熄灭 LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);HAL_Delay(500); // 延时 500ms}
}// GPIO 初始化函数
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟// 配置 PA5 为输出(LED)GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 设置输出速度HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化 GPIOA5
}
6. 小结
- GPIO 初始化:通过 STM32CubeMX 配置引脚,并使用 HAL 库函数进行初始化。
- 输入输出操作:使用
HAL_GPIO_WritePin()控制输出,使用HAL_GPIO_ReadPin()读取输入。 - 中断处理:通过 STM32CubeMX 配置中断,并在中断回调函数中处理外部中断。
相关文章:
STM32 基于HAL库和STM32cubeIDE的应用教程 (二)--GPIO的使用
如果有什么不懂的地方欢迎私聊博主,欢迎小白,博主必一一解答。 在 STM32 中,GPIO(通用输入输出)是与外部硬件接口进行交互的主要方式之一。STM32 HAL 库提供了简洁的接口来配置和控制 GPIO 引脚。下面是使用 STM32 HA…...
【毫米波雷达(七)】自动驾驶汽车中的精准定位——RTK定位技术
一、什么是RTK? RTK,英文全名叫做Real-time kinematic,也就是实时动态。这是一个简称,全称其实应该是RTK(Real-time kinematic,实时动态)载波相位差分技术。 二、RTK的组装 如上图所示&#x…...
Transformer和BERT的区别
Transformer和BERT的区别比较表: 两者的位置编码: 为什么要对位置进行编码? Attention提取特征的时候,可以获取全局每个词对之间的关系,但是并没有显式保留时序信息,或者说位置信息。就算打乱序列中token…...
linux 加载uPD720201固件
硬件 jetson orin nano jetpack 35.5.0 uPD720201是瑞萨推出的怕pcie扩展usb3.0芯片,支持flash主动加载与在系统被动加载 本文介绍如何做到没接flash情况下由系统加载固件 在uPD720201没接spi flash时候nano启动会报XhciDxe错误而自动重启,首先需要在ue…...
C语言中的信号量semaphore详解
在C语言中,**信号量(Semaphore)**是一种常用的同步机制,用于控制多个线程或进程对共享资源的访问。信号量可以实现类似于锁的效果,但更为灵活,适用于并发编程场景。 1. 什么是信号量 信号量可以看作是一个…...
0087__DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区
DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区-CSDN博客...
Windows换机华为擎云(银河麒麟V10+麒麟9000C CPU)后,使用selenium的程序怎么办(20241030)
原本的 seleniumChrome 已无法正常工作。chromedriver 报错:不支持 Linux/aarch64。 1、尝试Firefox、edge驱动。Firefox有一个geckodriver版本与Firefox版本的对照表,我看了一下,感觉他们是始终跟进新技术的。银河麒麟的很多库都是几年前的…...
linux 下 signal() 函数的用法,信号类型在哪里定义的?
--------------------------------------------------- author: hjjdebug date: 2024年 11月 07日 星期四 14:47:33 CST description: linux 下 signal() 函数的用法 --------------------------------------------------- signal 是linux 下最基础的进程通讯机制…...
享元模式及其运用场景:结合工厂模式和单例模式优化内存使用
介绍 享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用,尤其是对于大量相似对象的场景。享元模式通常与工厂模式和单例模式结合使用,从而有效地控制和复用对象的创建。在享元模式中&am…...
【物联网技术】ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——UDP数据透传
前言:完成ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——实现UDP数据透传 STA模式,通俗来说就是模块/单片机去连接路由器/热点来通信。 UDP协议,是传输层协议,UDP没有服务器和客户端的说法。 本实验需要注意,wifi模块/单片机与电脑/手机需要连接在同一个…...
【SQL Server】华中农业大学空间数据库实验报告 实验一 数据库
实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法,认识界面,了解其两个基本操作系统文件,并能熟练区分与应用交互式与T-SQL式两种方法在SQL Server中如何进行操作;学习有关数据库的基本操作,包括:…...
操作系统页面置换算法Java实现(LFU,OPT,LRU,LFU,CLOCK)
FIFO先进先出算法 java import java.util.LinkedList; import java.util.Queue; public class Main { //先进先出的思想 是 用一个队列去模拟数据 如果当前不存在就是发生缺页中断了 就需要添加 如果已经满了 将队头的元素出队 即可 //先进先出 就是一个数组 frameCount publi…...
Request和Response
前言 这一节主要讲的是Request和Response还有一些实例 1. 介绍 就是这两个参数 WebServlet("/demo7") public class ServletDemo7 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletExcepti…...
【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析
引言 在现代电子产品中,控制芯片的性能直接影响到设备的功能和用户体验。摇头机、舞台灯、打印机和白色家电等领域对控制精度、功耗和成本等方面的要求日益提高。LV8549/ONSEMI等国际品牌的芯片曾是这些产品的主要选择,但随着国内半导体技术的进步&…...
(十二)JavaWeb后端开发——MySQL数据库
目录 1.数据库概述 2.MyQSL 3.数据库设计 DDL 4.MySQL常见数据类型 5.DML 1.数据库概述 数据库:DataBase(DB),是存储和管理数据的仓库 数据库管理系统:DataBase ManagementSystem(DBMS),操纵和管理数据库的大型软件 SQL&a…...
pnpm管理多工作区依赖
pnpm是一个支持多包仓库的一个包管理工具,那么怎么可以在项目根目录下执行pnpm install的时候,也能同步让所有的工作区都能够通安装依赖呢? 方式一,在执行pnpm install指令的时候,添加recursive参数: pnpm install --recursive 方式二,在项目的根目录下通过pnpm的配置文件p…...
如何在本地Linux服务器搭建WordPress网站结合内网穿透随时随地可访问
文章目录 前言1. 安装WordPress2. 创建WordPress数据库3. 安装相对URL插件4. 安装内网穿透发布网站4.1 命令行方式:4.2. 配置wordpress公网地址 5. 配置WordPress固定公网地址 前言 本文主要介绍如何在Linux Ubuntu系统上使用WordPress搭建一个本地网站,…...
二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
文章目录 零、前言一、应用层协议原理1.1 网络应用的体系结构1.1.1 客户-服务器(C/S)体系结构1.1.2 对等体(P2P)体系结构1.1.3 C/S 和 P2P体系结构的混合体 1.2 进程通信1.2.1 问题1:对进程进行编址(addressing)&#…...
面粉直供系统|基于java和小程序的食品面粉直供系统设计与实现(源码+数据库+文档)
面粉直供系统 目录 基于java和小程序的食品面粉直供系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&#x…...
十四:java web(6)-- Spring Spring MVC
目录 Spring MVC 1.1 Spring MVC 概述 1.1.1 什么是 MVC 模式 1.1.2 Spring MVC 工作原理 1.2 Spring MVC 核心组件 1.2.1 DispatcherServlet 1.2.2 控制器(Controller) 1.2.3 请求映射(RequestMapping) 1.2.4 视图解析器…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
