日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32+cubemx】0021 HAL库开发:EN28J60芯片移植uIP以太网协议栈

發布時間:2023/12/20 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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以太网协议栈的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。