以下给定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);

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐