本文來源電子發燒友社區,作者: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。
從原理圖看GPIO02控制雙色LED的紅色、GPIO27控制雙色LED的藍色,但實際測試是反過來的。
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("http://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 = [
"http://drivers/hdf_core/framework/include/platform/",
"http://drivers/hdf_core/framework/include/utils/",
"http://drivers/hdf_core/framework/support/platform/include/gpio",
"http://drivers/hdf_core/adapter/khdf/liteos_m/osal/include/",
"http://drivers/hdf_core/framework/include/core/",
"http://drivers/hdf_core/framework/include/osal/",
"http://device/soc/esp/esp32/components/esp_adc_cal/include/",
"http://device/soc/esp/esp32/components/driver/esp32/include/"
]
}
主要修改
1.sources中添加你要編譯的文件如“key_led.c”
2.include_dirs中添加需要依賴的文件,此處比原案例102_hdf_gpio多添加以下內容,為ADC 相關依賴。
"http://device/soc/esp/esp32/components/esp_adc_cal/include/",
"http://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
回到sdk根目錄,執行hb build
腳本進行編譯。
編譯成功如下
3.2 燒錄測試
燒錄方式參考其他是用帖子,燒錄后正常運行日志如圖
演示視頻文末,上電默認雙色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文章
125瀏覽量
1153 -
NiobeU4
+關注
關注
3文章
31瀏覽量
508
發布評論請先 登錄
相關推薦
評論