STM32F7-Discovery資源豐富、外設(shè)眾多,除了最顯眼的那個(gè)觸摸屏外,估計(jì)關(guān)注比較多的就是網(wǎng)絡(luò)的功能了。網(wǎng)上有一些例程都是HTTP、FTP、Telnet的,卻沒有最基本的TCP的例子(也許我沒找到),所以用了一上午的時(shí)間來嘗試一下TCP的用法。TCPIP協(xié)議棧很復(fù)雜,我不會浪費(fèi)時(shí)間去深究這些東西,因?yàn)楫吘棺龅氖菓?yīng)用層的程序,經(jīng)過MDK的封裝,已經(jīng)完全可以拋開具體的協(xié)議部分,只調(diào)用接口即可完成通訊。
又提到了MDK的中間件的封裝,有了這個(gè)東西減少了我們很多很多工作,只需要鼠標(biāo)指指點(diǎn)點(diǎn)就可以完成眾多的配置選項(xiàng),所以我沒有理由去拒絕使用它,除非你反感MDK,那當(dāng)我沒說。
閑話少敘進(jìn)入正題,首先建立一個(gè)STM32F7的工程。建立的過程不再重復(fù),如果真的不會,請參考《 【STM32F7】STM32F7開發(fā)篇-超詳細(xì)操作步驟》進(jìn)行操作。
下面開始勾選各種支持庫,也是MDK最大的特色。本來不想再抓圖了,無奈靠文字描述估計(jì)寫這個(gè)帖子會累死,所以還是湊合看圖吧。
打開配置界面,F(xiàn)7的配置項(xiàng)比以往的多了很多很多,不過很清晰,一個(gè)一個(gè)來看。
***********************************************************************************************
板級支持(Board Support),專門針對某種板子提供的驅(qū)動。為了可以在任意的STM32F7開發(fā)板上使用,這項(xiàng)選不選隨意。
1.CMSIS部分,操作系統(tǒng)相關(guān),有了系統(tǒng)好辦事,而且包括了網(wǎng)絡(luò)硬件的驅(qū)動,所以此項(xiàng)必選。
CORE是核心部分,不能少
Keil RTX是操作系統(tǒng),可以開線程
Ethernet MAC是MAC驅(qū)動
LAN8742A是STM32F7-Discovery的物理收發(fā)器驅(qū)動
2.STM32F7的硬件層驅(qū)動部分,可以選擇Classic,也可以用STM32CubeMX。如果選了STM32CubeMX,就要使用這個(gè)軟件來生成配置代碼再放到MDK里。Classic足夠了,是MDK自帶的。
其中Startup必選,這個(gè)是啟動文件
其他的,如Common、Cortex都需要選上。這個(gè)圖不全,下面還有PWR、RCC都需要選上。當(dāng)然多選了沒有關(guān)系,少選的話這個(gè)配置窗體會實(shí)時(shí)顯示依賴關(guān)系,依賴項(xiàng)沒有選上會用橘黃色標(biāo)識,提示應(yīng)該選擇。
3.最后一部分,網(wǎng)絡(luò)庫的支持。這里就是封裝好的網(wǎng)絡(luò)相關(guān)的中間件了,省去了寫代碼、調(diào)試的工作。
CORE必選,ETH別忘了至少加一個(gè)網(wǎng)絡(luò)接口,TCP、UDP也要選上。即使不用UDP,不選的話編譯時(shí)會報(bào)錯(cuò)。
在Service中,提供了HTTP、FTP、Telnet等支持包,這里沒有用上,所以沒選。如果開發(fā)相關(guān)程序,可以自行選擇。
************************************************************************************************
中間件選擇完了,會在工程中添加許多對應(yīng)的文件。展開工程樹,所有帶有黃鑰匙的文件都是不需要更改的,所以略過不看,只看各種配置文件。
1.RTX_Conf_CM.c,操作系統(tǒng)相關(guān)的配置。雙擊該文件后代碼在右邊顯示,但是直接看代碼可沒那么好看,所以用MDK提供的功能:Configuration Wizard配置精靈就方便多了。
這里面改動的不多,主要是“RTOS Kernel Timer input clock frequency”,STM32F7是216MHz,改成216000000,216后面6個(gè)0,別寫錯(cuò)了。
另外“Defualt Thread stack size”和“Main Thread stack size”要改大一些,400和800。普通小程序無所謂用默認(rèn)的就行了,但是一旦用了某些協(xié)議棧或圖形界面之類的,默認(rèn)的就不夠了,如果不改會在運(yùn)行時(shí)進(jìn)入osError,然后就完蛋了。
2.RTE_Device.h,這是STM32F7需要使用的外設(shè)的使能和引腳配置。這個(gè)工程只操作網(wǎng)絡(luò),所以其他的都沒有勾選。
選擇之前應(yīng)該看看數(shù)據(jù)手冊,不要選錯(cuò)了,或者從STM32CubeMX里看也可以,不需要深究,選對即可。
3.Net_Config_ETH_0.h,這個(gè)就是剛才添加的那個(gè)ETH接口了。這個(gè)配置就簡單多了,都是常用的,也就是地址、網(wǎng)關(guān)、DNS什么的,最下面的“Dynmic Host Configuration”是控制自動獲取網(wǎng)絡(luò)還是使用配置項(xiàng)的,隨意吧。至于“MAC Address”,有默認(rèn)值了,但是為了便于在眾多的連接中區(qū)分,所以我改成了0x1234567890,一會兒就能看到。
4.Net_Config.c,最后一個(gè)了,也是最簡單的一個(gè)!癓ocal Host Name”就是用于顯示的主機(jī)名。更改后編譯燒寫到板子中,已經(jīng)可以正常聯(lián)網(wǎng)了,因?yàn)锳RP的功能包括在里面了,跟路由通訊是正常的。打開路由的界面,板子的名字、IP、MAC顯示出來,連接正確。
************************************************************************************************
所有的配置項(xiàng)完成,接下來該寫程序了。大部分功能已經(jīng)完成,代碼量相對少了很多,節(jié)省了不少時(shí)間。
系統(tǒng)時(shí)鐘配置,可以使用各種工具自動生成代碼拷過來,自己寫的話就麻煩多了,我才不會去寫。
MPU設(shè)置和Cache設(shè)置。MPU也就是內(nèi)存保護(hù)單元,設(shè)置起始地址、長度、讀寫權(quán)限以及緩存等,然后再打開I-Cache、D-Cache,用于提高性能。
程序入口點(diǎn),這里我開了個(gè)主線程,沒什么用,習(xí)慣罷了。while里要調(diào)用net_main函數(shù),用于處理網(wǎng)絡(luò)的各種事件,具體的執(zhí)行內(nèi)容可以參考手冊。MDK提供的中間件沒有開放源碼,所以怎樣實(shí)現(xiàn)的是看不到的,不過可以看看lwip的源碼,大同小異。
真正自己的代碼來了,就這么一點(diǎn)點(diǎn),還包括了接口函數(shù)在內(nèi)。
首先執(zhí)行的是net_initialize,初始化函數(shù),只要執(zhí)行一次就行了,這個(gè)必須在所有操作前調(diào)用一次。
然后就是Listen了,首先get一個(gè)socket,其實(shí)就是綁定過程,然后再按照指定的端口監(jiān)聽。監(jiān)聽過程中的事件都在回調(diào)函數(shù)里處理。
回調(diào)函數(shù),處理Client的連接、斷開、數(shù)據(jù)傳輸?shù)仁录粋(gè)switch解決。
發(fā)送數(shù)據(jù),我又創(chuàng)建了一個(gè)線程,不過單純是為了代碼好寫,可以精確定時(shí)、而且方便啟動停止,代碼量最少,否則還要再去配置SysTick,太麻煩了。
整個(gè)代碼的作用就是監(jiān)聽端口,當(dāng)有Client連接進(jìn)來后,每秒發(fā)送一次字符串“abcdern”,沒了。
看效果,功能實(shí)現(xiàn)。沒有加上各種容錯(cuò)機(jī)制,畢竟只是為了實(shí)現(xiàn)功能,不是做產(chǎn)品。
全文完。發(fā)現(xiàn)寫帖子的時(shí)間和寫代碼的時(shí)間差不多,一天就過去了,我暈。
STM32F7_TCP.rar
(54.26 KB, 下載次數(shù): 36)
2016-6-17 16:37 上傳
點(diǎn)擊文件名下載附件
|