【STM32+cubemx】0021 HAL库开发:EN28J60芯片移植uIP以太网协议栈
上一節我們學習了使用ENC28J60芯片來實現簡單的以太網通信,使用的是一個極其簡陋的網絡協議棧,這個協議棧的功能是很不完善的,只能用作演示驗證。
想要用到產品上,要使用相對成熟的協議棧。本節我們就以uIP以太網協議棧為例,來學習如何移植它到ENC28J60的平臺上。
UIP是一種適用于小型嵌入式通信的TCP/IP協議棧,由瑞典計算機科學院的人開發編寫的,它去掉了完整的TCP/IP中不常用的功能,簡化了通訊過程,但其保留了網絡通信中必須使用的協議,把設計重點放在IP、TCP和ARP協議的實現上。簡單易用、占用資源少是它的設計特點,雖然簡化過后必然有一些不完善的地方,但是用在某些簡單的網絡環境中還是很實用的。
本節的例子使用的開發環境是cubemx 6.1.0,pack版本是1.8.0;硬件使用的是stm32f103VET6和ENC28J60;軟件方面,uIP協議棧使用的是1.0版。
1)cubemx工程配置
與上一節的配置內容是完全一樣的,先看一下硬件連接圖:
ENC28J60這個芯片可實現10M的以太網通信,與MCU是使用SPI接口,接在SPI1口上,使用軟件控制CS線,另外還連接了RST復位引腳、INT中斷引腳。
配置SPI接口時,如下圖:
選擇全雙工,配置為速率為不大于20M(因為ENC28J60的SPI接口時鐘最大20M)
配置GPIO,PB7為輸出CS、PE1為輸出RST、PA6為輸入INT:
把堆棧設置大一些,因為后面在代碼中會申請比較大的變量:
到這里,cubemx里的設置就已經完成了,現在可以生成keil的代碼工程了。
2)keil中的代碼編寫
打開生成的keil工程,添加一些代碼源文件:
(可在文末關注公眾號獲取完整代碼)
先打開uip的源碼文件夾,將unix文件夾重命名為stm32,然后將整個uIP源碼的文件夾拷貝到src目錄下,并添加我們需要的幾個文件:
圖中的enc28j60和spi_enc28j60兩個文件里是操作enc28j60的底層函數,需要和硬件匹配,這里與上一節實現的內容完全一致,就不多解釋了。
其他幾個文件就是我們移植uIP需要的幾個基本的文件了(uIP代碼包里的其他文件可以不添加)。
移植uIP主要有以下幾步:
a)實現tapdev.c中的初始化和讀寫函數;
主要代碼如下:
tapdev_init是初始化函數,主要完成了enc28j60寄存器配置、設置MAC地址的工作;
讀、寫函數直接調用的是之前實現的enc28j60讀寫函數;
這里注意一下,uIP的接收和發送,都是通過一個全局的uip_buf來存放數據的,uip_len存放的是接收和發送的數據長度;因為緩沖區只有一個,所以,uIP在有數據時需要盡快處理,否則會被后面的數據覆蓋。
b)修改uIP的時鐘tick函數
先修改clock-arch.c中的函數如下:
這個函數是用于獲取計時tick數,所以我們定義的這個變量UIP_Ticks,需要放到定時器中斷中去更新,本文把它放在sys_tick里,所以修改stm32f1xx_it.c中的中斷服務函數SysTick_Handler如下:
由于SysTick_Handler函數是每1ms中斷一次,所以我們還需要確認一下clock-arch.h中的CLOCK_CONF_SECOND宏定義;因為每1000ms為1s,所以這里的定義是正確的;如果用的定時器中斷不是1ms,則需要修改這個宏定義的值,使得CLOCK_CONF_SECOND個tick為1s:
c)編寫測試函數
在main.c函數中,while(1)前添加初始化相關的函數:
先復位enc28j60,配置enc28j60和MAC地址,再調用uip_init()初始化uIP,最后設置IP地址。
在while(1)循環中,調用uip_loop()函數,這個函數是仿照unix目錄下main.c函數編寫的,可以說uIP全部的處理功能都是在這個函數里調度的,實現如下:
這部分主要是,在第一次進入時設置兩個定時器,用于刷新tcp網絡連接和arp表用的;然后去檢測有無數據收到,收到則進入if(uip_len > 0)之中進行處理,實時處理了IP包、arp包等等;后面的else if中調用的timer_expired函數是定時處理函數,兩個定時分別是0.5s時處理一下TCP和UDP包、10s時更新一下arp表:
主要的測試函數就實現完了。
3)運行測試程序
將代碼編譯、下載到開發板運行,開發板通過網線連接到計算機。
計算機端設置IP地址為192.168.1.18(只要和開發板的ip地址192.168.1.15在一個網段就行)。
測試網絡是否連通:
在終端上輸入ping 192.168.1.15:
可以看到ping有回復,說明網絡已經通了,移植成功了。
限于篇幅,本篇就只講uIP的移植過程,下一節再利用這個移植好的工程來實現uIP的UDP和TCP的通信。
歡迎關注我的公眾號,可留言“資料”獲取相關源碼和資料,包括本文工程文件、uIP-1.0官方源碼。
總結
以上是生活随笔為你收集整理的【STM32+cubemx】0021 HAL库开发:EN28J60芯片移植uIP以太网协议栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElasticSearch 课程笔记 1
- 下一篇: java的插入排序