STM32 之網口資源

1 網口資源介紹

STM32F407 是 STMicroelectronics 推出的高性能 ARM Cortex-M4 微控制器,具備多種外設接口,其中包括一個 Ethernet MAC 控制器(帶 IEEE 1588 支持)。這意味著你可以使用 STM32F407 實現網絡通信功能(通過網口,即以太網口)。

1.1 STM32F407 的以太網特性

MAC 層支持:集成的以太網 MAC(ENET),支持 10/100 Mbps 全雙工/半雙工通信。

需要外部 PHY 芯片:STM32F407 只提供 MAC 控制器,需要通過 RMII 或 MII 接口 連接外部 PHY 芯片(如 LAN8720、DP83848 等)來實現物理層通信。

支持 DMA:支持以太網 DMA,提高數據吞吐效率。

支持 LWIP 協議棧:可以使用 LWIP(輕量級 IP 協議棧)來實現 TCP/IP 協議通信。

1.2 連接方式

硬件連接

PHY 芯片(如 LAN8720):通過 RMII 接口與 STM32F407 連接。

晶振要求:通常 PHY 需要 50MHz 時鐘,STM32F407 可通過 MCO 輸出時鐘。

RJ45 接口:連接外部網絡,部分模塊集成了變壓器和 PHY。

接口引腳(RMII 模式),常用引腳如下:

在這里插入圖片描述
對應電路圖

在這里插入圖片描述

1.3 常見應用

  1. TCP/UDP 通信

  2. 遠程控制設備

  3. 嵌入式 Web 服務器(通過 LWIP + HTTPD)

  4. Modbus-TCP、MQTT 等協議實現

2 代碼初始化流程

2.1 配置 GPIO 引腳

使用 GPIO_InitTypeDef,設置 RMII 所需引腳為 復用功能 + 高速 + 無上下拉。

void ETH_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/* Enable GPIOs clocks */RCC_AHB1PeriphClockCmd(ETH_MDIO_GPIO_CLK            | ETH_MDC_GPIO_CLK          |ETH_RMII_REF_CLK_GPIO_CLK    | ETH_RMII_CRS_DV_GPIO_CLK  |ETH_RMII_RXD0_GPIO_CLK       | ETH_RMII_RXD1_GPIO_CLK    |ETH_RMII_TX_EN_GPIO_CLK      | ETH_RMII_TXD0_GPIO_CLK    |ETH_RMII_TXD1_GPIO_CLK       | ETH_NRST_GPIO_CLK         , ENABLE);/* Enable SYSCFG clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  /* MII/RMII Media interface selection --------------------------------------*/
#ifdef MII_MODE /* Mode MII with STM324xx-EVAL  */#ifdef PHY_CLOCK_MCO/* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);#endif /* PHY_CLOCK_MCO */SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#elif defined RMII_MODE  /* Mode RMII with STM324xx-EVAL */SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#endif/* Ethernet pins configuration ************************************************//*ETH_MDIO -------------------------> PA2ETH_MDC --------------------------> PC1ETH_MII_RX_CLK/ETH_RMII_REF_CLK---> PA1ETH_MII_RX_DV/ETH_RMII_CRS_DV ----> PA7ETH_MII_RXD0/ETH_RMII_RXD0 -------> PC4ETH_MII_RXD1/ETH_RMII_RXD1 -------> PC5ETH_MII_TX_EN/ETH_RMII_TX_EN -----> PB11ETH_MII_TXD0/ETH_RMII_TXD0 -------> PG13ETH_MII_TXD1/ETH_RMII_TXD1 -------> PG14ETH_NRST -------------------------> PI1*/GPIO_InitStructure.GPIO_Pin = ETH_NRST_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;  GPIO_Init(ETH_NRST_PORT, &GPIO_InitStructure);ETH_NRST_PIN_LOW();_eth_delay_(LAN8720A_RESET_DELAY);ETH_NRST_PIN_HIGH();_eth_delay_(LAN8720A_RESET_DELAY);/* Configure ETH_MDIO */GPIO_InitStructure.GPIO_Pin = ETH_MDIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(ETH_MDIO_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_MDIO_PORT, ETH_MDIO_SOURCE, ETH_MDIO_AF);/* Configure ETH_MDC */GPIO_InitStructure.GPIO_Pin = ETH_MDC_PIN;GPIO_Init(ETH_MDC_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_MDC_PORT, ETH_MDC_SOURCE, ETH_MDC_AF);/* Configure ETH_RMII_REF_CLK */GPIO_InitStructure.GPIO_Pin = ETH_RMII_REF_CLK_PIN;GPIO_Init(ETH_RMII_REF_CLK_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_REF_CLK_PORT, ETH_RMII_REF_CLK_SOURCE, ETH_RMII_REF_CLK_AF);/* Configure ETH_RMII_CRS_DV */GPIO_InitStructure.GPIO_Pin = ETH_RMII_CRS_DV_PIN;GPIO_Init(ETH_RMII_CRS_DV_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_CRS_DV_PORT, ETH_RMII_CRS_DV_SOURCE, ETH_RMII_CRS_DV_AF);/* Configure ETH_RMII_RXD0 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_RXD0_PIN;GPIO_Init(ETH_RMII_RXD0_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_RXD0_PORT, ETH_RMII_RXD0_SOURCE, ETH_RMII_RXD0_AF);/* Configure ETH_RMII_RXD1 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_RXD1_PIN;GPIO_Init(ETH_RMII_RXD1_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_RXD1_PORT, ETH_RMII_RXD1_SOURCE, ETH_RMII_RXD1_AF);/* Configure ETH_RMII_TX_EN */GPIO_InitStructure.GPIO_Pin = ETH_RMII_TX_EN_PIN;GPIO_Init(ETH_RMII_TX_EN_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_TX_EN_PORT, ETH_RMII_TX_EN_SOURCE, ETH_RMII_TX_EN_AF);/* Configure ETH_RMII_TXD0 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_TXD0_PIN;GPIO_Init(ETH_RMII_TXD0_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_TXD0_PORT, ETH_RMII_TXD0_SOURCE, ETH_RMII_TXD0_AF);/* Configure ETH_RMII_TXD1 */GPIO_InitStructure.GPIO_Pin = ETH_RMII_TXD1_PIN;GPIO_Init(ETH_RMII_TXD1_PORT, &GPIO_InitStructure);GPIO_PinAFConfig(ETH_RMII_TXD1_PORT, ETH_RMII_TXD1_SOURCE, ETH_RMII_TXD1_AF);	
}

2.2 MAC 寄存器配置

static void ETH_MACDMA_Config(void)
{/* Enable ETHERNET clock  */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);/* Reset ETHERNET on AHB Bus */ETH_DeInit();/* Software reset */ETH_SoftwareReset();/* Wait for software reset */while (ETH_GetSoftwareResetStatus() == SET);/* ETHERNET Configuration --------------------------------------------------*//* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ETH_StructInit(&ETH_InitStructure);/* Fill ETH_InitStructure parametrs *//*------------------------   MAC   -----------------------------------*//* 開啟網絡自適應功能 */ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
//  ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; 
//  ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
//  ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;   /* 關閉反饋 */ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;/* 關閉重傳功能 */ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;/* 關閉自動去除PDA/CRC功能  */ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;/* 關閉接收所有的幀 */ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;/* 允許接收所有廣播幀 */ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;/* 關閉混合模式的地址過濾  */ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;/* 對于組播地址使用完美地址過濾    */ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;/* 對單播地址使用完美地址過濾  */ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
#ifdef CHECKSUM_BY_HARDWARE/* 開啟ipv4和TCP/UDP/ICMP的幀校驗和卸載   */ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
#endif/*------------------------   DMA   -----------------------------------*/  /* When we use the Checksum offload feature, we need to enable the Store and Forward mode:the store and forward guarantee that a whole frame is stored in the FIFO, so the MAC can insert/verify the checksum, if the checksum is OK the DMA can handle the frame otherwise the frame is dropped *//*當我們使用幀校驗和卸載功能的時候,一定要使能存儲轉發模式,存儲轉發模式中要保證整個幀存儲在FIFO中,這樣MAC能插入/識別出幀校驗值,當真校驗正確的時候DMA就可以處理幀,否則就丟棄掉該幀*//* 開啟丟棄TCP/IP錯誤幀 */ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;/* 開啟接收數據的存儲轉發模式  */ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;/* 開啟發送數據的存儲轉發模式   */ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;/* 禁止轉發錯誤幀 */ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;/* 不轉發過小的好幀 */ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;/* 打開處理第二幀功能 */ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;/* 開啟DMA傳輸的地址對齊功能 */ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;/* 開啟固定突發功能 */ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;/* DMA發送的最大突發長度為32個節拍 */ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;/*DMA接收的最大突發長度為32個節拍 */ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;/* Configure Ethernet *//* 配置ETH */EthStatus = ETH_Init(&ETH_InitStructure, ETHERNET_PHY_ADDRESS);
}

3 加載tcp/ip協議棧

3.1 初始化 LWIP 協議棧 (lwip/init.c)

3.2 配置 IP 地址、MAC 地址

3.3 通過 ethernetif.c 與 HAL 底層對接

3.4 在主循環中調用 sys_check_timeouts(),維護超時機制

4 簡單主函數框架

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906138.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906138.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906138.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Almalinux中出現ens33 ethernet 未托管 -- lo loopback 未托管 --如何處理:

解決 AlmaLinux 中網絡接口 ens33 和 lo 顯示為“未托管”的問題 當 AlmaLinux 系統中的網絡接口(如 ens33 和 lo)顯示為“未托管”時,這意味著這些接口沒有被 NetworkManager 正常管理。以下是詳細的分析和解決方案: 1. 檢查 N…

數據庫中關于查詢選課問題的解法

前言 今天上午起來復習了老師上課講的選課問題。我總結了三個解法以及一點注意事項。 選課問題介紹 簡單來說就是查詢某某同學沒有選或者選了什么課。然后查詢出該同學的姓名,學號,課程號,課程名之類的。 sql文件我上傳了。大家可以嘗試練…

Qt圖表庫推薦指南與分析

目錄 一、核心圖表庫橫向對比1. Qt Charts2. QCustomPlot3. QWT (Qt Widgets for Technical Applications)4. KD Chart 二、性能與功能對比矩陣三、選型策略與組合方案1. 通用型需求:2. 技術型場景:3. 企業級開發: 四、未來趨勢與避坑指南1. …

LangGraph 2 - 智能體開發、流式傳輸、模型調用、工具、MCP、上下文、內存、人機協同、部署、UI

文章目錄 使用LangGraph進行智能體開發什么是智能體?核心特性高層構建模塊包生態系統 運行代理基礎用法輸入與輸出輸入格式使用自定義 Agent 狀態 輸出格式流式輸出最大迭代次數其他資源 流式傳輸代理進度監控LLM 令牌工具更新流式多模態傳輸禁用流式傳輸其他資源 L…

Android同屏采集并推送RTMP和啟動輕量級RTSP服務技術實踐

隨著視頻直播需求的不斷提升,如何實現高效的實時視頻采集和推流,成為了開發者們關注的重點。本文將結合大牛直播SDK,介紹如何在 Android 平臺實現 同屏采集、推送 RTMP 流,以及如何啟動輕量級 RTSP 服務,讓開發者快速搭…

如何自定義 Spring MVC 的配置?

我們可以通過實現 WebMvcConfigurer 接口來自定義 Spring MVC (尤其是在 Spring Boot 環境中) 的配置。 以下是通過實現 WebMvcConfigurer 接口的配置方法: 核心:創建一個 Configuration 類并實現 WebMvcConfigurer import org.springframework.conte…

如何提升新加坡SAP實施成功率?解答中企出海的“稅務合規密碼” | 工博科技SAP金牌服務商

目錄 中新雙邊經貿合作概況 ?編輯 新加坡數字化實施核心挑戰 一、財稅合規體系適配 稅務申報差異 會計準則協同 二、人力資源合規管理 薪酬體系配置 數據安全規范 企業實施建議方案 一、系統建設策略 選擇具備以下資質的實施服務商: 構建標準化功能模塊…

人工智能視角下的安全:可視化如何塑造惡意軟件檢測

摘要 惡意軟件是一種持續存在的網絡安全威脅,它越來越多地通過復雜的攻擊向量,瞄準互連的數字系統,如桌面、移動和物聯網平臺。通過利用這些漏洞,攻擊者會損害現代數字生態系統的完整性和彈性。為了應對這一風險,安全…

游戲引擎學習第293天:移動Familiars

回顧并為今天的內容定下基調 我們正在做一款完整的游戲,今天的重點是“移動模式”的正式化處理。目前雖然移動機制大致能運作,但寫法相對粗糙,不夠嚴謹,我們希望將其清理得更規范,更可靠一點。 目前腦邏輯&#xff0…

golang -- 如何讓main goroutine等一等

目錄 引言一、sync.WaitGroup二、channel創建channle操作緩沖多返回值模式單向通道 引言 在不做修飾的程序中,代碼是串行執行的 串行、并發與并行串行:事物按照一定的發展順序并發:同一時間段執行多個任務(一邊吃飯一邊看電視&am…

第31講 循環緩沖區與命令解析

串口在持續接收數據時容易發生數據黏包(先接收的數據尚未被處理,后面的數據已經將內存覆蓋)的情況,循環緩沖區的本質就是將串口接受到的數據馬上拷貝到另外一塊內存之中。為了避免新來的數據覆蓋掉尚未處理的數據,一方…

UE 材質基礎 第一天

課程:虛幻引擎【UE5】材質寶典【初學者材質基礎入門系列】-北冥沒有魚啊_-稍后再看-嗶哩嗶哩視頻 隨便記錄一些 黑色是0到負無窮,白色是1到無窮 各向異性 有點類似于高光,可以配合切線來使用,R G B 相當于 X Y Z軸,切…

編譯原理--期末復習

本文是我學習以下博主視頻所作的筆記,寫的不夠清晰,建議大家直接去看這些博主的視頻,他/她們講得非常好: 基礎知識概念: 1.【【編譯原理】期末復習 零基礎自學】,資料 2.【編譯原理—混子速成期末保過】&…

【DeepSeek論文精讀】11. 洞察 DeepSeek-V3:擴展挑戰和對 AI 架構硬件的思考

歡迎關注[【AIGC論文精讀】](https://blog.csdn.net/youcans/category_12321605.html)原創作品 【DeepSeek論文精讀】1. 從 DeepSeek LLM 到 DeepSeek R1 【DeepSeek論文精讀】7. DeepSeek 的發展歷程與關鍵技術 【DeepSeek論文精讀】11. 洞察 DeepSeek-V3&#xff…

寶塔面板部署前后端項目SpringBoot+Vue2

這篇博客主要用來記錄寶塔部署前端后端項目的過程。因為寶塔部署有點麻煩,至少在我看來挺麻煩的。我還是喜歡原始的ssh連接服務器進行操作。但是公司有項目用到了寶塔,沒辦法啊,只能摸索記錄一下。 我們需要提前準備好后端項目的jar包和前端項…

電機試驗平臺:創新科技推動電動機研究發展

電機試驗平臺是電機制造和研發過程中不可或缺的重要設備,其功能涵蓋了電機性能測試、電機壽命測試、電機質量評估等多個方面。隨著科技的不斷發展和電機應用領域的日益擴大,對電機試驗平臺的要求也越來越高。本文將從現代化電機試驗平臺的設計與應用兩個…

LangGraph 7 - Platform - Agentic RAG、監督、SQL代理、追蹤、私密對話、認證、RemoteGraph、LangSmith

文章目錄 代理式檢索增強生成(Agentic RAG)安裝 1、預處理文檔2、創建檢索器工具3、生成查詢4、文檔分級5、問題重寫6、生成答案7、構建流程圖8、運行智能RAG代理 多智能體監督系統安裝配置1、創建工作代理研究代理數學代理工具 2、使用 langgraph-super…

生命之樹--樹形dp

1.樹形dp--在dfs遍歷樹的同時dp&#xff0c;從上到下遞歸&#xff0c;到葉子是邊界條件 https://www.luogu.com.cn/problem/P8625 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<ll,int> pii; int n,c; ll …

10.8 LangChain三大模塊深度實戰:從模型交互到企業級Agent工具鏈全解析

LangChain Community 項目:Model I/O, Retrieval, Agent Tooling 關鍵詞:LangChain Model I/O, 檢索增強生成, Agent 工具鏈, 多路召回策略, 工具調用協議 1. Model I/O 模塊:大模型交互標準化接口 Model I/O 是 LangChain 生態中連接大模型的核心模塊,定義了統一的輸入輸…

鴻蒙OSUniApp 實現圖片上傳與壓縮功能#三方框架 #Uniapp

UniApp 實現圖片上傳與壓縮功能 前言 在移動應用開發中&#xff0c;圖片上傳是一個非常常見的需求。無論是用戶頭像、朋友圈圖片還是商品圖片&#xff0c;都需要上傳到服務器。但移動設備拍攝的圖片往往尺寸較大&#xff0c;直接上傳會導致流量消耗過大、上傳時間過長&#x…