AT-Command/samples/none_os/user/led.c
2022-12-31 22:42:31 +08:00

112 lines
2.8 KiB
C

/******************************************************************************
* @brief led控制
*
* Copyright (c) 2020, <morro_luo@163.com>
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*
******************************************************************************/
#include "blink.h"
#include "module.h"
#include "public.h"
#include "led.h"
static blink_dev_t led[LED_TYPE_MAX]; /*定义led设备 ------------*/
/*
* @brief 红色LED控制(PB4)
* @return none
*/
static void red_led_ctrl(bool level)
{
if (level)
GPIOC->ODR |= 1 << 4;
else
GPIOC->ODR &= ~(1 << 4);
}
/*
* @brief 绿色LED控制(PB5)
* @return none
*/
static void green_led_ctrl(bool level)
{
if (level)
GPIOC->ODR |= 1 << 5;
else
GPIOC->ODR &= ~(1 << 5);
}
/*
* @brief 蓝色LED控制(PB6)
* @return none
*/
static void blue_led_ctrl(bool level)
{
if (level)
GPIOB->ODR |= 1 << 6;
else
GPIOB->ODR &= ~(1 << 6);
}
/*
* @brief led io初始化
* PB4 -> red; PB5 -> green; PB6-> blue;
* @return none
*/
static void led_io_init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);
gpio_conf(GPIOB, GPIO_Mode_OUT, GPIO_PuPd_NOPULL, GPIO_Pin_4);
gpio_conf(GPIOB, GPIO_Mode_OUT, GPIO_PuPd_NOPULL, GPIO_Pin_5);
gpio_conf(GPIOB, GPIO_Mode_OUT, GPIO_PuPd_NOPULL, GPIO_Pin_6);
blink_dev_create(&led[LED_TYPE_RED], red_led_ctrl);
blink_dev_create(&led[LED_TYPE_GREEN], green_led_ctrl);
blink_dev_create(&led[LED_TYPE_BLUE], blue_led_ctrl);
/*开机闪3下*/
led_ctrl(LED_TYPE_RED, LED_MODE_FAST, 3);
led_ctrl(LED_TYPE_GREEN, LED_MODE_FAST, 3);
led_ctrl(LED_TYPE_BLUE, LED_MODE_FAST, 3);
}
/*
* @brief led控制
* @param[in] type - led类型(LED_TYPE_XXX)
* @param[in] mode - 工作模式(LED_MODE_XXX)
* @param[in] reapeat - 闪烁次数,0表示无限循环
* @return none
*/
void led_ctrl(led_type type, int mode, int reapeat)
{
int ontime = 0, offtime = 0;
switch (mode) { /*根据工作模式得到led开关周期 ---------*/
case LED_MODE_OFF:
ontime = offtime = 0;
break;
case LED_MODE_ON:
ontime = 1;
offtime = 0;
break;
case LED_MODE_FAST:
ontime = 100;
offtime = 100;
break;
case LED_MODE_SLOW:
ontime = 500;
offtime = 1000;
break;
}
blink_dev_ctrl(&led[type], ontime, offtime, reapeat);
}
driver_init("led", led_io_init); /*驱动初始化*/
task_register("led", blink_dev_process, 10); /*led任务, 10ms轮询1次*/