使用HAL库开发STM32:GPIO口基础使用与外部中断

2023-11-12

目的

对于MCU来说GPIO口的使用是最基础的内容,仅使用GPIO口和延时等,就可以完成很多功能了。

GPIO口基础使用

基础说明

STM32的GPIO口可以工作在以下八种模式:

  • Input floating(浮空输入)
    默认情况下GPIO口处于浮空输入模式;
  • Input pull-up(上拉输入)
    基本数字输入使用;
  • Input-pull-down(下拉输入)
    基本数字输入使用;
  • Analog(模拟)
    一般用于ADC或DAC功能复用;
  • Output open-drain with pull-up or pull-down capability(具有上拉或下拉功能的开漏输出)
    基本输出使用,一般为了输出5V高电平的时候可以用该模式,然后外部上拉电阻到5V(注意只有Datasheet中I/O structure为FT的引脚才耐5V电压);
  • Output push-pull with pull-up or pull-down capability(具有上拉或下拉功能的推挽输出)
    基本输出使用;
  • Alternate function push-pull with pull-up or pull-down capability(具有上拉或下拉功能的复用功能推挽)
    用于其它外设复用;
  • Alternate function open-drain with pull-up or pull-down capability(具有上拉或下拉功能的复用功能开漏)
    用于其它外设复用;

初始化设置

使用STM32Cube来初始化设置IO口是比较方便的,毕竟初始化代码都会自动生成,当然我们也可以自己编写初始化代码,参考下面软件生成的初始化代码:

//以下代码将PA2口初始化设置为推挽输出模式
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0}; //声明GPIO初始化数据结构

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA口时钟

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); //设置初始为低电平

  /*Configure GPIO pin : PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2; //设置2口
  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); //初始化设置
}

输出与控制

输出模式算是最常用的功能,最常见的被用来接个LED做指示灯。
在这里插入图片描述

  • GPIO口设置为输出的时候模式可以配置为推挽输出或是开漏输出;
  • GPIO output level指端口初始输出状态;
  • Maximum output speed影响输出电平转换时的变化速度,速度越快变换越快,同时速度越快越容易因过冲问题对电信号产生干扰;
    在这里插入图片描述
    在编写程序时可以使用下面两个函数来改变IO口输出状态:
  • HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState)
    向指定IO口写值, GPIO_PIN_SET 为高(1), GPIO_PIN_RESET 为低(0);
  • HAL_GPIO_TogglePin(GPIOx, GPIO_Pin)
    翻转指定IO口输出值;

读取端口值

输入模式也比较常用,比如外接按钮、开关等,可以在输入模式下读取端口值来确认这些器件的状态。
在这里插入图片描述
输入模式下通过 HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) 函数来读取指定端口值,该函数返回 GPIO_PIN_SETGPIO_PIN_RESET

GPIO口与外部中断

STM32每一个IO口都可以设置外部中断,但有点限制,比如PA2设置了外部中断那么PB2、PC2、PD2……等等这些都无法设置外部中断了。所以在IO口上的外部中断最多可以设置0~15号共16个。IO口上的外部中断可以被配置成电平上升沿、下降沿、上升下降沿触发。
下面使用按钮进行外部中断使用演示,按照下图将按钮接到PA1脚,图中电容用于消除按钮操作时的电平抖动:在这里插入图片描述
按照下图进行初始化配置:
在这里插入图片描述
上图中设置了PA1脚外部中断,配置为上升下降沿均触发中断,并且将PA1设置为上拉模式,这样根据上面电路按钮未按下时端口为高电平,按钮按下时端口变为低电平。(为了方便测试这里我还启用了Debug引脚,下图就是实际调试效果)
在这里插入图片描述
上图中在软件自动生成的代码以外只添加了 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 函数,该函数就是IO口外部中断的回调函数,使用外部中断时除了配置以外我们只需要编写此函数就行。在上面例子中我在中断回调函数中读取了PA1的端口值,在调试中追踪该值。可以看到在按下和松开按钮时该值会被改变,说明中断被正确执行。

总结

GPIO口的基础使用比较简单,更多内容可以参考官方Datasheet、Reference manual、User Manual等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用HAL库开发STM32:GPIO口基础使用与外部中断 的相关文章

  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • 橙色 PI 上的双 RC522

    我的目标是使用带有 Orange PI 的双 RFID RC522 读取器 到目前为止 我只成功完成了一项工作 阅读 google armbian 和 Orange pi 论坛 这是我到目前为止所做的 硬件连接 单RC 522 MOSI g
  • 如何设置虚拟 GPIO 环回

    我目前正在开发一个应该在 Net 中使用 gpio 引脚的程序 我想在虚拟 GPIO 引脚上测试我的程序 但我不知道该怎么做 我想做一个环回 将虚拟 GPIO 1 连接到另一个虚拟 GPIO 2 我已经对串口和 tty0tty 做了类似的事
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • C、硬件抽象层中“extern”类型的变量

    我正在研究硬件抽象层 该 HAL 的目的是在 Linux 驱动程序和 MCU 驱动程序之间轻松切换 我正在研究SPI接口 下面是 打开 SPI接口的HAL函数的签名 哈尔 spi h spi handle t spi open spi po
  • mmap 比 ioremap 慢

    我正在为运行 Linux 2 6 37 的 ARM 设备进行开发 我正在尝试尽快切换 IO 引脚 我制作了一个小内核模块和一个用户空间应用程序 我尝试了两件事 使用以下命令直接从内核空间操作 GPIO 控制寄存器ioremap mmap G
  • gpiod - 在设备树中使用标签

    我想用libgpiod通过自定义板上的用户空间控制一些 GPIO 我有一个 i MX6UL 处理器 它有数百个引脚 我将只使用其中 8 个 作为 GPIO 我读到了关于libgpiod因为它正在取代旧的 sysfs API 我很高兴您可以为
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Beaglebone GPIO 输入不起作用

    我正在使用 beaglebone 通过 sysfs 接口访问特定引脚的数字输入 我可以更改输出状态 但不能更改输入 我所做的是 我有两个引脚 pinA 和 pinB pinA 我将其输出 pinB 我将其输入 将 pinA 连接到 pinB
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • 如何检查您的内核是否支持硬件上的 GPIO?

    我的目标是控制 Intel 主板 带 C1037U 处理器的 NM70 芯片组 上 Peppermint 4 Linux 内核版本 3 8 0 中的 GPIO 引脚 如何检查您的内核是否支持硬件上的 GPIO 背景 主板 Intel NM7
  • 从内核模块向用户空间通知 GPIO 中断[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一段代码可以检测内核模块中的 GPIO 中断 现在 我正在寻找一种机制 在检测到来自内核模块的 gpio 中断时通知用户空间 任何与不同选项
  • Beaglebone Black 上的 GPIO

    我目前遇到了 Beaglebone black GPIO 引脚的问题 我正在寻找一种正确的方法来读取 C 中的 GPIO 引脚 p8 4 的值 如果我理解正确的话 我尝试使用一个库 该库使用了在引入设备树之前不支持的旧方法 我尝试寻找其他解

随机推荐

  • LED点阵书写显示屏

    LED点阵书写显示屏 题目的大概要求是做一个32 32的点阵书写屏 LED 点阵模块显示屏工作在人眼不易觉察的扫描微亮和人眼可见的 显示点亮模式下 当光笔触及 LED 点阵模块表面时 先由光笔检测触及位置处 LED 点 的扫描微亮以获取其行
  • springboot no tests were found

    springboot单元测试报错 no tests were found 如图所示 原因分析 1 进行单元测试的方法不能有返回值 2 方法不能私有化 以上两个问题都会报 no tests were found 错误 正确写法
  • 华为od机试 Java 【url拼接】

    题目 给定一个URL的前缀和后缀 我们需要将其合并成一个完整的URL 在合并时 请注意以下几点 如果前缀的结尾没有斜线 而后缀的开头也没有斜线 那么在两者之间需要添加一个斜线 如果前缀的结尾和后缀的开头都有斜线 那么需要保留其中的一个 删除
  • Vue-生命周期函数

    Vue 生命周期函数 一 生命周期和生命周期函数 生命周期 Life Cycle 是指一个组件从创建 gt 运行 gt 销毁的整个阶段 强调的是一个时间段 生命周期函数 是由vue 框架提供的内置函数 会伴随着组件的生命周期 自动按次序执行
  • 【js】从数组中随机选一个数,从数组中随机选几个数

    每组中随机选一个 每组中随机选一个 randomFun arr let ri Math floor Math random arr length return arr ri 使用 let arr 1 2 3 4 5 6 7 console
  • Android QQ 登录接入详细介绍

    今日科技快讯 近日 百度地图发布2022春节出行大数据 迁徙大数据显示 2022年春运迁徙规模较去年农历同期有明显上升 春节期间全国人口迁徙规模日均值为去年农历同期的近两倍 春节前的迁徙规模峰值出现在1月29日 腊月廿七 春节后于2月6日达
  • Python写简单的拼图小游戏(附源码、资源)

    郑重声明 嘿嘿 代码与图片已上传资源 需要者自取 资源地址 https download csdn net download qq 44651842 20009562 Python小白一只 正在成长 程序自己设计 很多不足 算法很多地方能优
  • Java语言与面向对象的程序设计

    这几天很迷茫 听老师介绍了一款软件 中国大学MOOC 刚好我是软件专业的学生 索性听了北京大学老师的一节关于Java的讲课 果断被震撼到了 他们的讲课给人一种很深刻 深入 的感觉 我今天就把老师讲到的东西记了下来 以便于有兴趣的朋友阅读 J
  • Qt快速入门学习笔记(画图篇)

    1 Qt中提供了强大的2D绘图系统 可以使用相同的API在屏幕和绘图设备上进行绘制 它主要基于QPainter QPaintDevice和QPaintEngine这三个类 其中QPainter用来执行绘图操作 QPaintDevice提供绘
  • java开发利用jacob将word转pdf

    jacob 缺点 需要 window 环境 而且速度是最慢的需要安装 msofficeWord 以及 SaveAsPDFandXPS exe word 的一个插件 用来把 word 转化为 pdf 开发流程 SaveAsPDFandXPS
  • STM32驱动BH1750模块

    模块描述 BH1750FVI是一款用于I2C总线接口的数字环境光传感器IC 该集成电路最适合获取环境光数据 用于调整手机的 LCD和键盘背光功率 可以在高分辨率下检测宽范围 1 65535 lx 引脚说明 VCC 5V GND GND SC
  • Tomcat-JDBC源码解析及优化

    数据库连接池 连接池是常见的一种资源复用的技术 利用连接池 可以将那些创建开销较大的资源汇聚到一个池子里缓存起来 需要使用的时候只需要从连接池里取出来就可以了 中间省去了频繁的创建和销毁的过程 数据库连接池就是其中的典型应用 深入Tomca
  • jmeter分布式测试配置

    分机配置 1 执行配置文件 bin jmeter properties 文件 2 配置远程端口号 jmeter默认端口号1099 可以不进行配置 3 设置远程执行模式 设置配置文件 mode Standard前面的 注释去掉 server
  • HTML5元素周期表

    http www 52html5 com manual html5 Elements Table
  • chatGPT 学习分享:内含PPT分享下载

    InstructGPT论文地址 Training language models to follow instructions with human feedback chatGPT地址 openAI 个人整理的PPT 可编辑 下载地址 c
  • 光遇自动弹琴脚本代码_刚入门测试?那你就不得不看一下!一行代码解决问题...

    对于刚开始做自动化测试的新手同学来说 我们还是非常建议大家通过IDE提供的设备窗口去连接测试设备的 这样不仅可以非常直观地看到设备的画面 还可以在运行脚本时 自动帮大家生成带连接设备参数的运行命令 减少很多不必要的错误 当然 很多同学也会有
  • nodejs+npm的安装与配置

    目录 下载与安装 下载 安装 配置 nodejs相关配置 npm相关配置 nodejs的基本使用 搭建简易后端服务器 npm的基本使用 搭建vue 2 0开发环境 下载与安装 下载 点击 Node js中文网 根据自身系统进行下载即可 建议
  • 打不出电话显示无法连接到服务器,打电话显示无法连接到服务器

    打电话显示无法连接到服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 有以下几种现象 将制作好的SD卡插入开发者板并
  • mysql数据库用户控制权限

    grant all on dbname tablename to newuser identified by newuser123 拥有所有权限 grant select on dbname tablename to newuser ide
  • 使用HAL库开发STM32:GPIO口基础使用与外部中断

    文章目录 目的 GPIO口基础使用 基础说明 初始化设置 输出与控制 读取端口值 GPIO口与外部中断 总结 目的 对于MCU来说GPIO口的使用是最基础的内容 仅使用GPIO口和延时等 就可以完成很多功能了 GPIO口基础使用 基础说明