從零開始使用 CubeMX 創建以太網工程

前言
在前面一篇文章中,介紹瞭如何使用CubeMX來建立一個簡單的TCPEchoserver工程。但是在新建CubeMX項目時,是通過直接選擇ST的開發板的方式實現的。對於大多數實際的開發場景,可能並不是在ST的開發板上進行的,所以在這篇文章中,我將介紹如何從零開始建立一個以太網工程。
今年ST推出的Nucleo-144板子上集成了以太網接口,所以在本文中,將以STM32F746-Nucelo板爲例,通過CubeMXv4.18來新建一個TCPEchoserver的程序。
 
用CubeMX建立基於STM32F746-Nucleo的工程
用CubeMX進行初始化配置
這回我們直接選擇STM32F746-Nucleo板上對應的芯片STM32F746ZGT6U,而不是選擇STM32F746-Nucleo板。
1. 新建一個Project,在嚮導中選擇STM32F746ZGT6U。
 
這個時候我們看到的還是一個空的工程。如下圖:
 
2.外設使能,引腳配置
2.1以太網外設引腳配置
Nucleo-144板上用的PHY LAN8742A,RMII接口。在Cubemx中使能ETH外設,選擇RMII接口。Cubemx會自動配置對應的以太網接口。如下圖:
 
STM32的很多引腳都有複用功能,同一個功能也可以remap到不同的引腳。所以這裏要記得將CubeMX自動配置的引腳和實際電路中使用的引腳進行對比,保證是一致的。
從UM1974中可以找到Nucleo-144板上以太網引腳分配表。對比這張表格和CubeMX的默認配置,會發現PB11,PB12引腳在STM32F746-Nucleo板中沒有用做以太網的接口,而是用作其他用途了。
STM32F746-Nucleo上的引腳分配:
 
CubeMX的默認分配:
 
在Cubemx中修改引腳配置:
修改方法見下圖,用同樣的方法配置PG11和PG13。配置PG11和PG13後,對應PB11和PB12會自動清除之前的配置,以免衝突。
 
到現在位置,已經將所有的GPIO口都配置好了。
在Configuration頁面中,還可以看到所有配置的GPIO。並可以做進一步的配置,這裏就先用默認的設置。
 
2.2使能LwIP協議棧
在這個工程內,我們會用到LwIP協議棧,所以還需要在這一頁的Middlewares部分將LWIP勾選上。之後就可以在Configuration頁面對LWIP協議棧進行配置了。
 

3.時鐘配置
接下來進行時鐘配置。CubeMX默認系統時鐘16MHz,但以太網外設需要至少25MHz的系統時鐘,所以這裏會看到Clock Configuration頁面顯示  
打開Clock Configuration頁面會自動跳出一個提示框,可以選擇讓CubeMX來幫你自動調整時鐘配置,也可以自己手動進行調整。這裏,我選擇讓CubeMX自動配置,CubeMX會自動將時鐘配成216MHz。
 
4. 配置以太網參數

在Parameter Settings頁面,可以配置MAC地址,PHY的地址,是否進行自動協商等。
這裏,我們設置了MAC地址爲本地地址02 :00 :0 :00 :00 :00。LAN8742a的PHY地址由上電時PHYAD0的狀態決定。根據STM32F746-Nucleo板的原理圖,設置PHY地址爲0。
 
接收數據的模式有輪詢和中斷兩種方式,中斷方式需要和操作系統一起使用,這裏我們沒有使用任何操作系統,所以在RX Mode這一項只能選擇Polling Mode。
最後一項是”TX IP Header Checksum Computation”,STM32的MAC控制器可以在發送數據時自動添加IP數據報的checksum,如果需要這項功能,就將這一項設置爲“By hardware”
在Advanced Parameters頁,可以根據所用的PHY修改寄存器的地址和一些MASK的設置。因爲STM32F746的兩款開發板上用的都是PHY LAN8742A,所以CubeMX中默認的配置是以LAN8742A爲例進行設置的。所以這裏,我們不需要做任何修改就可以直接用。但如果是其他的PHY,可以在PHY這一項選擇“user PHY”,然後根據所用PHY的數據手冊,配置下面的參數,對於部分無法通過CubeMX進行配置的參數,需要手動的修改代碼。將有衝突的地方刪除,或者添加某個功能。
Advanced Parameters頁分爲三個部分:
· External PHY Configuration 。復位延時,讀/寫超時的參數設置
· Common :External PHY Configuration。PHY的基礎寄存器配置,這部分寄存器對於大部分PHY都是相同或類似的。
· Extended :External PHY Configuration。 PHY的擴展寄存器配置,這部分對於每個PHY都是不一樣的。如果是使用非CubeMX默認的PHY,這部分內容需要特別注意。
 
4. 修改LWIP的參數
配置好以太網的參數後,點擊OK,回到CubeMX的配置界面。選擇LWIP繼續進行參數配置。
 
首先是GeneralSettings頁面,在這裏我們可以看到LWIP的版本號。配置IP地址信息,可以選擇通過DHCP的方式動態分配IP,也可以分配一個靜態的IP地址。這裏,我們選擇配置靜態的IP地址192.168.0.10,子網掩碼255.255.255.0,網關192.168.0.1。ICMP協議打開,因爲我們用的是TCP協議,所以把UDP協議關掉。
不用擔心不知道每項參數是做什麼用的,選擇每一項參數後都會在窗口的底部顯示該項參數的解釋。
 
在Key Options這一頁裏,有更多的參數可以配置。關於接收/發送內存的配置也是在這裏。選擇右上方的“Show Advanced Parameters”後,還有更多的參數配置項。這裏,我們也可以不做修改,使用默認值。CubeMX中每個參數項的名稱和代碼中的名稱相同,這樣也方便了在代碼中進行查找。
 
到此爲止,我們在CubeMX中需要做的配置就全部完成了。選擇Project——>Generate Code,生成初始的工程。

添加用戶代碼
用IAR打開前面已經生成好的工程。我們還需要兩步就可以完成一個簡單的TCP EchoServer程序了。
1.新建tcp_echoserver.c文件,在tcp_echoserver.c裏要做下面這幾件事情:
1)新建一個tcp_echoserver_pcb(調用tcp_new函數);
2)將新建的tcp_echoserver_pcb與要監聽的端口綁定(調用tcp_bind函數)
3)轉成監聽狀態(調用tcp_listen函數)
4)註冊回調函數tcp_echoserver_accept,當有新連接建立後會調用該函數(調用tcp_accept函數)
5)註冊回調函數tcp_echoserver_recv,當該連接接收到數據後會調用該函數(調用tcp_recv函數)
6)完成tcp_echoserver_recv函數,在該函數內,將收到的數據再發出去。
需要注意,本文的目的是示例如何用CubeMX建立一個簡單的TCP EchoServer程序,所以考慮的都是最基本簡單的情況。比如,在回發數據部分,我們假設Client發來的數據都在一個Pbuf的大小以內。
完成tcp_echoserver.c後,將其加入到工程項目中。

2. 在main函數中添加tcp_echoserver_init(),在while(1)中添加MX_LWIP_Process()查詢接收數據。記得要將代碼加在/*USER CODE BEGIN*/和/*USER CODE END*/之間,這樣纔不會在下次用CubeMX生成代碼時被覆蓋掉。
 
一個簡單的TCP Echoserver程序就完成了。

測試結果
我們來看一看ping測試和TCP測試工具的結果
1. 通過電腦(192.168.0.11)ping STM32F746-Nucleo板(192.168.0.10)
 
2.通過TCP測試工具模擬客戶端,向STM32F746-Nucleo板發一串數據。
 



測試結果說明我們剛剛建立的TCP EchoServer程序已經能正常工作了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章