0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【开鸿智谷NiobeU4开发板免费试用体验】新增ADC按键控制LED的demo

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-10-14 14:42 次阅读

本文来源电子发烧友社区,作者:soon顺soon, 帖子地址:https://bbs.elecfans.com/jishu_2308713_1_1.html


前言

本文主要分享如何基于开鸿智谷NiobeU4开发板实现ADC按键点亮LED的案例。因NiobeU4开发板现在release出来的版本ADC的HDF丢失需要重新适配(调用AdcOpen会fail),本案例中使用esp32原生ADC接口,做演示。

1 硬件分析

主要用到开发板以下电路,涉及到GPIO02、GPIO27和ADC1_CH0。
LED_PCB.png

从原理图看GPIO02控制双色LED的红色、GPIO27控制双色LED的蓝色,但实际测试是反过来的。
KEY_PCB.png

ADC1_CH0上有SW4和SW5两个按键,通过ADC采样值不一样来区分

2 软件开发

拷贝一份vendor/openvalley/niobeu4/demo/102_hdf_gpio重新命名如 301_key_led

2.1 修改Kconfig.liteos_m.applications文件按照如下说明添加

文件路径:vendor/openvalley/niobeu4/demo/Kconfig.liteos_m.applications
修改内容:在最后的位置添加default "301_key_led" if NIOBEU4_APPLICATION_301

config NIOBEU4_APPLICATION_NAME
    string
    depends on USE_OPENVALLEY_APPLICATION
    default "001_quick_start" if NIOBEU4_APPLICATION_001
    default "002_system_los_thread" if NIOBEU4_APPLICATION_002
    default "003_system_los_timer" if NIOBEU4_APPLICATION_003
    default "004_system_los_event" if NIOBEU4_APPLICATION_004
    default "005_system_los_mutex" if NIOBEU4_APPLICATION_005
    default "006_system_los_semp" if NIOBEU4_APPLICATION_006
    default "007_system_los_message" if NIOBEU4_APPLICATION_007
    default "101_hdf_adc" if NIOBEU4_APPLICATION_101
    default "102_hdf_gpio" if NIOBEU4_APPLICATION_102
    default "103_hdf_uart" if NIOBEU4_APPLICATION_103
    default "104_hdf_watchdog" if NIOBEU4_APPLICATION_104
    default "105_hdf_pwm" if NIOBEU4_APPLICATION_105
    default "106_hdf_i2c" if NIOBEU4_APPLICATION_106
    default "107_hdf_spi" if NIOBEU4_APPLICATION_107
    default "201_bluetooth" if NIOBEU4_APPLICATION_201
    default "202_wifi" if NIOBEU4_APPLICATION_202
    default "301_key_led" if NIOBEU4_APPLICATION_301

"301_key_led" 需要与新建的demo目录文件夹名字一致
NIOBEU4_APPLICATION_301:要与vendor/openvalley/niobeu4/demo/301_key_led/.application_config里面的名称一致

2.2 修改.application_config

文件路径:vendor/openvalley/niobeu4/demo/301_key_led/.application_config

config NIOBEU4_APPLICATION_301
    bool "301_key_led"
    select DRIVERS
    select DRIVERS_HDF 
    select DRIVERS_HDF_PLATFORM
    select DRIVERS_HDF_CONFIG_MACRO
    select DRIVERS_HDF_PLATFORM_GPIO

第一行 NIOBEU4_APPLICATION_301 保持与Kconfig.liteos_m.applications一致。
第二行"301_key_led"是之后在make menuconfig中显示的名称
之后可以添加需要自动选择的配置项,如后续有用ADC的HDF可以在最后多添加一行如下

select DRIVERS_HDF_PLATFORM_ADC

2.4 编写BUILD.gn

文件路径vendor/openvalley/niobeu4/demo/301_key_led/BUILD.gn
文件内容如下:

import("//kernel/liteos_m/liteos.gni")
assert(defined(LOSCFG_DRIVERS_HDF_CONFIG_MACRO), "Must Config LOSCFG_DRIVERS_HDF_CONFIG_MACRO in kernel/liteos_m menuconfig!") 
assert(defined(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO), "Must Config LOSCFG_DRIVERS_HDF_PLATFORM_GPIO in kernel/liteos_m menuconfig!")   
module_name = get_path_info(rebase_path("."), "name")
kernel_module(module_name){
    sources = [
        "key_led.c",
    ]
    include_dirs = [
        "//drivers/hdf_core/framework/include/platform/",
        "//drivers/hdf_core/framework/include/utils/",
        "//drivers/hdf_core/framework/support/platform/include/gpio",
        "//drivers/hdf_core/adapter/khdf/liteos_m/osal/include/",
        "//drivers/hdf_core/framework/include/core/",
        "//drivers/hdf_core/framework/include/osal/",
        "//device/soc/esp/esp32/components/esp_adc_cal/include/",
        "//device/soc/esp/esp32/components/driver/esp32/include/"
    ]
}

主要修改
1.sources中添加你要编译的文件如“key_led.c”
2.include_dirs中添加需要依赖的文件,此处比原案例102_hdf_gpio多添加以下内容,为ADC 相关依赖。

"//device/soc/esp/esp32/components/esp_adc_cal/include/",
        "//device/soc/esp/esp32/components/driver/esp32/include/"

2.5 编写主程序

将原来的gpio_example.c改名为key_led.c,或者新建一个key_led.c,内容如下

#include 
#include "gpio_types.h"
#include "gpio_if.h"
#include "cmsis_os2.h"
#include "hdf_log.h"
#include "ohos_run.h"
#include "esp_adc_cal.h"

#define SYS_DELAY_TICKS 200
#define TASK_STACK_SIZE 4096
#define TASK_PRIO 25

#define KEY_LED_OFF 0
#define KEY_LED_ON  1

//在hcs文件中对应具体的GPIO口
#define RED_LED_PIN_INDEX   0       // 红色LED
#define BLUE_LED_PIN_INDEX  1       // 蓝色LED
#define PWR_SW_PIN_INDEX    2       // VCC_3.3 电源使能

osThreadId_t g_taskID = NULL;

static void key_led_test(void)
{
    int raw;

    GpioSetDir(PWR_SW_PIN_INDEX, GPIO_DIR_OUT);     // 设置VCC_3.3电源使能
    GpioWrite(PWR_SW_PIN_INDEX, KEY_LED_ON);

    GpioSetDir(RED_LED_PIN_INDEX, GPIO_DIR_OUT);    // 红灯对应GPIO配置为输出
    GpioWrite(RED_LED_PIN_INDEX, KEY_LED_OFF);//默认红灯为关

    GpioSetDir(BLUE_LED_PIN_INDEX, GPIO_DIR_OUT); // 蓝灯对应GPIO配置为输出
    GpioWrite(BLUE_LED_PIN_INDEX, KEY_LED_OFF);//默认蓝灯为关
    
    HDF_LOGE("[key_led] GPIO initn");

    //因为niobeu4开发板ADC hdf代码需要重新适配所以先是用esp32原生接口
    adc1_config_width(ADC_WIDTH_12Bit); //设置采样精度,2^12=4096
    adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11); //设置电压采样范围

    HDF_LOGE("[key_led] ADC initn");
	
	while (1)
	{
		raw = adc1_get_raw(ADC1_CHANNEL_0); //获取ADC1通道0的原始值
		//HDF_LOGE("[key_led] raw: %dn", raw);
        if (raw < 100)
        {
            HDF_LOGE("[key_led] sw4 pressed raw: %dn", raw); 
            GpioWrite(RED_LED_PIN_INDEX, KEY_LED_ON);
            GpioWrite(BLUE_LED_PIN_INDEX, KEY_LED_OFF);

        }
        else if (raw >2000 && raw < 3000)
        {
            HDF_LOGE("[key_led] sw5 pressed raw: %dn", raw); 
            GpioWrite(RED_LED_PIN_INDEX, KEY_LED_OFF);
            GpioWrite(BLUE_LED_PIN_INDEX, KEY_LED_ON);
        }
        LOS_Msleep(SYS_DELAY_TICKS);
	}
}

static void key_led_task(void)
{
    HDF_LOGE("into key_led_task!n");
    osThreadAttr_t attr;
    attr.name = "key_led_task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = TASK_STACK_SIZE;
    attr.priority = TASK_PRIO;
    g_taskID = osThreadNew((osThreadFunc_t)key_led_test, NULL, &attr);
    if (g_taskID == NULL) {
        HDF_LOGE("Failed to create key_led_test thread!n");
    }
}

OHOS_APP_RUN(key_led_task);

使用ADC需要添加"esp_adc_cal.h"头文件,相关函数以下三个

adc1_config_width(ADC_WIDTH_12Bit); //设置采样精度,2^12=4096
    adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11); //设置电压采样范围
	adc1_get_raw(ADC1_CHANNEL_0); //获取ADC1通道0的原始值

raw值的区分是通过加log打印来确认的,sw4按下在0附近,sw5按下在2047附件,所以取了一个大概的区间值。

2.6 确认hdf.hcs中GPIO配置

文件路径:device/board/openvalley/niobeu4/liteos_m/hdf_config/hdf.hcs
需要确认是否配置如下GPIO配置

#include "device_info.hcs"
root {
    platform {
        gpio_config {
			......
            gpio_0 :: default_config {  // 双色LED(红色)
                gpio_attr = ["GPIO_NUM_2", "GPIO_FLOATING", "GPIO_DRIVE_CAP_DEFAULT"];
            }
            gpio_1 :: default_config {  // 双色LED(蓝色)
                gpio_attr = ["GPIO_NUM_27", "GPIO_FLOATING", "GPIO_DRIVE_CAP_DEFAULT"];
            }
            gpio_2 :: default_config {  // 电源使能
                gpio_attr = ["GPIO_NUM_26", "GPIO_FLOATING", "GPIO_DRIVE_CAP_DEFAULT"];
            }
			......
        }

3 编译烧录测试

3.1 编译步骤

进入//kernel/liteos_m目录, 执行指令

make menuconfig

在menuconfig配置中进入如下选项:
(Top) → Platform → Board Selection → select board niobeu4 → use openvalley niobeu4 application → niobeu4 application choose
选择301_key_led
config.png

回到sdk根目录,执行hb build脚本进行编译。
编译成功如下
build_success.png

3.2 烧录测试

烧录方式参考其他是用帖子,烧录后正常运行日志如图
run_log.png

演示视频文末,上电默认双色LED灭掉,按下SW4亮蓝灯,按下SW5亮红灯。
红灯和蓝灯的控制反过来了?
修改hdf.hcs将

gpio_0 :: default_config {  // 双色LED(红色)
                gpio_attr = ["GPIO_NUM_27", "GPIO_FLOATING", "GPIO_DRIVE_CAP_DEFAULT"];
            }
            gpio_1 :: default_config {  // 双色LED(蓝色)
                gpio_attr = ["GPIO_NUM_2", "GPIO_FLOATING", "GPIO_DRIVE_CAP_DEFAULT"];
            }

这样颜色控制就正常了,是原理图的GPIO标识错误了?还是PCB上件有问题?代码有问题?欢迎评论区留下你的看法。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开鸿智谷
    +关注

    关注

    2

    文章

    117

    浏览量

    1124
  • NiobeU4
    +关注

    关注

    3

    文章

    31

    浏览量

    494
收藏 人收藏

    评论

    相关推荐

    鸿亮相OpenHarmony开发者大会,与生态共创开源新篇章!

    5月25日,以“鸿心聚力智引未来”为主题的OpenHarmony开发者大会2024(以下简称大会)在深圳成功举办。鸿获得多项奖项及授牌
    的头像 发表于 05-26 08:30 616次阅读
    <b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>亮相OpenHarmony<b class='flag-5'>开发</b>者大会,与生态共创开源新篇章!

    鸿荣获鸿蒙原生应用开发及培训服务商牌匾授牌

    出席现场,并获颁鸿蒙原生应用开发及培训服务商称号。图/左4鸿副总裁李传钊
    的头像 发表于 05-24 08:30 667次阅读
    <b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>荣获鸿蒙原生应用<b class='flag-5'>开发</b>及培训服务商牌匾授牌

    鸿联合多家伙伴战略签约,加速鸿蒙生态发展!

    5月20日,鸿母公司拓维信息520产品与技术开放日暨28周年庆圆满举行,此次周年庆不仅是对公司创新突破、产品孵化和商业成果的回顾,更是携手合作伙伴共同展望未来、开启新篇章的重要时刻。
    的头像 发表于 05-23 08:30 696次阅读
    <b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>联合多家伙伴战略签约,加速鸿蒙生态发展!

    免费!NXP i.MX 93开发板有奖试用

    米尔与NXP合作发布的新品基于NXPi.MX93应用处理器的MYD-LMX9X开发板免费试用活动来啦~~米尔提供了2块价值678
    的头像 发表于 05-23 08:01 634次阅读
    <b class='flag-5'>免费</b>!NXP i.MX 93<b class='flag-5'>开发板</b>有奖<b class='flag-5'>试用</b>

    拓维信息及旗下鸿同获华为HarmonyOS开发服务商认证

    近日,拓维信息及旗下鸿双双通过华为HarmonyOS开发服务商认证,成为华为“鸿蒙服务商先锋计划”认证级伙伴。秉持共同发展、共创价值的合作理念,拓维信息、
    的头像 发表于 03-29 08:13 449次阅读
    拓维信息及旗下<b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>同获华为HarmonyOS<b class='flag-5'>开发</b>服务商认证

    鸿与CSDN达成战略合作,共建OpenHarmony人才计划

    2024年3月19日,鸿与中国专业开发者社区CSDN就共建OpenHarmony人才计划达成战略合作并举办发布仪式。
    的头像 发表于 03-20 08:29 356次阅读
    <b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>与CSDN达成战略合作,共建OpenHarmony人才计划

    国内首批 | 鸿多名讲师获“鸿蒙原生应用开发培训讲师”资格认证

    2023年3月4日-5日,鸿蒙生态服务(深圳)有限公司(以下简称“鸿蒙生态服务公司”)组织了国内首批“鸿蒙原生应用开发培训讲师”认证,鸿
    的头像 发表于 03-16 08:29 558次阅读
    国内首批 | <b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>多名讲师获“鸿蒙原生应用<b class='flag-5'>开发</b>培训讲师”资格认证

    鸿与数城科技达成战略合作

    12月21日,数城科技股份有限公司(以下简称数城科技)董事长杜潜一行到访湖南开鸿数字产业发展有限公司参观交流(以下简称鸿),拓维信
    的头像 发表于 12-22 08:30 1152次阅读
    <b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>与数城科技达成战略合作

    【每周一练】+盘古1K开发板+2. 按键控制RGB led

    :led_rgb<=`UD 12\'b1111_1111_1111; endcase end 3 实验效果 下载代码,实现效果见视频 4 学习总结 通过该实验,学习了按键消抖的实现原理,RGB的
    发表于 12-17 11:33

    STM32按键控制LED的亮灭

    使用一个按键控制LED的亮灭,按键按下时LED亮起,按键松开时LED熄灭。通过
    的头像 发表于 12-11 14:19 3458次阅读
    STM32<b class='flag-5'>按键控制</b><b class='flag-5'>LED</b>的亮灭

    【每周一练】盘古1K开发板 练习二:按键控制LED灯实验

    Part选项,选择开发板FPGA型号,这里选PGC1KG-6LPG100,如下图所示 图1:型号选择 2.原理图按键LED相关接口 图2:按键
    发表于 12-06 00:36

    【每周一练】盘古1K开发板 练习二:按键控制LED灯实验学习记录

    经过练习一:LED流水灯后,进行练习二:按键控制LED灯实验也就相对容易些,有demo加持完成实验很容易,主要还是学习代码编写。 参考资料: 1K2K链接:https://pan.ba
    发表于 11-28 15:31

    鸿亮相第十二届中国互联网测试开发大会

    11月25日,中国互联网测试开发大会在深圳顺利开启,大会以“软件质量保障体系和测试研发技术交流”为主要目的,旨在为行业搭建一个深入探讨和交流的桥梁和平台。鸿作为深耕OpenHar
    的头像 发表于 11-28 08:29 576次阅读
    <b class='flag-5'>开</b><b class='flag-5'>鸿</b>智<b class='flag-5'>谷</b>亮相第十二届中国互联网测试<b class='flag-5'>开发</b>大会

    【ELF 1开发板试用】+ RGB LED按键控制

    在掌握串口登录后,就可以利用板载的系统进行相应的测试了,作为上最基本外设恐怕就非LED灯和按键莫属了,它们的控制均可归为GPIO口的使用。 在GPIO的输出设备中,最常用的便是
    发表于 11-21 11:11

    参与FPGA开发者技术社区每周一练,精美开发板免费领!

    开发板套件+三合一数据线+紫光同创10周年纪念手袋+22K开发板免费试用直通资格 练习题目: 【每周一练】盘古1K开发板 练习一:
    发表于 11-20 16:26