(STM32)从零开始的RT-Thread之旅--GPIO

news2025/2/26 1:18:57

上一篇:

(STM32)从零开始的RT-Thread之旅--基础项目构建与时钟配置

无论什么开发板,最先调试的肯定是GPIO,一般用来用作指示灯或者按键输入。本篇只是很简单的GPIO应用,没有具体分析RTT框架实现。

首先先创建一个BSP文件夹,里面可以放各种板级驱动:

然后依次再在文件夹里创建相关文件:

然后再把头文件路径添加进去:

然后把新增的头文件目录添加进去:

准备工作做好,就可以添加驱动代码。这里我的开发板上的LED是PE3,按键输入是PC13

在led.c中代码十分简单:


#include <rtthread.h>
#include <rtdevice.h>
#include "led.h"

void led_on(void *args)
{
    rt_pin_write(LED_PIN_NUM, PIN_HIGH);
}

void led_off(void *args)
{
    rt_pin_write(LED_PIN_NUM, PIN_LOW);
}

void led_init(void)
{
    rt_pin_mode(LED_PIN_NUM, PIN_MODE_OUTPUT);
    rt_pin_write(LED_PIN_NUM, PIN_LOW);
}

这个LED_PIN_NUM其实就是PE3的索引,我在led.h中定义它:

#ifndef BSP_INC_LED_H_
#define BSP_INC_LED_H_

#ifndef LED_PIN_NUM
    #define LED_PIN_NUM            67  /* PE3 */
#endif

void led_init(void);

#endif /* BSP_INC_LED_H_ */

它是怎么得到的呢?我们需要在drv_gpio.h中查询:

在这个文件中定义了一个数组,数组里面包含STM32最大引脚个数的所有引脚索引:

因为我们选择好MCU后RTT Studio就知道了我们芯片的封装,它会自动根据你芯片封装确定你芯片引脚个数,从而知道你的芯片有哪几个GPIO组,这些都不用我们关系和设置。从这个表里可以查到所有引脚的索引,比如我这里的:

然后看一下具体的引脚设置:

可以看到极其简单,其中引脚模式有几种:

然后按键使用了中断,具体设置如下:

至此框架已经搭建完毕,可以写个按键开关LED灯的测试代码:

只需要在key.c中添加:

#include <rtthread.h>
#include <rtdevice.h>
#include "key.h"
#include "led.h"
void key_irq(void *args)
{
    if(rt_pin_read(LED_PIN_NUM))
        rt_pin_write(LED_PIN_NUM, 0);
    else
        rt_pin_write(LED_PIN_NUM, 1);
}
void key_init(void)
{
    led_init();
    rt_pin_mode(KEY_PIN_NUM, PIN_MODE_INPUT_PULLDOWN);
    rt_pin_attach_irq(KEY_PIN_NUM, PIN_IRQ_MODE_RISING, key_irq, RT_NULL);
    rt_pin_irq_enable(KEY_PIN_NUM, PIN_IRQ_ENABLE);
}

然后在main.c中调用即可:

测试完成可以开始后续模块开发。 

下一章:

(STM32)从零开始的RT-Thread之旅--SPI驱动ST7735(1)

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

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

相关文章

机器人操作系统ROS(21) jetson nano安装torch tensorflow

安装torch、tensorflow其实跟普通在Linux系统安装没有区别&#xff0c;但是Linux是arch64位的&#xff0c;而jetson是aarch64位的&#xff0c;所以还是不太一样。 另外一个坑是&#xff1a;购买的创乐博的机器人&#xff0c;已经安装ros&#xff0c;但是安装torh的时候需要apt …

使用Spring实现工厂+策略模式

使用Spring实现工厂策略模式 这里使用发短信业务&#xff1a; 不同短信有不同模板但是发送方法都相同只是发送内同不同 1. 定义短信发送策略接口&#xff1a; //策略接口 public interface SmsTemStrategy {public void sendSms(Map<String,String> params); }2.短信…

【Python】Numpy傅里叶变换总结

文章目录简介fft简介 Fourier变换极其逆变换在数学上的定义如下 F(ω)∫−∞∞f(t)e−iωtdtf(t)π2∫−∞∞F(ω)eiωtdωF(\omega)\int^\infty_{-\infty}f(t)e^{-i\omega t}\text dt\\ f(t)\frac{\pi}{2}\int^\infty_{-\infty}F(\omega)e^{i\omega t}\text d\omega F(ω)∫−…

飞行机器人专栏(八)-- AGX Xavier 通信、控制及视觉应用开发

目录 0. Introduction of Jetson Developer kits 1. 硬件对比 Jetson 模组系列 Jetson AGX Orin 系列 Jetson Orin NX 系列 Jetson AGX Xavier 系列 Jetson Xavier NX 系列 Jetson TX2 系列 Jetson Nano 2. 应用场景 1. Introduction of AGX Xavier Taking Perform…

HTML+PHP+MySQL实现新闻列表模块(1+X Web前端开发中级 例题)——初稿

&#x1f4c4;题目要求 阅读下列说明、效果图、MySQL数据库操作和代码&#xff0c;进行动态网页开发&#xff0c;填写&#xff08;1&#xff09;至&#xff08;15&#xff09;代码。&#x1f9e9;说明 该程序为一个html和php混合的新闻列表模块&#xff0c;使用PHP语言&#x…

【深入浅出Spring6】第九期——Spring对事务的支持

因为很多系统都包含事务&#xff0c;所以Spring提供了相关的Api&#xff0c;属于AOP切面编程的二次封装 那么什么是事务&#xff08;Transaction&#xff09;呢&#xff1f; 指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)在一个业务流程中可能需要多条DML联合执…

【Hack The Box】Linux练习-- OpenAdmin

HTB 学习笔记 【Hack The Box】Linux练习-- OpenAdmin &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月22日&#x1f334; &#x…

Flutter组件--OverflowBox、SizedOverflowBox(子组件超出父组件裁剪)

1.OverflowBox介绍 OverflowBox 允许子控件超出父控件的边界。这个特性主要可以用来实现文字或者按钮角标的. OverflowBox构造函数 const OverflowBox({Key? key,this.alignment Alignment.center,this.minWidth,this.maxWidth,this.minHeight,this.maxHeight,Widget? ch…

java面试强基(8)

String、StringBuffer、StringBuilder 的区别&#xff1f; 可变性 ​ String 是不可变的。StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类&#xff0c;在 AbstractStringBuilder 中也是使用字符数组保存字符串&#xff0c;不过没有使用 final 和 private …

Air780E涂鸦云远程开关-LuatOS

Air780E涂鸦云远程开关-LuatOS 涂鸦智能在远程开关和灯控领域可以算是龙头了&#xff0c;今天就来学习一下&#xff0c;如何接入涂鸦云平台 一、涂鸦云准备 注册账号不写了&#xff0c;自己注册账号即可 1、创建产品 点击产品->极速智能化->产品开发页面的创建产品 …

JDK动态代理

可以针对一些不特定的类或者一些不特定的方法进行代理 可以在程序运行时动态变化代理规则 代理类在程序运行时才创建代理模式成为动态代理 代理类并不是在Java代码中定义好的 而是在程序运行时根据在Java代码中指示动态生成的 Proxy JDK动态代理 面向接口 import java.lang.r…

前后端分离页面(从数据库到前端、后端手把手教你如何搭建 -- 功能实现:增加查询)

目录 一、准备条件 前台 后台 二、数据库设计 建议不要导入&#xff0c;导入有乱码的风险&#xff1b;新建查询运行下面代码更快捷。 三、导入前端项目 导入后使用命令行打开黑窗口&#xff0c;测试一下有没有npm -v环境 如果出现命令无效&#xff0c;就使用管理员身份打开…

SpringAOP(1)-spring源码详解(六)

上篇文章说了spring监听器&#xff0c;监听event&#xff0c;先把事件全部存储在多播器&#xff0c;通过publicEvent来触发多播器发送事件&#xff0c;他可以通过代码注解&#xff0c;或者实现接口的方式来实现事件监听&#xff0c;达到解耦和异步的效果。 Spring监听器-sprin…

Jupyter介绍和安装使用

一. 前言&#xff1a; 最近&#xff0c;小熙发现了一个有意思的工具Jupyter notebook&#xff0c;刚上手熟悉了下&#xff0c;特此记录分享。 二. 简介&#xff1a; 简单介绍并说下用途&#xff1a; Jupyter Notebook是一款开源的web应用&#xff0c;支持markdown编辑&#…

Windows为什么使用广播机制更新信息?

很多 Windows 信息通知机制是基于广播消息&#xff0c;例如&#xff0c;DDE&#xff0c;WM_FONTCHANGE 消息和系统设置的修改等。 当我们知道&#xff0c;消息的广播可能导致系统由于某个窗口停止处理消息而导致整个系统停止时&#xff0c;为什么我们还是使用广播呢&#xff1f…

【解决】VSCode编写C++自定义头文件undefined reference异常问题

最近在使用VSCode编写C程序过程中&#xff0c;自定义一个 *.h 文件&#xff0c;其中包含了函数声明&#xff0c;在主函数中引入头文件后&#xff0c;调用头文件对应C文件中的方法&#xff0c;出现了undefined reference问题&#xff0c;这个主要是配置没有正确造成的&#xff0…

Git——分支(详细解释)

目录 一、概念 1.1 服务器运行模式 1.2 分支概念 1.3 分支的好处 二、分支相关操作 2.1 分支操作 2.2 查看当前分支 2.3 创建分支 2.4 切换分支 2.4.1 切换分支 2.4.2 修改代码并提交&#xff08;完整过程&#xff09; 三、合并分支 3.1 正常合并 3.2 冲突合并&#xff…

DGL学习笔记——第一章 图

提示&#xff1a;DGL用户指南学习中 文章目录一、关于图的基本概念&#xff1f;二、图、节点和边三、节点和边的特征四、从外部源创建图1、从Scipy稀疏矩阵中构建图示例2、从networkx中构建图示例3、从csv中构建图结构总结一、关于图的基本概念&#xff1f; 图是用以表示实体及…

【推荐系统学习笔记】-- 1、推荐系统架构

根本解决的问题&#xff1a;在信息过载的情况下&#xff0c;用户如何高效获取感兴趣的信息。 1 逻辑架构 推荐系统要处理的问题就可以被形式化地定义为&#xff1a;对于某个用户U&#xff08;User&#xff09;&#xff0c;在特定场景C&#xff08;Context&#xff09;下&…

区块链 - 各个国家Web3的现状与趋势

​潜力博主推荐&#xff0c;点上面关注博主↑↑↑ 2022年&#xff0c;元宇宙、NFT 、GameFi、DAO、DeFi 等 Web3 时代的新生事物&#xff0c;正在彻底改写传统商业模式&#xff0c;重塑全球数字商业的版图&#xff0c;一个全新的数字时代正在开启。 美国、欧洲官方开始在 Web…