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 | 在系统线程切换时,这个钩子函数将被调用 |
创建自己的线程
- 新建一个C文件,编写好一个框架,用于下一小节点亮LED

- 代码如下:
#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)
{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");
}
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_CMD_EXPORT(testLED_sample, test LED sample);
- 运行效果

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() | 脱离引脚中断回调函数 |
获取引脚编号
- 使用API
- 使用宏定义
- 查看驱动文件
引脚模式
| 宏定义 | 描述 |
|---|
| PIN_MODE_OUTPUT | 推挽输出 |
| PIN_MODE_OUTPUT_OD | 开漏输出,硬件需要外加上拉电阻 |
| PIN_MODE_INPUT | 输入 |
| PIN_MODE_INPUT_PULLUP | 上拉输入,引脚悬空时为高电平 |
| PIN_MODE_INPUT_PULLDOWN | 下拉输入,引脚悬空时为低电平 |
引脚电平
中断触发模式
| 宏定义 | 描述 |
|---|
| 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
- 硬件原理图

- 修改
testLED.c文件,代码如下:
#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
#define LED_PIN GET_PIN(C, 13)static rt_thread_t tid1 = RT_NULL;
static void thread_entry(void *parameter)
{rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);while(1){rt_pin_write(LED_PIN, PIN_LOW);rt_thread_mdelay(500);rt_pin_write(LED_PIN, PIN_HIGH);rt_thread_mdelay(500);}rt_kprintf("test LED thread exit\n");
}
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_CMD_EXPORT(testLED_sample, test LED sample);
- 效果如下:
