在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

USB 一線通監控副屏

RT-Thread官方賬號 ? 2024-12-07 01:10 ? 次閱讀

環境搭建

環境變量配置

為了提高一些編譯的速度,選擇了在 Linux 系統下進行開發,在 Linux 上開發 N947 需要先安裝 env 工具 https://github.com/RT-Thread/env ,按照說明文檔進行安裝即可,然后配置一些環境變量如下

其中 /opt/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/bin 是自己的編譯工具鏈的路徑,/home/book/rt-thread 是 RT-Thread 根目錄的路徑

source ~/.env/env.sh export RTT_CC=gcc export RTT_ROOT=/home/book/rt-thread export RTT_DIR=/home/book/rt-thread export RTT_EXEC_PATH=/opt/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/bin export PATH=$PATH:$RTT_EXEC_PATH

如果需要將 N947 的例程從 rt-thread 的根文件夾中獨立出來的話,需要刪除工程中 Kconfig 文件的這行代碼

0163bda2-b3f5-11ef-8084-92fbcf53809c.png

代碼高亮

這里使用 VSCode 中的 Clang 插件,代碼高亮和補全可以通過使用編譯時候生成的 compile_commands.json 文件來實現,而 RT-Thread 的工程是采用的 scons 工具,所以可以使用 scons_compiledb 這個 python 包來生成 compile_commands.json 實現代碼高亮,修改過的 SConstruct 文件如下

import osimport sysimport rtconfigimport scons_compiledbif os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT')else: RTT_ROOT = os.path.normpath(os.getcwd() + '/../../../../..')sys.path = sys.path + [os.path.join

(RTT_ROOT, 'tools')]try: from building import *except: print('Cannot found RT-Thread root directory, please check RTT_ROOT') print(RTT_ROOT) exit(-1)TARGET = 'rtthread.' + rtconfig.TARGET_EXTif rtconfig.PLATFORM == 'armcc': env = Environment(tools = ['mingw'], AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,

CXX =

rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, AR = rtconfig.AR, ARFLAGS = '-rc', LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS, # overwrite cflags, because cflags has '--C99' CXXCOM = '$CXX -o $TARGET --cpp -c $CXXFLAGS $_CCCOMCOM $SOURCES')else: env = Environment(tools = ['mingw'], AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS, CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, AR = rtconfig.AR, ARFLAGS = '-rc', LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS, CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS

$_CCCOMCOM

$SOURCES')env.PrependENVPath('PATH', rtconfig.EXEC_PATH)scons_compiledb.enable(env)env.CompileDb()if rtconfig.PLATFORM in ['iccarm']: env.Replace(CCCOM =

['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) env.Replace(ARFLAGS = ['']) env.Replace(LINKCOM =

env["LINKCOM"] + ' --map rtthread.map')Export('RTT_ROOT')Export('rtconfig')SDK_ROOT

= os.path.abspath('./')if os.path.exists(SDK_ROOT + '/Libraries'): libraries_path_prefix = SDK_ROOT + '/Libraries'else: libraries_path_prefix

= os.path.dirname(SDK_ROOT) + '/Libraries'SDK_LIB = libraries_path_prefixExport('SDK_LIB')# prepare building environmentobjs =

PrepareBuilding(env, RTT_ROOT,

has_libcpu=False)objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript')))#

include cmsisobjs.extend(SConscript(os.path.join(libraries_path_prefix, rtconfig.BSP_LIBRARY_TYPE, 'SConscript')))# make a buildingDoBuilding(TARGET, objs)

最終搭建完成的效果如下所示,代碼高亮十分方便查看代碼

01755454-b3f5-11ef-8084-92fbcf53809c.png

LVGL 適配

屏幕拓展板

FRDM-MCXN947 這個開發板預留了一個 FlexIO 接口可以適配 8080 的并口屏,于是做了一個屏幕拓展板,把手里閑置的屏幕用起來

018c1bee-b3f5-11ef-8084-92fbcf53809c.png

實物如下,觸摸排線座子有點偏下,不過不影響功能

019f0d6c-b3f5-11ef-8084-92fbcf53809c.png

屏幕手冊說明分辨率是 240*320 驅動芯片是 ST7789V、觸摸芯片是 FT6336G,而官方的 SDK 中是有 ST7796 和 FT5406 的驅動代碼的,后續還需要稍作修改

01a54f42-b3f5-11ef-8084-92fbcf53809c.png

驅動適配

在官方的 SDK 中有 ST7796 和 FT5406 的驅動程序,直接移植過來即可,同時也把 EDMA 和 SMARTDMA 的驅動復制了過來,修改一下屏幕的初始化序列即可驅動屏幕

01b9d34a-b3f5-11ef-8084-92fbcf53809c.png

LVGL 適配

將SDK中的 lvgl_support 復制到工程中,修改屏幕的寬高為 240*320

01cb7cee-b3f5-11ef-8084-92fbcf53809c.png

然后在 board 中新建一個 lv_conf.h 文件,填入關于 LVGL 的一些配置,因為許多配置在 menuconfig 中有所設置,所以這里的配置項并不多

復制過來的 lvgl_support 中有對 FreeRTOS 的支持,這里將 FreeRTOS 的 API 修改為 RTT 的 API,例如如下這段代碼

01f0e010-b3f5-11ef-8084-92fbcf53809c.png

并且 N947 的驅動程序有 EDMA + FlexIO 和 SMARTDMA + FlexIO 兩種驅動方式,具體區別不太了解,不過可以運行 LVGL 的 Benchmark 測試來看下結果,左邊是 SMARTDMA 運行的結果,右邊是 EDMA 的結果,可以看到前者的 FPS 更高。后續也就繼續采用 SMARTDMA + FlexIO 的驅動方式

0205046e-b3f5-11ef-8084-92fbcf53809c.png

界面設計

然后使用 GUI Guider 設計一個界面,生成繪制界面的代碼,然后添加到工程中

0234912a-b3f5-11ef-8084-92fbcf53809c.png

還需要修改工程文件夾中的 rtconfig.py,增加一個 LV_LVGL_H_INCLUDE_SIMPLE 的預定義,因為生成的代碼默認包含 lvgl.h 是 #include "lvgl/lvgl.h"

最終適配完成的 LVGL 代碼和 GUI Guider 的代碼目錄如下,LVGL 的 UI 繪制代碼段如圖右邊所示,具體代碼可見開源地址

02451fcc-b3f5-11ef-8084-92fbcf53809c.png

USB 通訊

適配 CDC

完成了下位機的界面的初始化繪制,后續的任務當然就是怎么把數據采集并發送給下位機來更新界面的數據了,下面先完成 USB 的通訊,這里使用的是 RTT 官方推薦的 CherryUSB 這個開源 USB 協議棧

026a57ba-b3f5-11ef-8084-92fbcf53809c.png

將如下鏈接中的適配代碼復制到工程中

https://github.com/CherryUSB/cherryusb_mcx

因為傳輸的數據比較單一,這里使用串口屏的思路,直接用 CDC_ACM 的通訊方式,也就是在上位機顯示為一個 USB 轉串口設備,直接使用串口 API 完成通訊

將 RTT 根目錄中 rt-thread/components/drivers/usb/cherryusb/demo 文件夾中的 CDC_ACM 例程復制到工程中,并且把根目錄中的這兩行代碼屏蔽

0274391a-b3f5-11ef-8084-92fbcf53809c.png

修改工程中的 cherryusb_port.c 文件,添加對 CDC_ACM 的支持

/* * Copyright (c) 2006-2024, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2024/04/23 sakumisu first version */#include #include /* low level init here, this has implemented in cherryusb *//* low level deinit here, this has implemented in cherryusb */#ifdef RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACMint

cherryusb_devinit(void){ // extern void cherryusb_devinit(uint8_t busid, uintptr_t reg_base); extern void cdc_acm_init(uint8_t busid, uintptr_t reg_base);

cdc_acm_init(0, USBHS1__USBC_BASE); return 0;}INIT_COMPONENT_EXPORT(cherryusb_devinit);#endif#ifdef

RT_CHERRYUSB_DEVICE_TEMPLATE_MSCint cherryusb_devinit(void){ extern void msc_ram_init(uint8_t busid, uintptr_t reg_base);

msc_ram_init(0, USBHS1__USBC_BASE); return 0;}INIT_COMPONENT_EXPORT(cherryusb_devinit);#endif#ifdef RT_CHERRYUSB_HOST#include

"usbh_core.h"int cherryusb_hostinit(void){

usbh_initialize(0, USBHS1__USBC_BASE); return 0;}

INIT_COMPONENT_EXPORT(cherryusb_hostinit);#endif

將剛才復制到工程中的 CDC_ACM 的 demo 程序中端點收發的程序做如下修改,增加對于輸入信息的回顯

void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes){ USB_LOG_RAW("actual out len:%d\r\n", nbytes); /* setup next out ep read transfer */ usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); for (int i = 0; i < nbytes; i++) { printf("%02x ", read_buffer[i]); } printf("\r\n");}

驗證

然后插上開發板的 USB HS 那個 USB 接口,用串口工具發個數據包

0279df00-b3f5-11ef-8084-92fbcf53809c.png

可以看到 已經識別成了 USB 串行設備,PID 和 VID 也是我自己設置的 0xE6E9 和 0x1122,后續上位機與開發板建立通訊鎖定 COM 號就是依靠 PID VID 來查詢實現,使用串口工具給開發板發送的數據也可以正常接收到

上位機

時間原因上位機做的比較簡單,實現了如下幾個功能:

讀取電腦的 CPU、GPU 的占用率和溫度信息、獲取當前時間

根據 VID、PID 查詢 COM來與開發板通訊,下發采集數據與時間

增加幀頭后發送到下位機,固定長度 32+2 個字節

028d2204-b3f5-11ef-8084-92fbcf53809c.png

下位機數據更新

在開發板端增加一個 thread 來負責把 USB 接收到的數據更新到屏幕上面,使用 LVGL 的 API 直接修改數據即可,代碼如下

數據結構體

typedef struct{ uint16_t cpu_usage; uint16_t mem_usage; uint16_t gpu_usage; uint16_t cpu_freq; uint16_t cpu_temperature; uint16_t gpu_temperature; uint16_t board_temperature;} monitor_info_u16_t;typedef struct { uint16_t wYear; uint16_t wMonth; uint16_t wDayOfWeek; uint16_t wDay; uint16_t wHour; uint16_t wMinute; uint16_t wSecond; uint16_t wMilliseconds;} mytime_t;

在 USB 端點輸出的回調函數中增加消息隊列發送函數

void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes){ USB_LOG_RAW("actual out len:%d\r\n", nbytes); /* setup next out ep read transfer */ usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); for (int i = 0; i < nbytes; i++) { printf("%02x ", read_buffer[i]); } printf("\r\n"); if (34 == nbytes) { rt_mq_send(&usb_mq, read_buffer, 34); }}

main 函數中的接收消息隊列

uint8_t read_buffer[128];while (1){ /* 從消息隊列中接收消息 */ if (rt_mq_recv(&usb_mq, read_buffer, 34, RT_WAITING_FOREVER) > 0) { mytime_t* p_time_u16 = (mytime_t*)(read_buffer + 2); monitor_info_u16_t* p_info_u16 = (monitor_info_u16_t *)(read_buffer + 2 + sizeof(mytime_t)); rt_kprintf("wYear %u\r\n", p_time_u16->wYear);

rt_kprintf("wMonth %u\r\n", p_time_u16->wMonth); rt_kprintf("wDayOfWeek %u\r\n", p_time_u16->wDayOfWeek); rt_kprintf("wDay %u\r\n", p_time_u16->wDay); rt_kprintf("wHour %u\r\n", p_time_u16->wHour); rt_kprintf("wMinute %u\r\n", p_time_u16->wMinute);

rt_kprintf("wSecond %u\r\n", p_time_u16->wSecond); rt_kprintf("wMilliseconds %u\r\n", p_time_u16->wMilliseconds);

rt_kprintf("cpu_usage %u\r\n", p_info_u16->cpu_usage); rt_kprintf("mem_usage %u\r\n", p_info_u16->mem_usage); rt_kprintf("gpu_usage %u\r\n", p_info_u16->gpu_usage); rt_kprintf("cpu_freq %u\r\n", p_info_u16->cpu_freq); rt_kprintf("cpu_temperature %u\r\n", p_info_u16->cpu_temperature); rt_kprintf("gpu_temperature %u\r\n", p_info_u16->gpu_temperature); rt_kprintf("board_temperature %u\r\n",

p_info_u16->board_temperature); lv_label_set_text_fmt(guider_ui.screen_label_cpu_temp,

"%2d", p_info_u16->cpu_temperature);

lv_label_set_text_fmt(guider_ui.screen_label_gpu_temp,

"%2d", p_info_u16->gpu_temperature); lv_label_set_text_fmt(guider_ui.screen_label_cpu_load,

"%2d", p_info_u16->cpu_usage); lv_label_set_text_fmt(guider_ui.screen_label_gpu_load, "%2d", p_info_u16->gpu_usage); lv_arc_set_value(guider_ui.screen_arc_gpu_load,

p_info_u16->gpu_usage); lv_arc_set_value(guider_ui.screen_arc_gpu_temp,

p_info_u16->gpu_temperature); lv_label_set_text_fmt(guider_ui.screen_time, "%02d:%02d", p_time_u16->wHour, p_time_u16->wMinute); lv_label_set_text_fmt(guider_ui.screen_date, "%02d.%02d.%02d", p_time_u16->wYear, p_time_u16->wMonth, p_time_u16->wDay); }}

成品效果

目前支持了對于時間、日期、CPU、GPU 的占用率和溫度信息,其他的信息還在完善當中

029ebb04-b3f5-11ef-8084-92fbcf53809c.jpg

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    60

    文章

    7945

    瀏覽量

    264633
  • 監控
    +關注

    關注

    6

    文章

    2208

    瀏覽量

    55197
  • 代碼
    +關注

    關注

    30

    文章

    4788

    瀏覽量

    68603
收藏 人收藏

    評論

    相關推薦

    USB一線通監控設計方案

    在2024年全國大學生嵌入式芯片與系統設計競賽中,各大高校學子紛紛展現出卓越的創新能力和扎實的技術功底。今天,特別為大家分享獲獎作品——USB一線通監控
    的頭像 發表于 11-28 09:45 ?680次閱讀
    <b class='flag-5'>USB</b><b class='flag-5'>一線通</b><b class='flag-5'>監控</b><b class='flag-5'>副</b><b class='flag-5'>屏</b>設計方案

    4.3寸【串口案例】電腦應用

    為HardwareMonitor_V1.0。HardwareMonitor_V1.0軟件主要用于UI界面的編輯與燒錄。 如圖所示,個制作完成的UI工程。 設置完變量地址后即可實現機箱硬件
    發表于 01-31 11:12

    BeagleBone Black USB一線通(1)

    eMMC的內容。二、啟動與終端 購置的板子,附送的USB轉串口,是非常有用的。連接u***串口的GND、RXD、TXD,對應到 BBB板上J1的1腳、5腳、4腳。打開串口終端,設置速率115200
    發表于 10-22 17:01

    BeagleBone Black USB一線通(2)

    。 在主機這邊,應該也安裝好了跟BB-Black相關的驅動程序,其中就有個網絡設備 Linux USB Ethernet/RNDIS Gadget。為了和BB-Black連接方便,可以把主機的這個網卡
    發表于 10-22 17:03

    BeagleBone Black USB一線通(3)

    20來寸的顯示器上,還是有些不協調。索性我們使用圖形界面遠程登陸,實現BB-Black的圖形顯示。這樣的話,仍然是使用那條連接到USB-OTG上面的多接口USB線纜,就可以實現一線通的目的。功能完備又
    發表于 10-22 17:05

    今日話題:一線城市 or 二城市?

    `社會學家鄭也夫說人生不外乎在追求三種狀態:舒服、刺激、牛B。其實也是道城市選擇題:皆因年輕的我們,愛冒險勝過愛安逸,愛牛B勝過愛舒服,自愿進入人生愿境最誘人、生存邏輯又最殘酷的一線城市。這是
    發表于 03-09 10:10

    lcd2004一線仿真

    )圖5四,編輯main.c 代碼如Proteus8.9 VSM Studio GCC編譯器仿真STM32F407ZGT6系列015_lcd2004一線(如下圖6所示)圖6五,Main.c 代碼:/* Main.c file generated by New Projec
    發表于 12-13 07:20

    FPGA的JTAG接口和ARM的JTAG接口是否可以共用同一線

    FPGA的JTAG接口和ARM的JTAG接口是否可以共用同一線呢?是否可以用同usb轉JTAG給ARM和FPGA以及dsp調試程序呢?
    發表于 08-10 14:54

    基于TINI的一線制網絡互連技術

    概述 TINI的基本概念和工作原理,分析 TINI的軟件環境;簡述基于一線制技術的溫度型iButton DS1920和小型氣象儀,給出利用 TINI實現一線制網絡與 Internet連接的應用實例。
    發表于 04-13 10:15 ?20次下載

    CCEF新品:博視Allshow全景液晶L32A703I

    產品特性·高清晰液晶·博視全景·HDMI高清一線通·數字電視精密顯示
    發表于 04-07 20:51 ?1701次閱讀

    一線通校園智能尋址調頻廣播系統解決方案

    一線通校園智能尋址調頻廣播系統解決方案,有興趣的同學可以下載學習
    發表于 05-04 15:48 ?0次下載

    LED顯示廠商:全面奮戰一線市場,鎖定用戶范圍

    “當前一線市場不是變差了,而是對手變強了;同樣地,一線需求不是變少了,而是用戶要求更多了。..。..。”那么,面對這種持續的變化,LED顯示企業如何能更好的搶奪用戶并轉化為產品銷量呢?
    發表于 07-30 13:06 ?728次閱讀

    Switch通過Type-C一線直連汽車中控方案

    5 月21 日消息,今日新能源造車勢力官方微博劇透新車型。新配置。汽車中控,還有駕娛樂,后艙娛樂,均可以通過 Type-C 接口一線
    的頭像 發表于 05-21 19:04 ?5123次閱讀
    Switch通過Type-C<b class='flag-5'>一線</b>直連汽車中控<b class='flag-5'>屏</b>方案

    typec顯示器方案推薦 分別有什么特點

    支持typec一線通的顯示方案就是通過條typec把電腦或者手機畫面直接投到顯示上,這需要顯示
    的頭像 發表于 11-04 16:11 ?6262次閱讀

    STM32用一線式驅動SD NAND,SDIO的一線式驅動

    SDIO(Secure Digital Input/Output)是種用于在嵌入式系統中連接外部設備的標準接口。在SDIO標準中,一線式和四式是指SDIO接口的不同工作模式。
    的頭像 發表于 12-19 14:14 ?940次閱讀
    STM32用<b class='flag-5'>一線</b>式驅動SD NAND,SDIO的<b class='flag-5'>一線</b>式驅動
    主站蜘蛛池模板: 手机看片1024日韩| 女69女人poren25| 午夜精品久久久久久久第一页| 亚洲午夜久久久久久噜噜噜| 欧美日韩亚洲国产| 天天摸天天碰成人免费视频| 68日本xxxxxxxxx18能看的| 婷婷激情综合| 波多野结衣在线视频免费观看| 福利区在线观看| 香蕉久久精品| 丁香婷婷亚洲| 欧美黄色性| 日本三级带日本三级带黄首页| 亚洲午夜久久久精品影院| 正在播放一区二区| 全日本爽视频在线| 日本加勒比在线视频| 国产叼嘿视频免费网站| 黄色小毛片| 日本人69xxxxxxxx69| 色婷婷综合激情视频免费看| 在线观看s色| 日本一区高清视频| 久久免费精品国产72精品剧情| 久久精品亚洲| 婷婷在线影院| 停停五月天| 调教r18车肉高h男男| 国产女人18毛片水真多18精品| 91福利视频网| 日韩美a一级毛片| 热之国产| 亚洲xxx视频| 午夜剧场刺激性爽免费视频| 九九热精品在线视频| 国产无限资源| 正在播放亚洲一区| 久久国产精品永久免费网站| 色在线视频观看| 亚洲国产精品热久久2022|