打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  337 随笔 :: 0 文章 :: 2 评论 :: 71554 阅读

使用例子:

任意地点初始化:app_led_init();

app_led_indicate(灯号,灯光类型,周期时间,重装载值);

注:需要先实现对应PWM函数

文件代码如下
app_led.c

/********************************************************************************
* @file    app_led.c
* @author  jianqiang.xue
* @Version V1.0.0
* @Date    2021-04-20
* @brief   LED灯光效果
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#include "os_api.h"
#include "app_led.h"
#include "log.h"
/* Private includes ----------------------------------------------------------*/
#include "business_gpio.h"
#include "business_function.h"
#if BS_APP_LED_DRIVEN_MODE == 0
#include "bsp_pwm.h"
#elif BS_APP_LED_DRIVEN_MODE == 1
#include "bsp_led.h"
#endif
/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/
void app_led(void const *argument);

/* Private typedef -----------------------------------------------------------*/
#if BS_APP_LED_DRIVEN_MODE == 0
extern void led_pwm_init(void);
extern bool app_set_pwm_parameter(app_led_id_t led_id, uint8_t level_logic, uint16_t period_max);
extern bool app_led_ioctl(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#elif BS_APP_LED_DRIVEN_MODE == 1
extern void led_gpio_init(void);
extern bool app_led_ioctl(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#elif BS_APP_LED_DRIVEN_MODE == 2
extern void led_ws2812_init(void);
extern bool app_led_ioctl(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#endif

// 定义线程,用于接收邮件消息
os_thread_id task_led_id;
os_thread_def(app_led, OS_PRIORITY_NORMAL, 1, 136);

// 定义邮箱,用于发送灯光命令
typedef struct
{
    app_led_id_t   led_id;
    app_led_type_t type;
    uint16_t       cycle_time;
    uint16_t       period;
} led_msgqueue_t;

static os_pool_id pool_led_id = NULL;
os_pool_def(pool_led, 5, led_msgqueue_t);

static os_message_qid msg_led_id = NULL;
os_message_qdef(msg_led, 5, led_msgqueue_t);
/************************************[灯光操作]对外接口函数************************************/

bool app_led_indicate(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period)
{
    if (pool_led_id == NULL || msg_led_id == NULL)
    {
        return false;
    }
    led_msgqueue_t *pmsg = NULL;
    pmsg = os_pool_calloc(pool_led_id);
    if (pmsg)
    {
        pmsg->led_id     = led_id;
        pmsg->type       = type;
        pmsg->cycle_time = cycle_time;
        pmsg->period     = period;
        if (os_message_put(msg_led_id, (uint32_t)pmsg, 0) != OS_OK)
        {
            os_pool_free(pool_led_id, pmsg);
            return false;
        }
    }
    return true;
}

/**
  * @brief  线程任务:LED操作
  */
void app_led(void const *argument)
{
    os_event evt;
    led_msgqueue_t *pmsg = NULL;
    while (1)
    {
        evt = os_message_get(msg_led_id, OS_WAIT_FOREVER);
        if (evt.status == OS_EVENT_MESSAGE)
        {
            pmsg = evt.value.p;
            if (pmsg)
            {
                app_led_ioctl(pmsg->led_id, pmsg->type, pmsg->cycle_time, pmsg->period);
                os_pool_free(pool_led_id, pmsg);
            }
        }
    }
}

/**
  * @brief  灯光功能初始化
  */
bool app_led_init(void)
{
#if BS_APP_LED_DRIVEN_MODE == 0
    // 外设tim初始化
    bsp_pwm_init();
    // [app] 软定时器创建和参数填充
    led_pwm_init();
    // 初始化pwm
    app_set_pwm_parameter(BS_LIGHT_LAMP_CHANNEL, BS_TIM1_LEVEL_LOGIC, BS_TIM1_PERIOD);
    app_set_pwm_parameter(BS_BATTERY_LAMP_CHANNEL, BS_TIM1_LEVEL_LOGIC, BS_TIM1_PERIOD);
#elif BS_APP_LED_DRIVEN_MODE == 1
    // gpio初始化
    bsp_led_init();
    // [app] 软定时器创建和参数填充
    led_gpio_init();
#elif BS_APP_LED_DRIVEN_MODE == 2
#endif

    pool_led_id = os_pool_create(os_pool(pool_led));
    if (!pool_led_id)
        return false;
    msg_led_id = os_message_create(os_messageq(msg_led), NULL);
    if (!msg_led_id)
        return false;
    task_led_id = os_thread_create(os_thread(app_led), "led");
    if (!task_led_id)
        return false;
    return true;
}

app_led.h

/********************************************************************************
* @file    app_led.h
* @author  jianqiang.xue
* @Version V1.0.0
* @Date    2021-04-20
* @brief   LED灯光效果
********************************************************************************/

#ifndef __APP_LED_H
#define __APP_LED_H

#include <stdint.h>
#include <stdbool.h>

typedef enum
{
    LED_TYPE_OFF = 0,
    LED_TYPE_LIGHT,
    LED_TYPE_BREATH,
    LED_TYPE_BREATH_LAMP,
    LED_TYPE_TWINKLE,
    LED_TYPE_SOS,
    LED_TYPE_RISE_SLOWLY,
    LED_TYPE_FALL_SLOWLY,
    LED_TYPE_MAX,
} app_led_type_t;

typedef enum
{
    APP_LED_ID_0 = 0,
    APP_LED_ID_1,
    APP_LED_ID_2,
    APP_LED_ID_3
} app_led_id_t;

bool app_led_init(void);
uint16_t app_led_get_current_period(app_led_id_t led_id);
bool app_led_indicate(app_led_id_t led_id, app_led_type_t type, uint16_t cycle_time, uint16_t period);
#endif

posted on   xuejianqiang  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033
点击右上角即可分享
微信分享提示