RT-Thread软件包SignalLed的使用
本文介绍了一个基于RT-Thread操作系统的LED控制模块实现。该模块通过宏定义可配置最多3个LED指示灯(LED1、LED2、LED3),支持多种闪烁模式(0.5Hz-10Hz频率、不同占空比、长短闪烁组合等)。每个LED通过独立的GPIO引脚控制,提供开关回调函数,并采用内存动态分配管理。系统初始化时创建LED对象并设置默认闪烁模式,同时启动一个独立线程进行LED状态更新。该实现具有可配置性
·
以下给定Led用户模板,可直接拷贝使用。给定控制三个LED指示灯,在.c文件中通过LED_x_open使能LED指示灯,通过#define LEDx_GPIO修改LED端口号。
#include <rtthread.h>
#include <rtdevice.h>
#include "signal_led.h"
#include <board.h>
#define LED_1_open 1
#define LED_2_open 1
#define LED_3_open 1
//定义内存操作函数接口
led_mem_opreation_t led_mem_opreation;
typedef enum {
LED_Run0_5HZ = 0,
LED_Run__1HZ,
LED_Run2_5HZ,
LED_Run__5HZ,
LED_Run_10HZ,
LED_All__OFF,
LED_All__ON,
LED_1HZ_80_ON,
LED_1HZ_80_OFF,
LED_0_5HZ_1_ON,
LED_0_5HZ_2_ON,
LED_0_5HZ_3_ON
} led_blink_mode_t;
const char *const led_blink_modes[] = {
"1000,1000,", // 0.5hz 闪烁(超慢) LED_0_5HZ
"500,500,", // 1hz 闪烁(慢) LED_1HZ
"200,200,", // 2.5hz 闪烁(快) LED_2_5HZ
"100,100,", // 5hz 闪烁(超快) LED_BLINK_4HZ
"50,50,", // 10hz 闪烁(极快) LED_BLINK_10HZ
"0,1000,", // 长灭 LED_BLINK_ALWAYS_OFF
"1000,0,", // 长亮 LED_BLINK_ALWAYS_ON
"800,200,", // 1hz 亮占空比80% LED_BLINK_1HZ_MORE_ON
"200,800,", // 1hz 亮占空比20% LED_BLINK_1HZ_MORE_OFF
"200,1800,", // 2s闪一下
"200,200,200,1400,", //2s闪两下
"200,200,200,200,200,1000," //2s闪三下
};
#if (LED_1_open == 1)
led_t *Userled1 = NULL;//定义信号灯对象句柄
#define LED1_GPIO GET_PIN(B, 0)
void LED1_switch_on(void *param) {rt_pin_write(LED1_GPIO, PIN_LOW);}
void LED1_switch_off(void *param) {rt_pin_write(LED1_GPIO, PIN_HIGH);}
#endif
#if (LED_2_open == 1)
led_t *Userled2 = NULL;//定义信号灯对象句柄
#define LED2_GPIO GET_PIN(B, 1)
void LED2_switch_on(void *param) {rt_pin_write(LED2_GPIO, PIN_LOW);}
void LED2_switch_off(void *param) {rt_pin_write(LED2_GPIO, PIN_HIGH);}
#endif
#if (LED_3_open == 1)
led_t *Userled3 = NULL;//定义信号灯对象句柄
#define LED3_GPIO GET_PIN(B, 5)
void LED3_switch_on(void *param) {rt_pin_write(LED3_GPIO, PIN_LOW);}
void LED3_switch_off(void *param) {rt_pin_write(LED3_GPIO, PIN_HIGH);}
#endif
//回调函数
void blink_over_callback(led_t *led_handler)
{
led_set_mode(led_handler, LOOP_PERMANENT, led_blink_modes[LED_All__OFF]);//长灭
led_start(led_handler);
}
static void led_run(void *parameter){
while(1){
led_ticks();
rt_thread_mdelay(LED_TICK_TIME);
}
}
int rt_led_timer_init(void)
{
#if (LED_1_open == 1)
rt_pin_mode(LED1_GPIO,PIN_MODE_OUTPUT);
rt_pin_write(LED1_GPIO, PIN_HIGH);
#endif
#if (LED_2_open == 1)
rt_pin_mode(LED2_GPIO,PIN_MODE_OUTPUT);
rt_pin_write(LED2_GPIO, PIN_HIGH);
#endif
#if (LED_3_open == 1)
rt_pin_mode(LED3_GPIO,PIN_MODE_OUTPUT);
rt_pin_write(LED3_GPIO, PIN_HIGH);
#endif
led_mem_opreation.malloc_fn = (void* (*)(size_t))rt_malloc;
led_mem_opreation.free_fn = rt_free;
led_set_mem_operation(&led_mem_opreation);
#if (LED_1_open == 1)
Userled1 = led_create(LED1_switch_on,LED1_switch_off,NULL);
led_set_mode(Userled1,LOOP_PERMANENT,(void *)led_blink_modes[LED_All__OFF]);
led_set_blink_over_callback(Userled1,blink_over_callback);
led_start(Userled1);
#endif
#if (LED_2_open == 1)
Userled2 = led_create(LED2_switch_on,LED2_switch_off,NULL);
led_set_mode(Userled2, LOOP_PERMANENT,(void *)led_blink_modes[LED_Run__1HZ]);
led_set_blink_over_callback(Userled2,blink_over_callback);
led_start(Userled2);
#endif
#if (LED_3_open == 1)
Userled3 = led_create(LED3_switch_on,LED3_switch_off,NULL);
led_set_mode(Userled3,LOOP_PERMANENT,(void *)led_blink_modes[LED_All__OFF]);
led_set_blink_over_callback(Userled3,blink_over_callback);
led_start(Userled3);
#endif
rt_thread_t tid = RT_NULL;
tid = rt_thread_create("led",
led_run,
RT_NULL,
256+128,
RT_THREAD_PRIORITY_MAX/2,
100);
if (tid != RT_NULL)
rt_thread_startup(tid);
return RT_EOK;
}
INIT_APP_EXPORT(rt_led_timer_init);
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)