stm32f407以太網(wǎng)及USB OTG快速開發(fā)
引言
想要快速完成網(wǎng)絡(luò)協(xié)議棧和USB OTG功能,使用ST自家的工具STM32CubMx再好不過的了。如果你還不會(huì)使用,別著急下面我會(huì)一步一步的用圖片告訴你如何做。
軟件平臺(tái):windows、STM32CubMx、keil v5
硬件平臺(tái):原子的stm32f407ZGT6開發(fā)板,
STM32CubMx配置1、以太網(wǎng)管腳的映射配置第一:閱讀原理圖,使用STM32CubMx完成配置,原理圖這里不說明。直接到STM32CubMx配置。
(1)、打開STM32CubMx軟件,選擇New Project,在彈出的菜單選擇,選擇對應(yīng)的芯片,點(diǎn)擊OK即可。如下圖:
(2) 設(shè)置clock,板子使用的是8MHz的晶振,軟件對應(yīng)的是Peripheral –>RCC。如下圖:
(3)根據(jù)原理圖配置以太網(wǎng),選擇的是RMII接口,注意由于有管腳的復(fù)用,所有選擇RMII后,軟件自動(dòng)的軟件不一定和原理的對應(yīng)上,我們應(yīng)該按照原理圖來配置管腳!對應(yīng)上的就不用更改,不對應(yīng)上就必須更改。如下圖:
、
原圖上的以太網(wǎng)PHY芯片管腳連接圖是RMII接口,如下圖所示:
相應(yīng)的管腳,軟件對應(yīng)管腳配置
RMII_REF_CLK 、ETH_MDIO、RMII_CRS_DV、ETH_RESET、RMII_TX_EN、RMII_TXD0、RMII_TXD1這些管腳對應(yīng)的位置以及軟件上的配置,如下圖:
經(jīng)過上述配置以太網(wǎng)的管腳基本上映射好了。修改管腳配置,方法:點(diǎn)擊某個(gè)關(guān)鍵在彈出的功能菜單選中對應(yīng)的功能即可!
2、USB OTG管腳映射OTG配置!使用FS做OTG,因?yàn)樵韴D上面用的是FS。
管腳使用默認(rèn)的管腳無需更改。
管腳使用默認(rèn)的管腳無需更改。
(1) 第三方庫的配置主要是文件系統(tǒng)(USB OTG需要)、網(wǎng)絡(luò)協(xié)議棧(以太網(wǎng)需要)、RT OS(選配本次使用OS方便后面的以太網(wǎng)和USB OTG任務(wù)的調(diào)度)。
如下:由于選了OS,而OS的滴答基于Systick來運(yùn)作的,所以我們得另外選擇定時(shí)器用來做軟件的tcik的這里選這TIM1。如下圖所示:
配置sys tick,系統(tǒng)記時(shí),單位是ms
第三方庫的選配:
文件系統(tǒng)選擇USB Disk USB硬盤設(shè)備
使能freeOS(嵌入式實(shí)時(shí)操作系統(tǒng))、LWIP(TCP/IP協(xié)議棧)
系統(tǒng)時(shí)鐘的配置,Clock configuration選項(xiàng)卡里設(shè)置,如下配置:使用168MHz的時(shí)鐘,USB時(shí)鐘必須是48MHz。具體配置如下:
功能的配置 Configuration選項(xiàng)卡里面設(shè)置,為了方便網(wǎng)頁的開發(fā),我這里配置LWIP的httpd功能,GPIO設(shè)置輸出設(shè)置為High。如下圖:
總體細(xì)節(jié)框架如下:
生成代碼框架步驟:
生成代碼框架,菜單project->setting設(shè)置編譯平臺(tái)和目錄,Generator code生成代碼框架!
1、進(jìn)入到軟件的及代碼平臺(tái)的編寫!
由于按照上面的步驟生成的代碼基本上是可以用的,但是該代碼基于的是LAN8742A芯片配置的PHY,原理圖上用的是LAN8720,注意PHY芯片基本都上都一樣的主芯片和PHY通信是通過MDIO接口來通信的,這個(gè)是標(biāo)準(zhǔn)化的,所以框架程序里面也是這樣子的,這些基本不用改,而且PHY是IEEE802.3中定義的一個(gè)標(biāo)準(zhǔn)模塊,PHY芯片的寄存器地址0-31地址具體功能IEEE802.3也是規(guī)范化標(biāo)準(zhǔn)了的,所以移植的時(shí)候就很方便了,不同的是PHY復(fù)位時(shí)間和PHY芯片地址,關(guān)于地址LAN8720有如下描述:
The PHYAD0 bit is driven high or low togive each PHY a unique address.
PHYAD 0 bit設(shè)置為1或者0以給PHY一個(gè)唯一的地址,就是LAN7820A的地址。Thisaddress is latched into aninternal register at the end of a hardware reset (default = 0b). PHY芯片硬件復(fù)位后地址被鎖在內(nèi)部寄存器。
In a multi-PHY application (such as a repeater), the controller isable to manage each PHY via the unique address. 多PHY芯片應(yīng)用場景(例如一個(gè)中繼器),控制器能夠通過這個(gè)唯一的地址管理每隔PHY芯片。
Each PHY checks eachmanagement data frame for a matching address in the relevant bits. 每隔PHY芯片檢查檢查每個(gè)管理數(shù)據(jù)幀的相關(guān)位來匹配這個(gè)地址。
When a match is recognized, the PHYresponds to that particular frame. 當(dāng)一個(gè)匹配被檢查到,PHY響應(yīng)一個(gè)特殊的幀。
The PHY address is also used to seed the scrambler.PHY.地址也用于種子的擾碼
In a multi-PHYapplication, this ensures that the scramblers are out of synchronization and dispersesthe electromagneticradiation across the frequency spectrum.
根據(jù)上面的說法我們這里L(fēng)AN7820的地址應(yīng)該是0,所以找到LAN8742A_PHY_ADDRESS這個(gè)定義改為0即可。
位置:Stm32f4xx_hal_conf.h
復(fù)位時(shí)間
修改自己的IP,注意該框架是默認(rèn)打開DHCP的,DHCP功能,設(shè)備能在網(wǎng)內(nèi)能請求DHCP服器來動(dòng)態(tài)的配置設(shè)備的IP,我們這里要設(shè)置為固定iP,所以禁用DHCP!如下:
頭文件:lwipopts.h
lwip.c文件修改
固定IP修改,為了方便使用,我這定義一個(gè)聯(lián)合體類型來存儲(chǔ)IP地址,如下圖:
修改HAL_ETH_Init函數(shù),添加硬復(fù)位如下:
經(jīng)過這樣子就修改就可以完成了!只用主機(jī)能ping通,注意打印口映射代碼沒寫出來,這個(gè)很簡單,百度一下就有。具體實(shí)驗(yàn)圖如下:
使用正點(diǎn)原子的串口工具,必須用它的。注意要打開一些調(diào)試信息就可以看到了這些打印信息了。
USB OTG 則直接可以用,答應(yīng)USB監(jiān)聽狀態(tài),實(shí)驗(yàn)效果圖如下:
USB測試結(jié)果插入U(xiǎn)SB,主機(jī)檢測到了USB連接上了,可以調(diào)用mount然后fopen函數(shù)來正常的讀取文件了,到此基本完成!
總結(jié)1、完成了LWIP和USB的功能,剩下就是網(wǎng)絡(luò)通信,這些都是應(yīng)用程序了,相對來說簡單。網(wǎng)絡(luò)通信無非就是SOCKET、以及USB就是fopen函數(shù)的調(diào)用write和read函數(shù)等。
2、關(guān)于打印口看到了httpd_init,那是因?yàn)槲姨砑恿司W(wǎng)頁設(shè)計(jì),通過網(wǎng)頁可以修改IP等。
3、使用STM的STM32CubMx軟件快速開發(fā)出你想要的框架,底層配置大多數(shù)可以不用自己的手工的去計(jì)算,比如時(shí)鐘,如果通過自己的計(jì)算來給各個(gè)總線來分配時(shí)鐘源那會(huì)相當(dāng)麻煩,從做STM32F103的時(shí)候就深有體會(huì)。如果還不會(huì)這個(gè)軟件的,建議還是得學(xué)會(huì),因?yàn)樗梢詭臀覀兒艽蟮拿?。作為從事STM32和linux開發(fā)的我來說,省去一大部分的時(shí)間了。