描述
本文来源电子发烧友社区,作者:hehung, 帖子地址:
https://bbs.elecfans.com/jishu_2021276_1_1.html`尝试了开发板的RGB功能。RGB其实就是三个端口进行控制的,分别为10,11,和12.原理图如下:我使用按键按下分别控制三个LED亮灭,程序实现上比较简单,如果扩展功能的话可以通过PWM控制这三个引脚实现亮度调节。代码如下:
-
/*this is my first application*/
-
/*2020/11/08*/
-
-
#include
-
#include "ohos_init.h"
-
#include "ohos_types.h"
-
#include
-
-
#include
-
-
#include "ohos_init.h"
-
#include "cmsis_os2.h"
-
#include "wifiiot_gpio.h"
-
#include "wifiiot_gpio_ex.h"
-
#include "wifiiot_adc.h"
-
-
#include
-
#include
-
#include
-
#include
-
-
#include
-
-
-
-
#define LED_INTERVAL_TIME_US 500000 /*500ms*/
-
#define LED_TASK_STACK_SIZE 512
-
#define LED_TASK_PRIO 25
-
-
#define KEY_INTERVAL_TIME_US 10000 /*10ms*/
-
#define KEY_TASK_STACK_SIZE 1024
-
#define KEY_TASK_PRIO 24
-
-
#define RGB_INTERVAL_TIME_US 10000 /*10ms*/
-
#define RGB_TASK_STACK_SIZE 1024
-
#define RGB_TASK_PRIO 23
-
-
static void *LedTask(const char *arg);
-
static void *KeyTask(const char *arg);
-
static void *RGBTask(const char *arg);
-
-
/*LED Control*/
-
enum LedState {
-
LED_ON = 0,
-
LED_OFF,
-
LED_SPARK,
-
};
-
-
uint8_t RGB_ctrl = 0;
-
-
-
static void *LedTask(const char *arg)
-
{
-
(void)arg;
-
enum LedState g_ledState = LED_SPARK;
-
g_ledState = LED_SPARK;
-
-
while (1) {
-
switch (g_ledState) {
-
case LED_ON:
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
-
usleep(LED_INTERVAL_TIME_US);
-
break;
-
case LED_OFF:
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
-
usleep(LED_INTERVAL_TIME_US);
-
break;
-
case LED_SPARK:
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
-
usleep(LED_INTERVAL_TIME_US);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
-
usleep(LED_INTERVAL_TIME_US);
-
break;
-
default:
-
usleep(LED_INTERVAL_TIME_US);
-
break;
-
}
-
}
-
-
return NULL;
-
}
-
-
static void Led0Entry(void)
-
{
-
osThreadAttr_t attr;
-
-
GpioInit();
-
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
-
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
-
-
attr.name = "LedTask";
-
attr.attr_bits = 0U;
-
attr.cb_mem = NULL;
-
attr.cb_size = 0U;
-
attr.stack_mem = NULL;
-
attr.stack_size = LED_TASK_STACK_SIZE;
-
attr.priority = LED_TASK_PRIO;
-
-
if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
-
printf("[Led0Task] Falied to create LedTask!
-
");
-
}
-
}
-
SYS_RUN(Led0Entry);
-
-
/*OLED board KEY Control - vased on ADC input*/
-
static void *KeyTask(const char *arg)
-
{
-
(void)arg;
-
-
WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
-
WifiIotGpioValue Last_key_Status = WIFI_IOT_GPIO_VALUE1;
-
// hi_u16 Key_adc_value = 0u;
-
// hi_u32 ret = 0;
-
-
while (1) {
-
GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
-
// printf("%d
-
", Key_Status);
-
-
if((Key_Status == WIFI_IOT_GPIO_VALUE0) && (Last_key_Status != Key_Status))
-
{
-
RGB_ctrl ++;
-
printf("Key pressed, RGB_ctrl = %d
-
", RGB_ctrl);
-
}
-
else
-
{
-
-
}
-
-
// ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &Key_adc_value,
-
// HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);
-
// if (ret != HI_ERR_SUCCESS) {
-
// printf("ADC Read Fail
-
");
-
// }
-
// else
-
// {
-
// // printf("ADC value = %d", Key_adc_value);
-
// }
-
// /*User 按键ADC值读出来大概为116*/
-
// /*S1 按键ADC读出来大概为320*/
-
// /*S2 按键ADC读出来大概为548*/
-
// if(Key_adc_value <= 200)
-
// {
-
// printf("User key pressed
-
");
-
// }
-
// else if(Key_adc_value <= 400)
-
// {
-
// printf("User S1 pressed
-
");
-
// }
-
// else if(Key_adc_value <= 600)
-
// {
-
// printf("User S2 pressed
-
");
-
// }
-
// else
-
// {
-
-
// }
-
-
Last_key_Status = Key_Status;
-
usleep(KEY_INTERVAL_TIME_US);
-
}
-
-
return NULL;
-
}
-
-
static void KeyEntry(void)
-
{
-
osThreadAttr_t attr;
-
-
GpioInit();
-
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
-
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
-
// AdcRead();
-
-
attr.name = "KeyTask";
-
attr.attr_bits = 0U;
-
attr.cb_mem = NULL;
-
attr.cb_size = 0U;
-
attr.stack_mem = NULL;
-
attr.stack_size = KEY_TASK_STACK_SIZE;
-
attr.priority = KEY_TASK_PRIO;
-
-
if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
-
printf("[KeyTask] Falied to create KeyTask!
-
");
-
}
-
}
-
SYS_RUN(KeyEntry);
-
-
-
static void *RGBTask(const char *arg)
-
{
-
(void)arg;
-
-
while (1) {
-
// GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
-
switch(RGB_ctrl)
-
{
-
case 0:
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
-
usleep(RGB_INTERVAL_TIME_US);
-
break;
-
case 1:
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
-
usleep(RGB_INTERVAL_TIME_US);
-
break;
-
case 2:
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
-
usleep(RGB_INTERVAL_TIME_US);
-
break;
-
case 3:
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
-
usleep(RGB_INTERVAL_TIME_US);
-
break;
-
case 4:
-
RGB_ctrl = 0;
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
-
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
-
usleep(RGB_INTERVAL_TIME_US);
-
break;
-
}
-
-
}
-
-
return NULL;
-
}
-
-
static void RGBEntry(void)
-
{
-
osThreadAttr_t attr;
-
-
GpioInit();
-
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
-
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_OUT);
-
-
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
-
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_OUT);
-
-
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
-
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);
-
// AdcRead();
-
-
attr.name = "RGBTask";
-
attr.attr_bits = 0U;
-
attr.cb_mem = NULL;
-
attr.cb_size = 0U;
-
attr.stack_mem = NULL;
-
attr.stack_size = RGB_TASK_STACK_SIZE;
-
attr.priority = RGB_TASK_PRIO;
-
-
if (osThreadNew((osThreadFunc_t)RGBTask, NULL, &attr) == NULL) {
-
printf("[KeyTask] Falied to create KeyTask!
-
");
-
}
-
}
-
SYS_RUN(RGBEntry);
-
复制代码
运行效果:`
打开APP阅读更多精彩内容