衡阳派盒市场营销有限公司

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

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

3天內不再提示

HPM6750 測評 | 不寫一行代碼,兩分鐘實現WiFi聯網

先楫半導體HPMicro ? 2022-07-22 11:13 ? 次閱讀

一、創建RT-Thread項目

開始本篇實驗前,需要搭建RT-Thread開發環境,具體可以參考:“快來看!先楫芯與RT-Thread碰出火花了”

使用RT-Thread Studio創建名為hpm_net_test的項目:

17ff981c-039c-11ed-9ade-dac502259ad0.png

二、為項目添加RW007支持

2.1 打開RT-Thread Settings

項目創建成功后,打開項目的RT-Thread Settings界面:

181b7168-039c-11ed-9ade-dac502259ad0.png

可以看到,默認情況下SPI驅動框架已經打開了。

BSP中的SPI1驅動也已經打開了:

18342528-039c-11ed-9ade-dac502259ad0.png

2.2 添加RW007軟件包

在RT-Thread Settings界面,通過點擊“添加軟件包”按鈕,會彈出RT-Thread Package Center界面:

184550a0-039c-11ed-9ade-dac502259ad0.png

在中間的搜索框中輸入RW007,回車,可以找到RW007驅動程序軟件包:

1855e9b0-039c-11ed-9ade-dac502259ad0.png

點擊界面“添加”按鈕,即可將RW007軟件包添加到當前項目的包配置中了,此時軟件包并沒有真正下載下來。點完添加按鈕后,界面回到了RT-Thread Settings,此時按Ctrl+S保存,則會開始下載。下載過程中,控制臺子窗口中可以看到一些日志輸出:

18726040-039c-11ed-9ade-dac502259ad0.png

稍等片刻,可以看到控制臺中間有“RW007 v2.0.1 is downloaded successfully.”輸出。此時rw007軟件包已經成功下載到當前項目中了,具體代碼位于packages子目錄下:

188dcf4c-039c-11ed-9ade-dac502259ad0.png

2.3 配置RW007驅動

在RT-Thread Settings界面,將鼠標移動到RW007組件上,會彈出懸浮菜單:

18a20502-039c-11ed-9ade-dac502259ad0.png

點擊懸浮菜單中的“配置項”,即可進入RW007軟件包的配置界面:

18b69058-039c-11ed-9ade-dac502259ad0.png

可以看到,默認有一個RW007 for stm32的配置,就是說RW007默認包含了STM32的驅動。


這里我們需要修改的就是這個example driver port配置項,點擊下拉菜單改為不使用示例驅動:

18d622f6-039c-11ed-9ade-dac502259ad0.png

選中后,記得Ctrl+S保存配置。

2.4 編譯、燒錄、運行項目

在RT-Thread Studio中按Ctrl+B快捷鍵或點擊“錘子”圖標,即可開始編譯項目。編譯完成后,可以看到控制臺輸出了RAM和Flash占用:

18efca8a-039c-11ed-9ade-dac502259ad0.png

此時,將開發板連接到PC,并使用串口助手或者其他終端工具,連接到新增的串口上。

再到RT-Thread Studio中,按Ctrl+Alt+D快捷鍵或點擊“下載”圖標即可進行燒錄(或者直接進行調試也可以)。


燒錄完成后,可以看到串口終端上有輸出:

19109bf2-039c-11ed-9ade-dac502259ad0.png

可以看到,輸出了RT-Thread版本信息和RW007模組的序列號以及固件版本信息。這里能夠看到RW007模組的固件版本信息,其實HPM6750芯片和RW007模組之間已經可以正常通信了。

三、WiFi測試

接下來,我們進行一些簡單的WiFi測試。

添加RW007組件后,默認會打開RT-Thread的WiFi驅動框架,而RT-Thread的WiFi驅動框架中同時帶有一個測試命令——wifi(對就是這么直接)。

我們可以在RT-Thread的msh交互環境中使用help查看當前已有哪些命令:

192272c8-039c-11ed-9ade-dac502259ad0.png

可以看到有一個wifi命令。


接下來我們查看wifi命令的使用方式:

19326886-039c-11ed-9ade-dac502259ad0.png

3.1 掃描測試


嘗試掃描周圍的WiFi熱點:

1946298e-039c-11ed-9ade-dac502259ad0.png

可以看到,成功掃描到了周圍的WiFi熱點。

3.2 連接測試


嘗試連接其中的一個熱點:

195f900e-039c-11ed-9ade-dac502259ad0.png

然而,不幸的是,發生異常了。

不過,從這里的幾個warning打印信息可以看到,應該是因為tcpip線程棧溢出導致的。

3.3 調大tcpip線程棧大小


接下來,我們通過RT-Thread Settings修改tcpip線程棧的大小。

同樣,首先打開RTT Settings界面,鼠標指針放到LwIP組件圖標上:


197289b6-039c-11ed-9ade-dac502259ad0.png

打開配置項,找到RT_LWIP_TCPTHREAD_STACKSIZE配置項,并將其修改為4096:

19874748-039c-11ed-9ade-dac502259ad0.png

界面下方可以看到這個LwIP線程棧大小的配置項名稱為RT_LWIP_TCPTHREAD_STACKSIZE。至于這里為什么要改這個配置項,沒有在RT-Thread用過LwIP的同學可能會疑惑。其實,這里可以根據線程名“tcpip”,一路搜索代碼,首先可以找到創建名為tcpip線程的代碼位置,然后可以找到線程棧大小參數的來源。這里是搜索結果:

199e6900-039c-11ed-9ade-dac502259ad0.png

19a99bf4-039c-11ed-9ade-dac502259ad0.png

19bb72c0-039c-11ed-9ade-dac502259ad0.png

PS:因為默認使用的是lwip 2.0.3版本,所以這里只搜索了lwip-2.0.3的代碼。

3.4 重新測試

配置修改完成后,Ctrl+S保存,重新編譯項目、燒錄、運行,這次能夠成功連接WiFi熱點了:

19ce79ce-039c-11ed-9ade-dac502259ad0.png

可以看到,已經成功通過DHCP從熱點獲取到IP地址了。

四、網絡測試

4.1 RT-Thread網絡組件


前面提到,添加了RW007軟件包后,會開啟RT-Thread的WiFi驅動框架;同時,也會開啟系統中網絡協議相關的組件,主要包括套接字抽象層(SAL)、網絡接口層、輕量級TCP/IP堆棧(LwIP),如下圖所示。

19dff032-039c-11ed-9ade-dac502259ad0.png

其中,LwIP的默認版本用的是v2.0.3,也可以切換為其他版本(RT-Thread系統中同時提供了LwIP的好幾個版本可供選擇)。

4.2 RT-Thread網絡組件相關的命令

RT-Thread系統網絡相關組件打開后,將會向msh中注冊幾個命令用于測試,具體包括:ifconfig、ping、netstat、dns等,可以在help的輸出中找到:

19fe2cb4-039c-11ed-9ade-dac502259ad0.png

4.3 ping測試

有IP地址了,我們可以用ping命令測試一下能不能訪問baidu.com:

1a0bf902-039c-11ed-9ade-dac502259ad0.png

可以看到,能夠成功ping通baidu.com了。

使用baidu.com的域名能夠訪問,說明DNS整個流程都是OK的,同時網路協議也是沒問題的。

五、網絡帶寬測試

5.1 添加netutils軟件包

RT-Thread的netutils軟件包中提供了iperf命令,可以用于測試網絡帶寬;

和前面類似的方法,為項目添加netutils組件:

1a15ac54-039c-11ed-9ade-dac502259ad0.png

打開“配置項”后,打開iperf的配置項:

1a27edf6-039c-11ed-9ade-dac502259ad0.png

修改配置后,Ctrl+S保存。

重新編譯、燒錄、運行項目,help的輸出可以看到多了iperf命令。

5.2 iperf命令參數

在RT-Thread的msh中運行iperf,默認輸出幫助信息:

1a34503c-039c-11ed-9ade-dac502259ad0.png

可以看到iperf的命令參數使用方法。

需要注意:

1.RT-Thread的iperf命令實現中,對參數的順序有要求,如果使用過程中發現參數報錯,需要查看源碼定位原因;

2.RT-Thread的iperf不支持持續時間選項,一般是先啟動,后通過stop選項停止的方式控制測試時長;

5.3 PC端的iperf

PC端的iperf可以到iperf項目官網下載:https://iperf.fr/iperf-download.php

我使用的mobaxterm,里面自帶了iperf命令,所以就不單獨下載了:

  1. 1a48fc94-039c-11ed-9ade-dac502259ad0.png

5.4 進行iperf測試


進行iperf測試之前,需要注意:

1.最好用PC創建熱點,用無線路由器也行,但是需要確保信號強度足夠;

2.確保開發板和PC直線的距離不要太遠,否則WiFi信號較弱,測試的結果可能會偏小;

3.最好在WiFi熱點較少的環境下進行測試,否則測出的結果數據也會偏小;

下面進行測試,測試步驟如下:


在PC上,創建熱點,例如名為rtt,密碼為12345678

在PC上,啟動iperf服務端:iperf -s -p 5678

在PC上,使用ipconfig/ifconfig命令查看熱點的IP地址,例如我在Win10上創建的熱點,IP地址是:192.168.137.1

在開發板上,連接PC啟動熱點:wifi join rtt 12345678

5.在開發板上,查看IP地址是否已成功分配:ifconfig,另外,可以通過ping命令測試開發板和PC直接IP是否可達

6.在開發板上,啟動iperf客戶端:iperf -c 192.168.137.1 -p 5678

啟動后,可以通過ps命令查看正在運行的線程

7.一段時間后,在開發板上,停止iperf客戶端:iperf —stop

8.開發板上iperf停止后,PC端應該可以看到iperf的輸出;

開發板上整個過程的輸出如下:

1a5ed8fc-039c-11ed-9ade-dac502259ad0.png

PC端輸出:

1a6da990-039c-11ed-9ade-dac502259ad0.png

可以看到帶寬為7.45Mbps

5.5 iperf測試小結


實際上,影響WiFi帶寬測試結果數據的因素很多。我們這里,其中,起決定性的的主要由以下幾個方面:

RW007模組本身支持的最高WiFi傳輸速率;

RW007模組的SPI接口支持的最高工作頻率;

HPM6750 SPI接口最高支持的工作頻率;

熱點(PC或路由器)的WiFi最高傳輸速率;

各種環境因素,例如開發板和PC直接的距離、環境是否有其他熱點干擾等等;

六、業務代碼——socket測試


前面的ping測試、iperf測試使用的是系統已有組件或軟件包。除此之外,也可以通過socket連接網絡。這里以一個簡單的使用socket獲取baidu首頁為例(直接使用web_client軟件包也可以實現該功能):

#include #include #include #include #define DEFAULT_HOST "example.com"#define DEFAULT_PORT 80#define CONTENT_LENGTH "Content-Length:"#define HEADER_END_MARK "\\r\\n\\r\\n"uint32_t get_host_addr(const char *host){ uint32_t dest = 0; struct hostent *he; he = gethostbyname(host); if (he && he->h_addr_list && he->h_addr_list[0]) { dest = ((struct in_addr *)(he->h_addr_list[0]))->s_addr; } return dest;}#define close(fd) closesocket(fd)int fetch(int argc, char* argv[]){ char* host = DEFAULT_HOST; int port = DEFAULT_PORT; int sockfd = -1; int retval = 0; int recved = 0; int content_start = 0; int content_length = 0; struct sockaddr_in server_addr = {0}; static char request[256]; static char response[4096]; if (argc > 1) host = argv[1]; if (argc > 2) port = atoi(argv[2]); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { rt_kprintf("create socket failed!\\n"); return -1; } rt_kprintf("create socket success!\\n"); rt_memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = get_host_addr(host); // IP轉為 “點分十進制” 格式 inet_ntop(AF_INET, &server_addr.sin_addr, response, sizeof(response)); rt_kprintf("server IP: %s\\n", response); rt_kprintf("connect to server...\\n"); retval = connect(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)); if (retval < 0) { rt_kprintf("connect failed!\\n"); close(sockfd); return -1; } rt_snprintf(request, sizeof(request), "GET / HTTP/1.1\\r\\n" "Host: %s\\r\\n" "User-Agent: curl/7.81.0\\r\\n" "Accept: */*\\r\\n" "\\r\\n", host); rt_kprintf("send request...\\n"); retval = send(sockfd, request, rt_strlen(request), 0); if (retval < 0) { rt_kprintf("send failed!\\n"); close(sockfd); return -1; } rt_kprintf("%d bytes sent\\n", retval); rt_kprintf("recv response...\\n"); recved = 0; while ((retval = recv(sockfd, &response[recved], sizeof(response) - recved, 0)) > 0) { if (content_length == 0) { char* content_length_pos = rt_strstr(response, CONTENT_LENGTH); if (content_length_pos) { content_length = atoi(content_length_pos + rt_strlen(CONTENT_LENGTH)); rt_kprintf("found %s %d!\\n", CONTENT_LENGTH, content_length); } } if (content_start == 0) { char* header_end = rt_strstr(response, HEADER_END_MARK); if (header_end) { content_start = header_end + rt_strlen(HEADER_END_MARK) - response; rt_kprintf("content_start: %d\\n", content_start); } } recved += retval; rt_kprintf("recved: %d %d %d\\n", recved, content_start, content_length); if (content_length && content_start && recved - content_start >= content_length) { rt_kprintf("fully recved!\\n"); break; } } response[recved] = '\\0'; rt_kprintf("==== Response Header ====:\\n"); for (int i = 0; i < content_start; i++) { rt_kprintf("%c", response[i]); } rt_kprintf("==== Response Content ====:\\n"); for (int i = content_start; i < recved; i++) { rt_kprintf("%c", response[i]); } if (retval < 0) { rt_kprintf("recv failed!\\n"); close(sockfd); return -1; } shutdown(sockfd, SHUT_RDWR); close(sockfd); return 0;}MSH_CMD_EXPORT(fetch, "fetch home page of a site");

這是一段使用裸socket實現的簡單HTTP客戶端,依次進行了請求發送、回復接收和回復解析的過程,測試結果:

1a7732f8-039c-11ed-9ade-dac502259ad0.png

七、原理簡介


以上操作,我們沒有任何底層驅動相關代碼,就實現了通過HPM6750EVKMINI開發板的RW007 WiFi模組實現聯網功能。這是因為我們基于RT-Thread的項目中,從底到上已經有了:

HPM6750EVKIMNI BSP中包含了SPI驅動(libraries/drivers/drv_spi.c文件);

默認打開了spi1的編譯配置;

HPM6750EVKIMNI BSP中包含了網卡初始化代碼(board/rw007_port.c文件);

向系統注冊了啟動時自動執行的wifi_spi_device_init函數;

wifi_spi_device_init函數內部會調用rw007軟件包中的rt_hw_wifi_init函數;

RW007軟件包,包含RW007模組的驅動代碼;

底層使用SPI驅動實現主控和RW007模組之間的通訊;

上層向RT-Thread系統注冊WLAN設備(rt_hw_wifi_init函數內部會調用rt_wlan_dev_register函數);

RT-Thread的WiFi(也叫WLAN)驅動框架;

對下連接具體的 WIFI 驅動,控制 WIFI 的連接斷開,掃描等操作。

對上承載不同的應用,為應用提供 WIFI 控制,事件,數據導流等操作,為上層提供統一的 WIFI 控制接口。

RT-Thread的Socket抽象層(SAL),統一幾種不同的socket實現;

RT-Thread的TCP/IP協議棧(LwIP),具體的TCP/IP協議實現;

(文章摘選自RTT @xusiwei1236)

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

    關注

    81

    文章

    5309

    瀏覽量

    204810
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    41002
收藏 人收藏

    評論

    相關推薦

    兩分鐘搞懂接地的機理和規范

    ,包子,哪種你都可能是對的,取決于客人的最核心需求是什么。 接地的核心知識點是3個:地電容特性、高頻接地、單點串并聯。 1)地電容特性 地,到底是個什么?別聽書上說的,全是云山霧罩,他們都是生怕你聽迷糊。我簡單總結地就當個大電容的
    的頭像 發表于 01-28 16:11 ?104次閱讀
    <b class='flag-5'>兩分鐘</b>搞懂接地的機理和規范

    tlv320aic3100芯片播放不正常怎么解決?

    板子在工作的時候聲音被拉長(也就是說本來一分鐘播放完的聲音需要兩分鐘播放完),MCLK頻率正常,BLACK和WCLK頻率大約是正常頻率的半。 前面個帖子問過這個問題,現在發現新的
    發表于 11-06 07:12

    如何做hpm6750evk2的bootloader?

    我正在做hpm6750evk2的bootloader。設計很簡單,boot工程代碼只做跳轉到1M后的APP工程代碼處,APP工程就是做的
    發表于 10-23 19:01

    HPM6750 Bootloader設計

    我正在做hpm6750evk2的bootloader。設計很簡單,boot工程代碼只做跳轉到1M后的APP工程代碼處,APP工程就是做的
    發表于 10-23 18:59

    HPM6750evkmini如何實現可信的執行環境?

    HPM6700的datasheet中的1.2.15 信息安全系統有提到“基于BOOT ROM 的安全啟動機制,支持加密啟動,支持可信的執行環境”,請問可信的執行環境如何實現的?有相關的Demo或者資料嗎?是類似于TFM這樣的嗎?
    發表于 09-25 09:27

    兩分鐘帶你了解步進電機控制的方法

    步進電機是種將電脈沖信號轉換為角位移或線位移的電動機。其工作原理基于電磁學原理,通過將電能轉換為機械能來實現控制。步進電機控制方法主要包括脈沖控制、?電流控制、?PID控制和?矢量控制等。
    的頭像 發表于 09-18 14:47 ?633次閱讀
    <b class='flag-5'>兩分鐘</b>帶你了解步進電機控制的方法

    使用OPA615進行峰值保持電路設計,輸出的保持信號在兩分鐘中內會有0.1V左右的衰減,為什么?

    采用如圖所示的保持電路,保持信號為1V 1Khz 15ns脈寬的單脈沖信號,在實際電路中發現,電路通電后,輸出的保持信號在兩分鐘中內會有0.1V左右的衰減,出現這樣的個漸變的過程,之后電路輸出信號才會保持穩定。每次剛通電都會有這樣的現象出現,請問是什么原因造成的?
    發表于 08-13 07:15

    為什么Xtr111輸出短路時沒有產生保護動作?

    =4.5V, Xtr 111沒有發生輸出開路時的保護動作,還保持正常工作狀態,這跟數據手冊描述的不樣。 輸出短路兩分鐘以后兩分鐘以后解除短路,輸出線路串入300歐電阻, Xtr 111能正常工作。 為什么輸出短路時沒有產生保護
    發表于 08-09 07:53

    hpm_manufacturing_tool linux 版本 選擇 hidraw 連接等待超時

    _manufacturing_tool_gui linux 版本 選擇 hidraw 連接 HPM6750 芯片,能識別到 hidraw 設備,單擊連接是提示重啟芯片這個時候會等待超時然后軟件報錯,此時查看 lsusb 設備是檢測不到 hpm6750
    發表于 08-07 16:43

    在VSCODE終端make時遇到錯誤要一行一行看然后定位,可以直接跳轉點擊或者VSCODE定位錯誤嗎?

    每次在VSCODE終端make時遇到錯誤要一行一行看然后定位,可以直接跳轉點擊或者VSCODE直接定位錯誤嗎?能給個指引鏈接嗎?謝謝!
    發表于 06-25 07:37

    esp32連接上騰達AC7路由器如何解決?

    你好,我測試了20種路由器和esp32的鏈接,現在發現騰達AC7路由器很難鏈接上esp32.或者要兩分鐘才可以連接上。3.1.1很難鏈接。 3.1.3版本的軟件基本連接上。請問這個問題該如何解決。但是其他型號路由器都很快連
    發表于 06-12 08:08

    ESP32C3連上wifi后每隔兩分鐘會斷開重連怎么解決?

    (263) cpu_start: Application information:[0m [0;32mI (266) cpu_start: Project name:wifi_station[0m
    發表于 06-07 06:53

    在uCGUI的回調函數里加了代碼,stm32無法啟動怎么解決?

    我是個初學者。最近在個uCGUI上的小應用的時候遇到了這樣的問題,我在MULTIEDIT控件的回調函數里加了一行代碼,運行我自己
    發表于 04-24 07:06

    HPM6750體驗ADC

    1、新建RTT工程,工程中添加對ADC的驅動: 2、保存工程后,添加測試代碼。 3、我們根據原理圖上的J10接個,只有PE29是ADC3的輸出通道 4、先定義通道、任務 #define
    發表于 02-17 16:00

    解決HPM6750EVK2jlink下載

    拿到HPM6750EVK2,使用jlink下載時,我原來用買jlink配的20轉10轉接板進行連接,下載程序里直報不能連接到開發板。經過查找用手冊后,找到了問題。 我的jlink的引腳圖與之不對
    發表于 02-16 10:30
    西安市| 百家乐游戏大| 皇宝娱乐| 百家乐现场新全讯网| 博狗备用| 百家乐前四手下注之观点| 百家乐官网破解视频| 威尼斯人娱乐城网| 百家乐官网博百家乐官网的玩法技巧和规则 | 真人百家乐澳门娱乐城| 百家乐官网正网包杀| 大发888娱乐出纳柜台| 24山认龙立向| KK百家乐官网现金网| 唐人街百家乐的玩法技巧和规则| 黄金城百家乐官网手机用户| 百家乐官网三路秘诀| 网上棋牌赌博| 百家乐凯时娱乐网| 百家乐官网剁手| 德州扑克视频| 金满堂百家乐的玩法技巧和规则| 百家乐必赢法软件| 百家乐硬币打法| 合乐8百家乐娱乐城| 百家乐长龙太阳城| 在线百家乐大家赢| 百家乐官网套装| 百家乐官网微心打法| 永胜博| 百家乐园能贷款吗| 百家乐声音不印网| 豪杰百家乐游戏| 如何看百家乐官网路| 网络百家乐官网最安全| 德州扑克大赛| 申城棋牌官网| 360棋牌大厅| 香港六合彩公司| 康平县| 足球赌球网|