0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

【開鴻智谷NiobeU4開發(fā)板免費試用體驗】lvgl移植及實現(xiàn)ADC按鍵狀態(tài)顯示

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-10-14 11:27 ? 次閱讀

本文來源電子發(fā)燒友社區(qū),作者:soon順soon, 帖子地址:https://bbs.elecfans.com/jishu_2308754_1_1.html


感謝發(fā)燒友李先生分享【開鴻智谷NiobeU4開發(fā)板免費試用體驗】移植LVGL本文參考成功移植,實現(xiàn)按鍵按下sw4顯示SW4 Pressed松開顯示SW4 Release,整理踩坑經(jīng)驗分享如下。

1.移植準備

1.1.lvgl源碼獲取

源碼我選擇從Gitee的littlevGL鏡像標簽頁面中下載v8.3.1 鏈接 https://gitee.com/mirrors/lvgl/tags
0.png

下載完成將會有l(wèi)vgl-v8.3.1.zip,將lvgl-v8.3.1.zip放到Ubuntu的家目錄下,使用一下指令解壓

unzip lvgl-v8.3.1.zip

1.2.新建demo目錄并拷貝相關文件

在vendor/openvalley/niobeu4/demo/下新建目錄302_lvgl,并將下載的lvgl-v8.3.1.zip解壓后拷貝到目錄下,
參考指令:

cd vendor/openvalley/niobeu4/demo/
cp -rf ~/lvgl-v8.3.1 ./302_lvgl

1.3.拷貝LCD驅(qū)動

拷貝vendor/openvalley/niobeu4/demo/107_hdf_spi下的所有文件到vendor/openvalley/niobeu4/demo/302_lvgl下,并拷貝顯示模版驅(qū)動
參考指令:

cd vendor/openvalley/niobeu4/demo/
cp -rf 107_hdf_spi/. 302_lvgl/
cp -f 302_lvgl/examples/porting/lv_port_disp_template.c 302_lvgl/lv_port_disp.c
cp -f 302_lvgl/examples/porting/lv_port_disp_template.h 302_lvgl/lv_port_disp.h

1.3.拷貝配置文件

復制vendor/openvalley/niobeu4/demo/302_lvgl/lv_conf_template.h為vendor/openvalley/niobeu4/demo/302_lvgl//lv_conf.h
參考指令:

cd vendor/openvalley/niobeu4/demo/
cp -f 302_lvgl/lv_conf_template.h 302_lvgl/lv_conf.h

完成以上目錄結(jié)構(gòu)如圖:
1.png

2.源碼修改

2.1 配置make menuconfig相關信息

在vendor/openvalley/niobeu4/demo/Kconfig.liteos_m.applications最后添加

default "302_lvgl" if NIOBEU4_APPLICATION_302

修改vendor/openvalley/niobeu4/demo/302_lvgl/.application_config如下

config NIOBEU4_APPLICATION_302
    bool "302_lvgl"
    select DRIVERS
    select DRIVERS_HDF 
    select DRIVERS_HDF_PLATFORM
    select DRIVERS_HDF_CONFIG_MACRO
    select DRIVERS_HDF_PLATFORM_SPI
    select DRIVERS_HDF_PLATFORM_GPIO

2.2 顯示相關lv_port_disp文件修改

vendor/openvalley/niobeu4/demo/302_lvgl/lv_port_disp.h中

#if 0

改為

#if 1

DEFINES下添加lv_conf.h所在路徑配置和分辨率配置

/*********************
 *      DEFINES
 *********************/
#define LV_LVGL_H_INCLUDE_SIMPLE 1
#define MY_DISP_HOR_RES 135
#define MY_DISP_VER_RES 130

vendor/openvalley/niobeu4/demo/302_lvgl/lv_port_disp.c中

#if 0
#include "lv_port_disp_template.h"

改為

#if 1
#include "lv_port_disp.h"

添加

#include "st7735.h"

修改disp_init(void)加入LcdInit();

/*Initialize your display and the required peripherals.*/
static void disp_init(void)
{
    /*You code here*/
    LcdInit();
}

修改 lv_port_disp_init(void) 注釋掉Example for 2)和 Example for 3) also set disp_drv.full_refresh = 1 below對應的代碼

void lv_port_disp_init(void)
{
    /*-------------------------
     * Initialize your display
     * -----------------------*/
    disp_init();

    /*-----------------------------
     * Create a buffer for drawing
     *----------------------------*/

    /**
     * LVGL requires a buffer where it internally draws the widgets.
     * Later this buffer will passed to your display driver's `flush_cb` to copy its content to your display.
     * The buffer has to be greater than 1 display row
     *
     * There are 3 buffering configurations:
     * 1. Create ONE buffer:
     *      LVGL will draw the display's content here and writes it to your display
     *
     * 2. Create TWO buffer:
     *      LVGL will draw the display's content to a buffer and writes it your display.
     *      You should use DMA to write the buffer's content to the display.
     *      It will enable LVGL to draw the next part of the screen to the other buffer while
     *      the data is being sent form the first buffer. It makes rendering and flushing parallel.
     *
     * 3. Double buffering
     *      Set 2 screens sized buffers and set disp_drv.full_refresh = 1.
     *      This way LVGL will always provide the whole rendered screen in `flush_cb`
     *      and you only need to change the frame buffer's address.
     */

    /* Example for 1) */
    static lv_disp_draw_buf_t draw_buf_dsc_1;
    static lv_color_t buf_1[MY_DISP_HOR_RES * 10];                          /*A buffer for 10 rows*/
    lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10);   /*Initialize the display buffer*/

    // /* Example for 2) */
    // static lv_disp_draw_buf_t draw_buf_dsc_2;
    // static lv_color_t buf_2_1[MY_DISP_HOR_RES * 10];                        /*A buffer for 10 rows*/
    // static lv_color_t buf_2_2[MY_DISP_HOR_RES * 10];                        /*An other buffer for 10 rows*/
    // lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 10);   /*Initialize the display buffer*/

    // /* Example for 3) also set disp_drv.full_refresh = 1 below*/
    // static lv_disp_draw_buf_t draw_buf_dsc_3;
    // static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*A screen sized buffer*/
    // static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES];            /*Another screen sized buffer*/
    // lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2,
    //                       MY_DISP_VER_RES * LV_VER_RES_MAX);   /*Initialize the display buffer*/

    /*-----------------------------------
     * Register the display in LVGL
     *----------------------------------*/

    static lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/
    lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/

    /*Set up the functions to access to your display*/

    /*Set the resolution of the display*/
    disp_drv.hor_res = MY_DISP_HOR_RES;
    disp_drv.ver_res = MY_DISP_VER_RES;

    /*Used to copy the buffer's content to the display*/
    disp_drv.flush_cb = disp_flush;

    /*Set a display buffer*/
    disp_drv.draw_buf = &draw_buf_dsc_1;

    /*Required for Example 3)*/
    //disp_drv.full_refresh = 1;

    /* Fill a memory array with a color if you have GPU.
     * Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
     * But if you have a different GPU you can use with this callback.*/
    //disp_drv.gpu_fill_cb = gpu_fill;

    /*Finally register the driver*/
    lv_disp_drv_register(&disp_drv);
}

修改disp_flush()函數(shù)加入lcd_draw_point();和LcdPush();

/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    if(disp_flush_enabled) {
        /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/

        int32_t x;
        int32_t y;
        for(y = area->y1; y <= area->y2; y++) {
            for(x = area->x1; x <= area->x2; x++) {
                /*Put a pixel to the display. For example:*/
                /*put_px(x, y, *color_p)*/
                lcd_draw_point(x,y,color_p->full);
                color_p++;
            }
        }
        LcdPush();
    }

    /*IMPORTANT!!!
     *Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
}

2.3 修改lv_tick_inc

此處修改方式與參考文件不同,此處修改如下
在vendor/openvalley/niobeu4/demo/302_lvgl/src/hal/lv_hal_tick.c中加入LOS_Msleep(tick_period);如下

/**
 * You have to call this function periodically
 * @param tick_period the call period of this function in milliseconds
 */
LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period)
{
    tick_irq_flag = 0;
    sys_time += tick_period;
    LOS_Msleep(tick_period);
}

2.4 修改 lv_conf.h

在vendor/openvalley/niobeu4/demo/302_lvgl/lv_conf.h中

#if 0

改為

#if 1

另外因為以下編譯error
lv_win_class.png

暫時將

#define LV_USE_WIN        1

改為

#define LV_USE_WIN        0

2.5 編寫測代碼lvgl_example.c

可以將spi_example.c改成lvgl_example.c,也可直接新建一個lvgl_example.c文件,
lvgl_example.c內(nèi)容如下

#include 
#include 
#include "stdint.h"
#include "los_task.h"
#include "ohos_run.h"
#include "lv_port_disp.h"
#include "lvgl.h"
#include "demos/lv_demos.h"
#include "esp_adc_cal.h"
#include "gpio_if.h"

#define PWR_SW_PIN_INDEX    2


void lv_tick_handle(UINT32 arg)
{
    printf("%s start tickrn", __FUNCTION__);
    while(1)
    {
        lv_tick_inc(50);
        lv_timer_handler();
    }
}

void lvgl_btn_test(void)
{
    int raw;
    UINT32 g_lv_time_task;
    TSK_INIT_PARAM_S task = { 0 };
    task.pfnTaskEntry = (TSK_ENTRY_FUNC)lv_tick_handle;
    task.pcName = "lv_time_task";
    task.uwStackSize = 0x1000;
    task.usTaskPrio = 25 - 1;

    GpioSetDir(PWR_SW_PIN_INDEX, GPIO_DIR_OUT);
    GpioWrite(PWR_SW_PIN_INDEX, 1);

    adc1_config_width(ADC_WIDTH_12Bit); 
    adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11); 

    printf("[key_led] ADC initn");

    lv_init();
    lv_port_disp_init();
    //lv_log_register_print_cb(lv_log_print);
    LOS_TaskCreate(&g_lv_time_task, &task);

    lv_obj_t * btn_sw4 = lv_btn_create(lv_scr_act());     /*Add a button the current screen*/
    lv_obj_set_pos(btn_sw4, 10, 10);                            /*Set its position*/
    lv_obj_set_size(btn_sw4, 110, 25);                          /*Set its size*/

    lv_obj_t * label_sw4 = lv_label_create(btn_sw4);          /*Add a label to the button*/
    lv_obj_center(label_sw4);


    lv_obj_t * btn_sw5 = lv_btn_create(lv_scr_act());     /*Add a button the current screen*/
    lv_obj_set_pos(btn_sw5, 10, 60);                            /*Set its position*/
    lv_obj_set_size(btn_sw5, 110, 25);                          /*Set its size*/

    lv_obj_t * label_sw5 = lv_label_create(btn_sw5);          /*Add a label to the button*/
    lv_obj_center(label_sw5);

    while(1)
    {
        LOS_Msleep(200);
        lv_task_handler();
        raw = adc1_get_raw(ADC1_CHANNEL_0); 
        //printf("[key_led] raw: %dn", raw);
        if (raw < 100)
        {
            printf("[key_led] sw4 pressed raw: %dn", raw); 
            lv_label_set_text(label_sw4, "SW4 Pressed");                     /*Set the labels text*/

        }
        else if (raw >2000 && raw < 3000)
        {
            printf("[key_led] sw5 pressed raw: %dn", raw); 
            lv_label_set_text(label_sw5, "SW5 Pressed");                     /*Set the labels text*/

        } 
        else {
            lv_label_set_text(label_sw4, "SW4 Release");                     /*Set the labels text*/
            lv_label_set_text(label_sw5, "SW5 Release");                     /*Set the labels text*/
        }
    }
}
OHOS_APP_RUN(lvgl_btn_test);

2.6 編寫B(tài)UILD.gn

vendor/openvalley/niobeu4/demo/302_lvgl/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_SPI), "Must Config LOSCFG_DRIVERS_HDF_PLATFORM_SPI in kernel/liteos_m menuconfig!")
module_name = get_path_info(rebase_path("."), "name")
kernel_module(module_name){
    sources = [
        "lvgl_example.c",
        "st7735s.c",
        "lv_port_disp.c",
        "src/core/lv_disp.c",
        "src/core/lv_event.c",
        "src/core/lv_group.c",
        "src/core/lv_indev_scroll.c",
        "src/core/lv_indev.c",
        "src/core/lv_obj_class.c",
        "src/core/lv_obj_draw.c",
        "src/core/lv_obj_pos.c",
        "src/core/lv_obj_scroll.c",
        "src/core/lv_obj_style_gen.c",
        "src/core/lv_obj_style.c",
        "src/core/lv_obj_tree.c",
        "src/core/lv_obj.c",
        "src/core/lv_refr.c",
        "src/core/lv_theme.c",
        "src/draw/sw/lv_draw_sw_arc.c",
        "src/draw/sw/lv_draw_sw_blend.c", 
        "src/draw/sw/lv_draw_sw_dither.c",   
        "src/draw/sw/lv_draw_sw_gradient.c",
        "src/draw/sw/lv_draw_sw_img.c",
        "src/draw/sw/lv_draw_sw_layer.c",
        "src/draw/sw/lv_draw_sw_letter.c",
        "src/draw/sw/lv_draw_sw_line.c",
        "src/draw/sw/lv_draw_sw_polygon.c",
        "src/draw/sw/lv_draw_sw_rect.c",
        "src/draw/sw/lv_draw_sw_transform.c",
        "src/draw/sw/lv_draw_sw.c",
        "src/draw/lv_draw_arc.c",
        "src/draw/lv_draw_img.c",   
        "src/draw/lv_draw_label.c",  
        "src/draw/lv_draw_layer.c",
        "src/draw/lv_draw_line.c",
        "src/draw/lv_draw_mask.c",
        "src/draw/lv_draw_rect.c",
        "src/draw/lv_draw_transform.c",
        "src/draw/lv_draw_triangle.c",
        "src/draw/lv_draw.c",
        "src/draw/lv_img_buf.c",
        "src/draw/lv_img_cache.c",
        "src/draw/lv_img_decoder.c",
        "src/font/lv_font_fmt_txt.c",
        "src/font/lv_font.c",
        "src/font/lv_font_montserrat_12.c",
        "src/font/lv_font_montserrat_14.c",
        "src/font/lv_font_montserrat_16.c",
        "src/hal/lv_hal_disp.c",
        "src/hal/lv_hal_indev.c",
        "src/hal/lv_hal_tick.c",
        "src/misc/lv_anim_timeline.c",
        "src/misc/lv_anim.c",
        "src/misc/lv_area.c",
        "src/misc/lv_async.c",
        "src/misc/lv_bidi.c",
        "src/misc/lv_color.c",
        "src/misc/lv_fs.c",
        "src/misc/lv_gc.c",
        "src/misc/lv_ll.c",
        "src/misc/lv_log.c",
        "src/misc/lv_lru.c",
        "src/misc/lv_math.c",
        "src/misc/lv_mem.c",
        "src/misc/lv_printf.c",
        "src/misc/lv_style_gen.c",
        "src/misc/lv_style.c",
        "src/misc/lv_templ.c",
        "src/misc/lv_timer.c",
        "src/misc/lv_tlsf.c",
        "src/misc/lv_txt_ap.c",
        "src/misc/lv_txt.c",
        "src/misc/lv_utils.c",
        "src/widgets/lv_arc.c",
        "src/widgets/lv_bar.c",
        "src/widgets/lv_btn.c",
        "src/widgets/lv_btnmatrix.c",
        "src/widgets/lv_canvas.c",
        "src/widgets/lv_checkbox.c",
        "src/widgets/lv_dropdown.c",
        "src/widgets/lv_img.c",
        "src/widgets/lv_label.c",
        "src/widgets/lv_line.c",
        "src/widgets/lv_objx_templ.c",
        "src/widgets/lv_roller.c",
        "src/widgets/lv_slider.c",  
        "src/widgets/lv_switch.c",           
        "src/widgets/lv_table.c", 
        "src/widgets/lv_textarea.c",
        "src/extra/themes/basic/lv_theme_basic.c",
        "src/extra/themes/default/lv_theme_default.c",
        "src/extra/themes/mono/lv_theme_mono.c",
        "src/extra/widgets/animimg/lv_animimg.c",
        "src/extra/widgets/calendar/lv_calendar_header_arrow.c",
        "src/extra/widgets/calendar/lv_calendar_header_dropdown.c",
        "src/extra/widgets/calendar/lv_calendar.c",
        "src/extra/widgets/chart/lv_chart.c",
        "src/extra/widgets/colorwheel/lv_colorwheel.c",
        "src/extra/widgets/imgbtn/lv_imgbtn.c",
        "src/extra/widgets/keyboard/lv_keyboard.c",
        "src/extra/widgets/led/lv_led.c",
        "src/extra/widgets/list/lv_list.c",
        "src/extra/widgets/menu/lv_menu.c",
        "src/extra/widgets/meter/lv_meter.c",
        "src/extra/widgets/msgbox/lv_msgbox.c",
        "src/extra/widgets/span/lv_span.c",
        "src/extra/widgets/spinbox/lv_spinbox.c",
        "src/extra/widgets/spinner/lv_spinner.c",
        "src/extra/widgets/tabview/lv_tabview.c",
        "src/extra/widgets/tileview/lv_tileview.c",
        "src/extra/widgets/win/lv_win.c",
        "src/extra/layouts/flex/lv_flex.c",
        "src/extra/layouts/grid/lv_grid.c",
        "src/extra/lv_extra.c",
        "src/extra/libs/png/lodepng.c",
        "src/extra/libs/png/lv_png.c",
        "demos/stress/lv_demo_stress.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/adc",
        "http://drivers/hdf_core/framework/support/platform/include/spi",
        "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/",
        "/src",
        "."
    ]
}

3 編譯測試

3.1 編譯

進入//kernel/liteos_m目錄, 執(zhí)行指令

make menuconfig

在menuconfig配置中進入如下選項:
(Top) → Platform → Board Selection → select board niobeu4 → use openvalley niobeu4 application → niobeu4 application choose
選擇302_lvgl
2.png

回到sdk根目錄,執(zhí)行hb build -f腳本進行編譯。
編譯成功如下

3.2 測試

正常開機后顯示
release.jpg

按下SW4按鍵
SW4_Pressed.jpg

按下SW5按鍵
SW5_Pressed.jpg

演示視頻見附件,移植后主要代碼如附件302_lvgl.tgz

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 開鴻智谷
    +關注

    關注

    2

    文章

    116

    瀏覽量

    1112
  • NiobeU4
    +關注

    關注

    3

    文章

    31

    瀏覽量

    492
收藏 人收藏

    評論

    相關推薦

    點擊參與米爾NXP i.MX 93開發(fā)板有獎試用

    米爾與NXP合作發(fā)布的新品基于NXPi.MX93應用處理器的MYD-LMX9X開發(fā)板免費試用活動來啦~~米爾提供了3塊價值678元的MYD-LMX9X開發(fā)板發(fā)起
    的頭像 發(fā)表于 06-13 08:02 ?390次閱讀
    點擊參與米爾NXP i.MX 93<b class='flag-5'>開發(fā)板</b>有獎<b class='flag-5'>試用</b>

    與OpenHarmony的創(chuàng)新對話

    OpenHarmony4.1Release版本根技術特性解讀為契機,聚集廣大開發(fā)者、生態(tài)伙伴、行業(yè)領袖與百位技術專家共同討論技術話題。作為互聯(lián)互通核心成員,不僅在現(xiàn)場榮獲多項獎
    的頭像 發(fā)表于 05-29 08:30 ?392次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>與OpenHarmony的創(chuàng)新對話

    亮相OpenHarmony開發(fā)者大會,與生態(tài)共創(chuàng)開源新篇章!

    5月25日,以“心聚力智引未來”為主題的OpenHarmony開發(fā)者大會2024(以下簡稱大會)在深圳成功舉辦。獲得多項獎項及授牌
    的頭像 發(fā)表于 05-26 08:30 ?585次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>亮相OpenHarmony<b class='flag-5'>開發(fā)</b>者大會,與生態(tài)共創(chuàng)開源新篇章!

    榮獲鴻蒙原生應用開發(fā)及培訓服務商牌匾授牌

    出席現(xiàn)場,并獲頒鴻蒙原生應用開發(fā)及培訓服務商稱號。圖/左4副總裁李傳釗
    的頭像 發(fā)表于 05-24 08:30 ?639次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>榮獲鴻蒙原生應用<b class='flag-5'>開發(fā)</b>及培訓服務商牌匾授牌

    聯(lián)合多家伙伴戰(zhàn)略簽約,加速鴻蒙生態(tài)發(fā)展!

    5月20日,母公司拓維信息520產(chǎn)品與技術開放日暨28周年慶圓滿舉行,此次周年慶不僅是對公司創(chuàng)新突破、產(chǎn)品孵化和商業(yè)成果的回顧,更是攜手合作伙伴共同展望未來、開啟新篇章的重要時刻。
    的頭像 發(fā)表于 05-23 08:30 ?659次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>聯(lián)合多家伙伴戰(zhàn)略簽約,加速鴻蒙生態(tài)發(fā)展!

    免費!NXP i.MX 93開發(fā)板有獎試用

    米爾與NXP合作發(fā)布的新品基于NXPi.MX93應用處理器的MYD-LMX9X開發(fā)板免費試用活動來啦~~米爾提供了2塊價值678
    的頭像 發(fā)表于 05-23 08:01 ?603次閱讀
    <b class='flag-5'>免費</b>!NXP i.MX 93<b class='flag-5'>開發(fā)板</b>有獎<b class='flag-5'>試用</b>

    受邀出席2023年度南山區(qū)經(jīng)濟突出貢獻企業(yè)TOP峰會

    4月19日,2023年度南山區(qū)經(jīng)濟突出貢獻今業(yè)TOP峰會順利召開,(深圳子公司)作為南山鴻蒙產(chǎn)業(yè)生態(tài)的核心企業(yè),OpenHarmony項目群A類捐贈人、鴻蒙生態(tài)服務公司首批入駐
    的頭像 發(fā)表于 04-20 08:29 ?348次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>受邀出席2023年度南山區(qū)經(jīng)濟突出貢獻企業(yè)TOP峰會

    拓維信息及旗下同獲華為HarmonyOS開發(fā)服務商認證

    近日,拓維信息及旗下雙雙通過華為HarmonyOS開發(fā)服務商認證,成為華為“鴻蒙服務商先鋒計劃”認證級伙伴。秉持共同發(fā)展、共創(chuàng)價值的合作理念,拓維信息、
    的頭像 發(fā)表于 03-29 08:13 ?420次閱讀
    拓維信息及旗下<b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>同獲華為HarmonyOS<b class='flag-5'>開發(fā)</b>服務商認證

    與CSDN達成戰(zhàn)略合作,共建OpenHarmony人才計劃

    2024年3月19日,與中國專業(yè)開發(fā)者社區(qū)CSDN就共建OpenHarmony人才計劃達成戰(zhàn)略合作并舉辦發(fā)布儀式。
    的頭像 發(fā)表于 03-20 08:29 ?337次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>與CSDN達成戰(zhàn)略合作,共建OpenHarmony人才計劃

    榮獲全國首批HarmonyOS認證級華為授權培訓伙伴

    獲評全國首批HarmonyOS認證級華為授權培訓伙伴,人才培養(yǎng)總監(jiān)鄧娟現(xiàn)場領取
    的頭像 發(fā)表于 03-19 08:29 ?802次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>榮獲全國首批HarmonyOS認證級華為授權培訓伙伴

    國內(nèi)首批 | 多名講師獲“鴻蒙原生應用開發(fā)培訓講師”資格認證

    2023年3月4日-5日,鴻蒙生態(tài)服務(深圳)有限公司(以下簡稱“鴻蒙生態(tài)服務公司”)組織了國內(nèi)首批“鴻蒙原生應用開發(fā)培訓講師”認證,
    的頭像 發(fā)表于 03-16 08:29 ?521次閱讀
    國內(nèi)首批 | <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>多名講師獲“鴻蒙原生應用<b class='flag-5'>開發(fā)</b>培訓講師”資格認證

    與數(shù)城科技達成戰(zhàn)略合作

    12月21日,數(shù)城科技股份有限公司(以下簡稱數(shù)城科技)董事長杜潛一行到訪湖南開數(shù)字產(chǎn)業(yè)發(fā)展有限公司參觀交流(以下簡稱),拓維信
    的頭像 發(fā)表于 12-22 08:30 ?1082次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>與數(shù)城科技達成戰(zhàn)略合作

    與鴻蒙生態(tài)服務公司簽署合作協(xié)議

    近期,與深圳鴻蒙生態(tài)服務有限公司(以下簡稱“鴻蒙生態(tài)服務公司”)針對合作展開交流洽談,并共同舉辦合作協(xié)議簽署儀式。拓維信息副總裁、
    的頭像 發(fā)表于 12-21 08:30 ?1517次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>與鴻蒙生態(tài)服務公司簽署合作協(xié)議

    亮相第十二屆中國互聯(lián)網(wǎng)測試開發(fā)大會

    11月25日,中國互聯(lián)網(wǎng)測試開發(fā)大會在深圳順利開啟,大會以“軟件質(zhì)量保障體系和測試研發(fā)技術交流”為主要目的,旨在為行業(yè)搭建一個深入探討和交流的橋梁和平臺。作為深耕OpenHar
    的頭像 發(fā)表于 11-28 08:29 ?558次閱讀
    <b class='flag-5'>開</b><b class='flag-5'>鴻</b>智<b class='flag-5'>谷</b>亮相第十二屆中國互聯(lián)網(wǎng)測試<b class='flag-5'>開發(fā)</b>大會

    LVGL案例分享--手把手教你移植到T113-i國產(chǎn)工業(yè)開發(fā)板

    龍科技的T113-i的開發(fā)板上。 LVGL LVGL,全名“Littlev Graphics Library”,是一個開源的圖形庫,主要用于在嵌入式系統(tǒng)上創(chuàng)建圖形用戶界面(GUI)。它是用C語言編寫
    發(fā)表于 11-17 09:55