經過一個月的時間,初步能夠建立一個簡單的UDP服務器。所用芯片為STM32F107,板上自帶MAC,需要自帶PHY ,所用PHY為dp83848 。前面沒有用到官方庫, 程序思路 ,首先為時鐘的初始化,STM32主要有四個時鐘,內部高速時鐘,外部高速時鐘,內部低速時鐘,外部低速時鐘,通過對其倍頻,分頻給各個模塊提供時鐘信號,內部主要有PLL時鐘,AHB時鐘,APB1,APB2時鐘,SYSCLK時鐘,APB1最大時鐘只有36MHZ,APB2可以72MHZ為STM32F107 所用I/O的初始化,管腳復用初始化,然后時鐘使能。在這所遇到的問題主要是STM32F107有些寄存器的復位值居然不是從零開始.以太網MAC協議主要有RMII 和MII模式,兩者的區別主要在于管腳和MCO 時鐘頻率的區別。MCO時鐘在RMII需要50MHZ,在這里通過PLL3 10倍頻獲得,因為在時鐘初始化之后PLL3的頻率為5MHZ,在MII模式下 如果外部時鐘用25MHZ可以直接為MCO輸出25MHZ,提供時鐘源。對DP83848的寄存器進行操作 主要通過SMI接口操作,SMI接口有兩跟線分別為MDC和MDIO MDC的時鐘源根據AHB總線的時鐘源分頻所得。然后ETH的寄存器初始化發送DMA寄存器初始化 ,ETH接受中斷使能,DMA中斷使能。。。。這里比較難理解 ,而且寄存器很難配置。我直接用官方的程序了。接下來就是移植LWIP 協議棧了。
LWIP 協議棧在裸機跑的時候,主要 包括 CC.H 中的數據類型定義 大小端定義(根據編譯器和處理器特性)臨界代碼的保護 lwipopts.h 對協議棧內核的參數配置 默認的在OPT.H中, 最后就是對etnernetif.C中的計個函數的編寫。low-level-init 主要為網卡的初始化和網絡接口的初始化low-level-input 從網卡中得到一個數據包然后上傳到協議棧里中,low-level-output 把內核中的PBUF所描述的數據發出去。
這樣 在主函數中加上 LWIP 初始化,主要是網絡接口 IP .MAC 初始化, 通過STM32的滴答計時器 定個基準時間 然后加上TCP定時處理函數和ARP定時處理函數就能簡單的PING 通了。 PING 大包 ping不通 通過抓包軟件看見 STM32 回應ICMP包 可是為什么PING 不通呢,主要原因在于STM32有硬件校驗和功能 在發送字節大于一個以太網幀的時候,IP層為分片發送 而硬件校驗和 自動加上校驗和導致 校驗和錯誤 PC機端認為是錯誤的數據直接丟棄了。現在只能關閉硬件校驗和功能,其他方法還沒想到。
|