<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      前言

      念春時已夏,戀冬雪已融。
      總是感嘆時光匆匆,便努力在在平凡中掙扎,在平庸中努力,在平淡中積累。奈何時代飛速發(fā)展,時間又被工作占用,外加生活中的誘惑又太多了,很多想學(xué)、想做、想超越的事,都被拋之一旁,漸漸的跟不上時代了,當(dāng)年對興趣愛好的激情,也下降了好多。
      上一篇博客還是幾年前的,雖然中間進(jìn)步不少,但是卻少了許多當(dāng)年寫博客時的激情飛揚(yáng),真是感慨諸多。
      按公司要求,以后需要每周交一篇知識分享文檔,索性就繼續(xù)寫一下博客,算是總結(jié),也算是對自己的積累。
      由于文檔允許在大框架內(nèi)自由發(fā)揮,所以決定在我的興趣點(diǎn)上找一些還說的過去的東西寫一寫,而不是單純的復(fù)制一些網(wǎng)上隨便就能找到的東西。
      以后會努力在機(jī)械電機(jī)、三維重建、圖像視覺、深度學(xué)習(xí)等興趣范圍內(nèi)做一些比較綜合的整理,而不是僅限于嵌入式的方向。當(dāng)然,他們的實(shí)現(xiàn)都離不開底層,所以肯定是包含嵌入式方向的。

      一:說明

      BL808芯片是三核異構(gòu)的RISC-V CPU,參數(shù)如下:
      三核異構(gòu)RISC-V CPUs:

      • RV64GCV 480MHz
      • RV32GCP 320MHz
      • RV32EMC 160MHz

      AI NN 通用硬件加速器 —— BLAI-100 用于視頻/音頻檢測/識別
      內(nèi)置 768KB SRAM + 64MB UHS PSRAM

      編解碼:

      • MJPEG and H264(Baseline/Main)
      • 1920x1080@30fps + 640x480@30fps
        接口:
      • 攝像頭接口 :DVP 和 MIPI-CSI
      • 顯示接口:SPI、DBI、DPI(RGB)
        無線:
      • 支持 Wi-Fi 802.11 b/g/n
      • 支持 Bluetooth 5.x Dual-mode(BT+BLE)
      • 支持 Wi-Fi / 藍(lán)牙 共存
        USB 2.0 HS OTG (引出到 USB Type-C 接口)
        具體參數(shù)可以查看Sipeed科技的 M1s DOCK 開發(fā)板 說明頁。
        可以看到,這款芯片的能力還是很強(qiáng)的,完全可以媲美之前非常火的入門級Linux芯片 F1C100S,另外,它支持FreeRTOS,所以可以當(dāng)做裸機(jī)進(jìn)行開發(fā),代替單片機(jī)。但是可能由于是新出的產(chǎn)品,或是由于其他原因,目前這款產(chǎn)品只有Sipeed科技生產(chǎn)的模組,沒有純芯片售賣。目前體驗(yàn)設(shè)備便是Sipeed科技推出的全功能測試開發(fā)板:【Sipeed M1s DOCK 開發(fā)板

      開始使用體驗(yàn)

      1:環(huán)境搭建

      • --Linux開發(fā)環(huán)境搭建
        參考Sipeed科技的【上手使用】教程的1-4大節(jié),搭建linux使用環(huán)境后,使用模擬U盤的方式將bin文件拖拽進(jìn)去即可體驗(yàn)。如果有問題,請自行查找解決辦法。
        這里我使用VMware軟件運(yùn)行ubuntu16.04環(huán)境進(jìn)行測試。支持快速內(nèi)外復(fù)制等功能。如果是別的虛擬機(jī)環(huán)境,自行判斷是否支持。
        由于購買時間較早,所以需要根據(jù)教程的 3.2【串口燒錄】 來更新板載BL702固件來實(shí)現(xiàn)穩(wěn)定的下載,在使用圖形化界面燒錄最新的固件,來實(shí)現(xiàn) 3.1【U盤燒錄】。后面編譯生成的bin文件都可以通過U盤燒錄來快速更新。
        目前主要測試程序都是基于三個核心中的C906核心的。
      • --SDK下載和編譯測試
        參考【上手使用】教程的第5大節(jié),下載SDK并配置好編譯工具鏈,然后就可以編譯并下載程序測試。
        可以跟著操作一遍【lvge_demo】的編譯和下載操作,熟悉整個流程。
        新手小提示
        • 1:程序需要兩個文件夾,一個是 M1s_BL808_SDK ,另一個是 M1s_BL808_example ,可以用 VSCode 打開這兩個文件夾所在的文件夾,就可以使用 【Ctrl + 單擊】需要了解的函數(shù)就能進(jìn)行快速追蹤跳轉(zhuǎn)了。如果只打開例子文件夾是不會跳轉(zhuǎn)的,或是文本會包含所在文本的文件夾地址。
        • 2:修改【lvgl_demo】的示例內(nèi)容方法如下:在配置頭文件 M1s_BL808_SDK/compnets/lvgl/lvgl/lv_conf.h 中,LV_BUILD_EXAMPLES 配置部分進(jìn)行示例切換,默認(rèn)是 LV_USE_DEMO_BENCHMARK 例子。將想要的例子后面的0切換為1,其他的切換為0,然后在 M1s_BL808_example/c906_app/lvgl_demo/main.c 的主文件中將之前的 lv_demo_benchmark() 函數(shù)屏蔽,更換為開啟的demo的函數(shù),比如music例子是 M1s_BL808_SDK/compnets/lvgl/lvgl/demos/lv_demo_music.h中的lv_demo_music()函數(shù),其他幾個例子類似,都在M1s_BL808_SDK/compnets/lvgl/lvgl/demos文件夾下對應(yīng)的文件夾內(nèi)。
        • 3:編譯其他幾個例子需要開啟對應(yīng)的字體(具體開啟那些字體,可以按照報(bào)錯提示來),字體開關(guān)在配置頭文件 M1s_BL808_SDK/compnets/lvgl/lvgl/lv_conf.h 中,快速搜索LV_FONT_MONTSERRAT_ 即可跳轉(zhuǎn)到,后面的數(shù)字是你需要開啟的字體包。
        • 4:export BL_SDK_PATH 這一步每次重開都要重新來一次,否則會找不到編譯鏈。有長效修改的方法,可自行搜索嘗試。

      2:LVGL體驗(yàn)

      • LVGL是由來自匈牙利首都布達(dá)佩斯的 Gábor Kiss-Vámosi最早于2016年編寫并開源的一款可運(yùn)行于低資源的MCU設(shè)備上的開源嵌入式GUI庫(輕量級通用型圖形庫)。
      • 其GitHub地址為:【LVGL Git
      • LVGL當(dāng)時叫 LittlevGL而不是LVGL,后來作者統(tǒng)一修改為 LVGL 甚至連倉庫地址都改了。目前最新版本已經(jīng)發(fā)展到了 v9.0.0 版本,在6.0版本時,我還體驗(yàn)過移植和簡單使用。當(dāng)時還沒有拖拽式GUI設(shè)計(jì)軟件,所有界面都要手寫。如今,LVGL已經(jīng)有了如SquareLine Studio、GUI-Guider等GUI設(shè)計(jì)軟件,可以直接PC上進(jìn)行界面設(shè)計(jì)和仿真運(yùn)行,得到【所見即所得】的方便效果。而且隨著LVGL的發(fā)展壯大,其中文教程資源等都有了極大的發(fā)展,比如【百問網(wǎng)】就有包含文檔和視頻教程在內(nèi)的豐富的教程資源,而且以前【正點(diǎn)原子】就有編寫過專門的LVGL教程。
      • 現(xiàn)在,首先下載和體驗(yàn)【SquareLine Studio】軟件。
        SquareLine Studio是LVGL官方提供的GUI設(shè)計(jì)軟件,可以在LVGL官網(wǎng)直接點(diǎn)擊到下載頁面。目前最新版本是V1.2.1。按照官網(wǎng)的說明,它只有30天的全功能體驗(yàn)時間。
        按照教程下載安裝后(具體安裝步驟可以參考其他網(wǎng)友的教程,很多的),即可新建一個工程進(jìn)行GUI設(shè)計(jì)了。
        在新建界面,可以看到,SquareLine Studio支持的LVGL版本只有8.3.3和8.3.4兩個版本:

      【M1s DOCK】開發(fā)板的屏幕是 1.69 寸 240x280 電容觸摸屏,所以我們需要在新建界面將Resolution設(shè)置為 (280,240) ,Color depth 要設(shè)置為 (16 bit swap)模式 。設(shè)置好名字和要保存的地址后就可以點(diǎn)擊 CREATE 新建工程了。其實(shí)也可以點(diǎn)擊上方的 Example 來查看官方提供的幾個比較豐富的demo示例,跑起來很絢麗。不過由于開發(fā)板官方提供的LVGL例程所使用的的版本是8.2的,而SquareLine Studio只能選擇兩個更高的版本,所以下載demo后,程序并不能正常運(yùn)行。以后有時間再移植成最新的版本再測試吧。
      GUI設(shè)計(jì)界面如圖:
      (具體含義和操作可以自行搜索教程使用,也可以自己摸索)
      我們可以點(diǎn)擊一個【Button】到界面。

      然后點(diǎn)擊左上角的【Export】,選擇【Export UI Files】生成代碼到指定文件夾。
      生成成功后,可以看到指定文件夾下有幾個生成的文件:

      將這幾個文件復(fù)制到linux環(huán)境中的 M1s_BL808_example/c906_app/lvgl_demo/ 文件夾下(此文件夾下除了原本的 bouffalo.mk 和 main.c,其他的都可以刪掉)。
      我用的是VMware虛擬機(jī),所以支持win與ubuntu環(huán)境的快速復(fù)制。如果是別的虛擬機(jī)環(huán)境,自行處理文件復(fù)制問題。
      將 ui.h 文件中的 #include "lvgl/lvgl.h" 改為 #include "lvgl.h",不然會報(bào)錯,據(jù)說這個是 SquareLine Studio 的BUG。
      將 main.c中的 demo測試相關(guān)的代碼替換為ui.h中的ui_init()函數(shù)。
      編譯通過后,將開發(fā)板配置為U盤下載模式(USB插在OTG口,按住兩側(cè)按鍵再按RST按鍵),將 M1s_BL808_example/c906_app/build_out/lvgl_demo.bin 文件拖拽到U盤中即可。
      可以看到,所見即所得:

      LVGL升級體驗(yàn)

      完成基礎(chǔ)示例后,既可以進(jìn)行更復(fù)雜一些的基礎(chǔ)示例了。
      首先進(jìn)行一次頁面切換。
      點(diǎn)擊做下角的【Screen】圖標(biāo)即可增加一個顯示界面了。
      在界面2上增加一個【Arc】控件。

      下面,就應(yīng)該思考該如何做界面切換了。首先,計(jì)劃需要實(shí)現(xiàn)的功能:點(diǎn)擊按鈕進(jìn)入第二頁面,右劃第二界面回到第一頁面。
      實(shí)現(xiàn)方法如下:

      • 選中第一頁面的按鈕,可以看到右邊的屬性設(shè)置欄,可以對按鈕進(jìn)行各種屬性配置。

      • 點(diǎn)擊最下面的【ADD EVENT】,可以看到,有幾個事件類型選項(xiàng),我們做如下選擇:

        • 【Trigger】選擇 【CLICKED】,即點(diǎn)擊事件
        • 【Action】選擇【CHANGE SCREEN】,即切換屏幕

          然后點(diǎn)擊【ADD】,增加這個點(diǎn)擊事件,然后就可以對此事件進(jìn)一步配置:
        • 【Screen to】選擇【Screen2】,即切換到屏幕2(名稱可以自行修改,對應(yīng)到自己的屏幕的名稱)
        • 其他選項(xiàng)默認(rèn)(可自行測試功能,或是查看手冊查找功能說明)

          此時就算配置完成了第一步,實(shí)現(xiàn)點(diǎn)擊按鈕切換屏幕。可以點(diǎn)擊【運(yùn)行】三角號按鈕進(jìn)行模擬測試。
      • 后面可以進(jìn)行同樣的配置,點(diǎn)擊第二頁的屏幕,選中屏幕,右側(cè)進(jìn)行配置
        * 【Trigger】選擇 【GESTURE_RIGHT】,即右劃事件
        * 【Screen to】選擇【Screen1】,即切換到屏幕1

        然后點(diǎn)擊【ADD】,添加事件,進(jìn)入到事件配置界面。
        * 【Screen to】選擇【Screen1】,即切換到屏幕1
        此時完成預(yù)定目標(biāo)的配置,實(shí)現(xiàn)右劃切換回屏幕1,可以點(diǎn)擊【運(yùn)行】三角號按鈕進(jìn)行模擬測試。

      • 點(diǎn)擊【Export】->【Export UI Files】生成代碼。

      • 復(fù)制替換生成的代碼到linux對應(yīng)環(huán)境下,然后編譯下載,進(jìn)行實(shí)際運(yùn)行查看,可以看到實(shí)現(xiàn)了既定目標(biāo),在設(shè)備上跑起來了,按鈕和滑動也能正常切換。

      LVGL操控設(shè)備

      目前我們已經(jīng)完成了LVGL的簡單繪制,基本事件綁定等體驗(yàn)功能,但具體來說,也只是使用SquareLine Studio本身實(shí)現(xiàn)的,不需要編寫一行代碼就能實(shí)現(xiàn)(需要移植好的設(shè)備環(huán)境),并沒有涉及LVGL之外的交互。所以下面嘗試一下,將LVGL與硬件交互聯(lián)系起來,然后就能舉一反三,實(shí)現(xiàn)完整復(fù)雜的邏輯功能了。

      • 首先,計(jì)劃需要實(shí)現(xiàn)的功能:將屏幕2上的【Arc】控件于設(shè)備背面的LED的亮度綁定,實(shí)現(xiàn)拖拽【Arc】的角度就能控制LED的亮度。

      • 然后,我們來看一下LED的PWM驅(qū)動例子。
        打開 M1s_BL808_example/c906_app/pwm_demo 中的main.c,查看PWM的例子。
        可以看到,PWM操作背面的LED燈,只需要幾個特定的函數(shù)。

      • 再然后,我們考慮怎么將LVGL的【Arc】拖動事件與PWM調(diào)值聯(lián)系起來。

        • 選中屏幕2的【Arc】控件,點(diǎn)擊右下角的【ADD EVENT】,增加一個事件。
        • 【Trigger】選擇 【VALUE_CHANGED】,即值改變事件
        • 【Action】選擇【CALL_FUNCTION】,即調(diào)用函數(shù)

        • 點(diǎn)擊【ADD】,進(jìn)入配置
        • 給調(diào)用函數(shù)起一個名字,在【Action】->【Function name】文本框中輸入起的名字,如[Arc_PWMControl] ,注意,名字要夠一定字?jǐn)?shù)
          配置完成,開始生成文件。
          將生成的文件復(fù)制替換到linux環(huán)境下,打開文件夾,可以看到 ui_events.c 中有一個函數(shù):
      void Arc_PWMControl(lv_event_t * e)
      {
      	// Your code here
      }
      

      里面沒有任何功能。所以我們需要在本函數(shù)中添加回調(diào)函數(shù)對應(yīng)的處理,即獲取改變后的值,然后設(shè)置對應(yīng)脈寬給PWM,實(shí)現(xiàn)調(diào)節(jié)亮度。
      使用如下函數(shù)即可獲取到【Arc】控件的當(dāng)前值:

      int16_t ArcValue = 0;
      lv_obj_t* arc = lv_event_get_target(e);//獲取目標(biāo)控件指針
      ArcValue = lv_arc_get_value(arc) ;//獲取目標(biāo)值
      

      然后就可以使用這個值,調(diào)用 pwm_demo 中的 m1s_xram_pwm_set_duty 函數(shù)進(jìn)行占空比配置。我們可以在main函數(shù)中整合一下PWM操作相關(guān)的函數(shù),包括初始化和占空比調(diào)節(jié),進(jìn)行調(diào)用。在main.c中增加如下兩個函數(shù):

      ```
      #include "m1s_c906_xram_pwm.h"
      #define PWM_PORT (0)
      #define PWM_PIN (8)
      #define PWM_FREQ 2000  //PWM頻率設(shè)置
      //PWM驅(qū)動LED初始化代碼
      void LED_PWMInit(int freq,int duty){
          m1s_xram_pwm_init(PWM_PORT, PWM_PIN, freq, duty);
          m1s_xram_pwm_start(PWM_PORT, PWM_PIN);
      }
      //設(shè)置占空比
      void LED_PWMDutySet(int duty){
          m1s_xram_pwm_set_duty(PWM_PORT, PWM_PIN, PWM_FREQ, duty);   
      }
      ```
      

      將LED_PWMInit()函數(shù)放置到main函數(shù)中,將LED_PWMDutySet()函數(shù)使用extern關(guān)鍵字引用到ui_events.c中。
      查看pwm_demo中的m1s_xram_pwm_set_duty()函數(shù),可以看到,占空比為0-99,我們的【Arc】范圍為0-100,所以需要限制【Arc】的范圍。兩種方法:

      • 1:是在【Arc】屬性配置控件中將【Range max】最大值屬性設(shè)置為99
      • 2:在程序中增加判斷,大于99的都設(shè)置為99
        也可以兩種都用上,增加保險。
        然后在Arc_PWMControl()函數(shù)中調(diào)用,將ArcValue 值傳給m1s_xram_pwm_set_duty()函數(shù)即可。
        另外,由于LED燈電路上的驅(qū)動電路的不同(高電平端控制或是低電平端控制),所以PWM脈寬與LED亮度不一定成正比,可以加上一句 ArcValue = 99-ArcValue; 來換算。
        具體程序如下(僅供參考):
        main.c:
      /* FreeRTOS */
      #include <FreeRTOS.h>
      #include <task.h>
      
      /* bl808 c906 std driver */
      #include <bl808_glb.h>
      
      #include "demos/lv_demos.h"
      #include "lv_port_disp.h"
      #include "lv_port_indev.h"
      #include "lvgl.h"
      
      #include "ui.h"
      #include "m1s_c906_xram_pwm.h"
      static void lvgl_task(void *param)
      {
          while (1) {
              lv_task_handler();
              vTaskDelay(1);
          }
          vTaskDelete(NULL);
      }
      
      #define PWM_PORT (0)
      #define PWM_PIN (8)
      #define PWM_FREQ 2000
      
      //PWM驅(qū)動LED初始化代碼
      void LED_PWMInit(int freq,int duty){
          m1s_xram_pwm_init(PWM_PORT, PWM_PIN, freq, duty);
          m1s_xram_pwm_start(PWM_PORT, PWM_PIN);
      }
      //設(shè)置占空比
      void LED_PWMDutySet(int duty){
          m1s_xram_pwm_set_duty(PWM_PORT, PWM_PIN, PWM_FREQ, duty);   
      }
      
      void main()
      {
          LED_PWMInit(PWM_FREQ,99);//PWM初始化,默認(rèn)占空比設(shè)為99
          lv_init();
          lv_port_disp_init();
          lv_port_indev_init();//觸摸相關(guān)
          ui_init();
          lv_task_handler();
          xTaskCreate(lvgl_task, (char *)"lvgl task", 512, NULL, 15, NULL);
      }
      

      ui_events.c中程序如下:

      #include "ui.h"
      
      extern void LED_PWMDutySet(int duty);
      
      void Arc_PWMControl(lv_event_t * e)
      {
      	// Your code here
      	int16_t ArcValue = 0;
      	lv_obj_t* arc = lv_event_get_target(e);//獲取目標(biāo)控件指針
      	ArcValue = lv_arc_get_value(arc) ;//獲取目標(biāo)值
      	if(ArcValue>99)ArcValue=99;
      	
      	ArcValue = 99-ArcValue;//占空比對應(yīng)燈的亮度;由于LED驅(qū)動方式的不同,亮度與占空比不一定是正比
      							//這樣處理后便將亮度與占空比換算為正比了
      	
      	LED_PWMDutySet(ArcValue); 
      }
      

      將程序編譯,然后將 build_out文件夾下生成的 lvgl_demo.bin 拖拽到模擬U盤中更新程序,可以看到已經(jīng)實(shí)現(xiàn)了既定目標(biāo):

      • 點(diǎn)擊【button】切換到第二頁面
      • 右劃第二頁面回到第一頁面
      • 拖拽【Arc】控件實(shí)現(xiàn)控制背面LED的亮度


      (LED在背面,此處不再展示)

      以上只是一些簡單的例程,用于實(shí)現(xiàn)LVGL的操作體驗(yàn)和與硬件的交互實(shí)現(xiàn)的流程,更多功能便可以很輕松的拓展了。其實(shí)還有很多優(yōu)化空間的,比如【Arc】控件的左右滑動會激發(fā)頁面滑動效果從而回到第一頁面,右下角的參數(shù)窗口沒去掉,點(diǎn)擊指示圖標(biāo)是一個USB圖標(biāo),SDK的lvgl版本與編輯器的版本不同導(dǎo)致復(fù)雜界面卡死等。這些都可以自行深入學(xué)習(xí)并完善。
      關(guān)于LVGL深入的學(xué)習(xí),還請自行查看相關(guān)教程。而且例程是基于freertos嵌入式操作系統(tǒng)的,在main函數(shù)中可以看到,lv_task_handler()句柄是在 lvgl_task 任務(wù)中循環(huán)執(zhí)行的,所以可以創(chuàng)建其他線程執(zhí)行l(wèi)vgl之外的功能,而不是僅僅依靠lvgl控件的回調(diào)函數(shù)實(shí)現(xiàn)。后面有時間會再寫一些好玩的東西,比如深入理解一下LVGL的移植,然后實(shí)現(xiàn)其他的繪圖庫的移植,比如之前寫過的旋轉(zhuǎn)立方體:

      或是基于此算法的旋轉(zhuǎn)時鐘:

      • 隨夢,隨心,隨愿,恒執(zhí)念,為夢執(zhí)戰(zhàn),執(zhí)戰(zhàn)蒼天 ----執(zhí)念執(zhí)戰(zhàn) (好久沒寫我這很中二的座右銘了,哈哈)
      posted on 2023-03-14 19:08  執(zhí)念執(zhí)戰(zhàn)  閱讀(1428)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 久久精品蜜芽亚洲国产AV| 成人午夜在线观看日韩| 久久不见久久见免费视频| 国产福利社区一区二区| 国产av不卡一区二区| 口爆少妇在线视频免费观看| 亚洲精品欧美综合二区| 久久中文字幕无码一区二区| 色av专区无码影音先锋| 综合色久七七综合尤物| 亚洲av永久无码精品天堂久久| 亚洲精品一区三区三区在| 在线精品国产中文字幕| 人妻丰满熟妇av无码区不卡| 亚洲少妇人妻无码视频| 欧美精品在线观看视频| 国产激情第一区二区三区| 国产精品女人毛片在线看| 欧美三级在线播放| 欧美亚洲一区二区三区在线| 欧美视频免费一区二区三区| 国产目拍亚洲精品二区| 成人无码区在线观看| 人人妻人人做人人爽夜欢视频 | 欧美日韩国产亚洲沙发| 麻豆国产AV剧情偷闻女邻居内裤| 久久精品无码免费不卡| 成人亚洲精品一区二区三区 | 女子spa高潮呻吟抽搐| 日本高清无卡码一区二区| 国产桃色在线成免费视频| 日本中文字幕有码在线视频| 亚洲日韩精品无码一区二区三区| 精品国产乱来一区二区三区| 日本少妇xxx做受| 色99久久久久高潮综合影院| 欧美乱人伦人妻中文字幕| 深夜宅男福利免费在线观看| 日韩国产精品无码一区二区三区| 麻豆成人精品国产免费| 精品人妻少妇嫩草av专区|