目录
1、前言
本文目的:在RT Thread Studio中通过按键点灯
RT Thread Studio 版本:2.1.0
原理图:
2、普通点灯
实现点灯功能,之前老版本的RT Thread studio中main函数就默认写的有点灯,不过现在新的版本中换成了输出"Hello World"。
这里需要用到RT-Thread文档设备中https://www.rt-thread.org/document/site/programming-manual/device/pin/pin/的PIN设备。
1、设置引脚输出模式为PIN_MODE_OUTPUT,其中需要定义输出引脚 #define LED0_PIN GET_PIN(A, 5) 或 (#define LED0_PIN 5 )这里的 5 和GET_PIN(A, 5)是等价的,详细可以看drv_gpio.c函数;
2、控制引脚输出电平的高低。
#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#define LED0_PIN 5 //引脚标号
int main(void)
{
int count = 1;
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); //输出模式
while (count++)
{
rt_pin_write(LED0_PIN, count % 2); //使能灯闪烁
rt_thread_mdelay(500);
}
return RT_EOK;
}
3、通过按键点灯
添加按键有两种方式:1、采用按键中断的形式;2、采用轮询的方式。
轮询:
这里有两种方法:1、自己写的;2、调用RT Thread软件包
1、自己写的:在while(1)中读取按键电平的高低,进而判断按键是否按下,根据原理图可以得知,电平默认为1,因此读到为0就表示按下。先设置按键引脚为输入模式,再通过调用下列函数来实现:
#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#define LED0_PIN 5
#define LED1_PIN 6
#define KEY1_PIN GET_PIN(C, 13) //按键引脚定义
#define KEY2_PIN GET_PIN(C, 14)
int main(void)
{
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); //输出模式
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(KEY2_PIN, PIN_MODE_INPUT_PULLUP);
while (1)
{
if(rt_pin_read(KEY1_PIN) == PIN_LOW)
{
rt_thread_mdelay(1); //消抖
if(rt_pin_read(KEY1_PIN) == PIN_LOW)
{
rt_pin_write(LED1_PIN, PIN_HIGH);//点灯1
}
}
if(rt_pin_read(KEY2_PIN) == PIN_LOW)
{
rt_thread_mdelay(1); //消抖
if(rt_pin_read(KEY2_PIN) == PIN_LOW)
{
rt_pin_write(LED1_PIN, PIN_LOW);//灭灯1
}
}
}
return RT_EOK;
}
2、调用的软件包
添加成功之后,Ctrl+S保存一下,可以看见工程中多了packages一个文件夹,里面就是存放自己添加的软件包。
点开里面的button.c文件,发现这个软件包是基于按键中断写的,大部分功能都已经封装好了,会用就行了。
#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>
#include "button.h"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#define LED0_PIN 5
#define LED1_PIN 6
#define KEY1_PIN GET_PIN(C, 13) //按键引脚定义
#define KEY2_PIN GET_PIN(C, 14)
Button_t Button1;
Button_t Button2;
/*****按键检测接口****/
uint8_t Read_Button1_Level(void)
{
return rt_pin_read(KEY1_PIN);
}
uint8_t Read_Button2_Level(void)
{
return rt_pin_read(KEY2_PIN);
}
/*******按键回调函数*******/
void Btn1_Dowm_CallBack(void *btn)
{
rt_pin_write(LED1_PIN, PIN_HIGH); //点灯1
}
void Btn2_Dowm_CallBack(void *btn)
{
rt_pin_write(LED1_PIN, PIN_LOW); //灭灯1
}
int main(void)
{
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); //LED输出模式
Button_Create("Button1", //按键名字
&Button1, //按键句柄
Read_Button1_Level, //按键电平检测函数接口
0); //触发电平
Button_Create("Button2", //按键名字
&Button2, //按键句柄
Read_Button2_Level, //按键电平检测函数接口
0); //触发电平
Button_Attach(&Button1, BUTTON_DOWM, Btn1_Dowm_CallBack); //按键单击
Button_Attach(&Button2, BUTTON_DOWM, Btn2_Dowm_CallBack); //按键单击
while (1)
{
Button_Process(); //按键轮询函数
rt_thread_mdelay(20); //20ms-50ms
}
return RT_EOK;
}
中断:
采用中断的方式,以引脚下降沿为中断触发条件进入中断服务函数,需要用到以下两个函数:
#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#define LED0_PIN 5
#define LED1_PIN 6
#define KEY1_PIN GET_PIN(C, 13) //按键引脚定义
#define KEY2_PIN GET_PIN(C, 14)
/******按键1中断*******/
void led_on(void *args)
{
rt_pin_write(LED1_PIN, PIN_HIGH); //点灯1
}
/******按键2中断*******/
void led_off(void *args)
{
rt_pin_write(LED1_PIN, PIN_LOW); //灭灯1
}
int main(void)
{
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); //输出模式
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, led_on, RT_NULL); //设置下降沿中断
rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);
rt_pin_mode(KEY2_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(KEY2_PIN, PIN_IRQ_MODE_FALLING, led_off, RT_NULL); //设置下降沿中断
rt_pin_irq_enable(KEY2_PIN, PIN_IRQ_ENABLE);
while (1)
{
rt_thread_mdelay(100);
}
return RT_EOK;
}
4、输出结果