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

RT-Thread开发实战 --- PIN设备的使用

PIN设备的使用

  • 线程管理
    • 创建自己的线程
  • PIN设备
    • 获取引脚编号
    • 引脚模式
    • 引脚电平
    • 中断触发模式
    • 中断使能值
  • 点亮LED

线程管理

详细内容可以参考官方教程。

具体的API如下:

API描述
rt_thread_create创建一个动态线程
rt_thread_delete从系统中把使用 rt_thread_create() 创建出来的线程删除
rt_thread_init初始化静态线程对象
rt_thread_detach对于用 rt_thread_init() 初始化的线程,使用 rt_thread_detach() 将使线程对象在线程队列和内核对象管理器中被脱离
rt_thread_startup创建(初始化)的线程状态处于初始状态,并未进入就绪线程的调度队列,我们可以在线程初始化 / 创建成功后调用该函数接口让该线程进入就绪态
rt_thread_self在程序的运行过程中,相同的一段代码可能会被多个线程执行,在执行的时候可以通过该函数接口获得当前执行的线程句柄
rt_thread_yield调用该函数后,当前线程会把自己挂到这个优先级队列链表的尾部,然后激活调度器进行线程上下文切换
rt_thread_sleep调用该函数可以使当前线程挂起一段指定的时间,当这个时间过后,线程会被唤醒并再次进入就绪状态
rt_thread_delay调用该函数可以使当前线程挂起一段指定的时间,当这个时间过后,线程会被唤醒并再次进入就绪状态
rt_thread_mdelay调用该函数可以使当前线程挂起一段指定的时间,当这个时间过后,线程会被唤醒并再次进入就绪状态
rt_thread_suspend该函数只能使用来挂起当前线程(即自己挂起自己),不可以在线程A中尝试挂起线程B
rt_thread_resume恢复线程就是让挂起的线程重新进入就绪状态,并将线程放入系统的就绪队列中
rt_thread_control当需要对线程进行一些其他控制时,例如动态更改线程的优先级,可以调用该函数接口
rt_thread_idle_sethook设置空闲钩子函数,就可以在系统执行空闲线程时,自动执行空闲钩子函数来做一些其他事情
rt_thread_idle_delhook删除空闲钩子函数
rt_scheduler_sethook在系统线程切换时,这个钩子函数将被调用

创建自己的线程

  1. 新建一个C文件,编写好一个框架,用于下一小节点亮LED
    在这里插入图片描述
  2. 代码如下:
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Version* 2025-11-09     DrsonXu      1.0*/#include <rtthread.h>#define DBG_TAG "testLED"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#define THREAD_PRIORITY     25
#define THREAD_STACK_SIZE   512
#define THREAD_TIMESLICE    5static rt_thread_t tid1 = RT_NULL;/*线程的入口函数*/
static void thread_entry(void *parameter)
{/*打印10次信息后,退出*/int count = 1;for (count = 0; count < 10; ++count){LOG_D("Hello My Thread!");rt_thread_mdelay(1000);}rt_kprintf("test LED thread exit\n");
}/* 点亮LED示例 */
int testLED_sample(void)
{/*创建一个线程,用于打印信息*/tid1 = rt_thread_create("testLED",thread_entry,RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE);/*启动线程*/if (tid1 != RT_NULL){rt_thread_startup(tid1);}return 0;
}/*导出到msh命令列表中*/
MSH_CMD_EXPORT(testLED_sample, test LED sample);
  1. 运行效果
    在这里插入图片描述

PIN设备

详细可参考官方文档

具体API如下:

API描述
rt_pin_get()获取引脚编号
rt_pin_mode()设置引脚模式
rt_pin_write()设置引脚电平
rt_pin_read()读取引脚电平
rt_pin_attach_irq()绑定引脚中断回调函数
rt_pin_irq_enable()使能引脚中断
rt_pin_detach_irq()脱离引脚中断回调函数

获取引脚编号

  1. 使用API
  2. 使用宏定义
  3. 查看驱动文件

引脚模式

宏定义描述
PIN_MODE_OUTPUT推挽输出
PIN_MODE_OUTPUT_OD开漏输出,硬件需要外加上拉电阻
PIN_MODE_INPUT输入
PIN_MODE_INPUT_PULLUP上拉输入,引脚悬空时为高电平
PIN_MODE_INPUT_PULLDOWN下拉输入,引脚悬空时为低电平

引脚电平

描述
PIN_LOW低电平
PIN_HIGH高电平

中断触发模式

宏定义描述
PIN_IRQ_MODE_RISING上升沿触发
PIN_IRQ_MODE_FALLING下降沿触发
PIN_IRQ_MODE_RISING_FALLING双边沿触发
PIN_IRQ_MODE_HIGH_LEVEL高电平触发
PIN_IRQ_MODE_LOW_LEVEL低电平触发

中断使能值

描述
PIN_IRQ_ENABLE开启中断
PIN_IRQ_DISABLE关闭

点亮LED

  1. 硬件原理图
    在这里插入图片描述
  2. 修改testLED.c文件,代码如下:
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Version* 2025-11-09     DrsonXu      1.0*/#include <rtthread.h>#define DBG_TAG "testLED"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#include <rtdevice.h>
#include "drv_common.h"#define THREAD_PRIORITY     25
#define THREAD_STACK_SIZE   512
#define THREAD_TIMESLICE    5/*定义LED引脚*/
#define LED_PIN             GET_PIN(C, 13)static rt_thread_t tid1 = RT_NULL;/*线程的入口函数*/
static void thread_entry(void *parameter)
{/*配置GPIO引脚*/rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);while(1){/*低电平,点亮LED*/rt_pin_write(LED_PIN, PIN_LOW);rt_thread_mdelay(500);/*高电平,熄灭LED*/rt_pin_write(LED_PIN, PIN_HIGH);rt_thread_mdelay(500);}/*不会到达这里*/rt_kprintf("test LED thread exit\n");
}/* 点亮LED示例 */
int testLED_sample(void)
{/*创建一个线程,用于打印信息*/tid1 = rt_thread_create("testLED",thread_entry,RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE);/*启动线程*/if (tid1 != RT_NULL){rt_thread_startup(tid1);}return 0;
}/*导出到msh命令列表中*/
MSH_CMD_EXPORT(testLED_sample, test LED sample);
  1. 效果如下:
    在这里插入图片描述
http://www.dtcms.com/a/588861.html

相关文章:

  • Android的binder机制理解
  • 二十五、STM32的DMA(数据转运)
  • 湖北省建设厅政务公开网站wordpress加速网站插件
  • 提示词(Prompt)工程与推理优化
  • 简析单目相机模型中的针孔模型
  • Apache Flink CDC——变更数据捕获
  • 从“数据堆场”到“智能底座”:TDengine IDMP如何统一数据语言
  • 从细胞工厂到智能制造:Extracellular 用 TDengine 打通数据生命线
  • 哪里有建设网站的html展示wordpress
  • Windows 下编译 WhisperKit Android CLI 的解决方案
  • 【第二十一周】机器学习周报
  • 如何在 Ubuntu 24.04 上安装和使用 AdGuard
  • 传统的企业服务如何部署在k8s集群中
  • 【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 2
  • 淘车车二手车数据采集:API接口分析与数据爬取实战
  • C++幻象:内存序、可见性与指令重排
  • 【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 1
  • Product Hunt 每日热榜 | 2025-11-09
  • 网站备案幕布照片尺寸3d溜溜网装修效果图
  • GER VPN 实现pc1和pc2之间的互通
  • 嵌套 Git 仓库(Submodule/子模块)
  • prompt[ai开发项目指示]
  • Go语言:使用Gin框架实现文件上传API服务(一)
  • wordpress社交链接图标宁波seo搜索引擎优化
  • Typora 精通指南:掌握高效 Markdown 写作的艺术
  • WinFrom窗体开发之鼠标交互
  • 【c# 想一句话把 List<List<string>>的元素合并成List<string>】2023-2-9
  • JAVA Function
  • MyBatis-Plus 通用 CRUD 操作全景指南
  • 公司网站建设 意义水果营销软文