本篇目標:在之前的硬件基礎上,修改ST官方移植lwip的工程,使PC機能ping通stm32
材料準備:
硬件基礎:stm32f407+lan9303
官方資料:包含代碼和移植手冊(stm32官方移植lwip資料)
修改代碼:包含移植后的代碼(STM32官方移植lwip修改代碼)
跟著文件路徑打開其中一個工程,先選擇不帶操作系統(tǒng)的練習測試
文件路徑:STM32F4x7_ETH_LwIP_V1.1.1 -> Project -> Standalone -> tcp_echo_server -> MDK-ARM -> Project.uvproj
先編譯一下,出現3個Warning,其中兩個是變量定義未使用,不影響暫且不管,還有一個是ethernetif.c文件最后沒有空白行,手動添加一行,再次編譯~
消除所有錯誤警告~成功開始的第一步~
從main函數開始理解并修改(英文為官方注釋,中文為修改注釋):
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured to
168 MHz, this is done through SystemInit() function which is called from
startup file (startup_stm32f4xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f4xx.c file
*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
#ifdef SERIAL_DEBUG
DebugComPort_Init();
#endif
/*Initialize LCD and Leds */
//LCD_LED_Init(); //硬件沒有LCD,也暫時不用LED,將函數注釋掉
/* configure ethernet (GPIOs, clocks, MAC, DMA) */
ETH_BSP_Config(); //MAC-PHY配置函數,主要理解修改函數
/* Initilaize the LwIP stack */
LwIP_Init(); //lwip初始化函數
/* tcp echo server Init */
//tcp_echoserver_init(); //tcp服務器建立函數,暫時只建立ping工程,將函數注釋掉
/* Infinite loop */
while (1)
{
/* check if any packet received */
if (ETH_CheckFrameReceived())
{
/* process received ethernet packet*/
LwIP_Pkt_Handle();
}
/* handle periodic timers for LwIP*/
LwIP_Periodic_Handle(LocalTime);
}
}
main函數中有兩個修改:
注釋 LCD_LED_Init() 函數,暫時用不到
注釋 tcp_echoserver_init() 函數,暫時用不到
其次進入主要配置函數 ETH_BSP_Config() :
這個函數中修改的內容只有一個,找到 DP83848_PHY_ADDRESS 的宏定義(在 stm32f4x7_eth_bsp.h 的第52行),修改原先的 0x01 為 0x00 地址,那么這個地址是怎么來的,等到代碼解析的時候再做解剖
函數中重點關注 ETH_GPIO_Config() 函數和 ETH_MACDMA_Config() ,這兩個函數分別是配置RMII接口相關GPIO口的復用,配置MAC控制器和使能DMA
接著看 ETH_GPIO_Config() 函數:
由于官方移植lwip用的是MII接口,而之前搭建的硬件接口是RMII,所以需要修改相關宏定義和 GPIO口的復用
void ETH_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOs clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|
RCC_AHB1Periph_GPIOB|
RCC_AHB1Periph_GPIOC,
ENABLE); //我們只用到了A,B,C三種引腳,所以修改成只使能A,B,C三個的時鐘
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG外設時鐘
/* Configure MCO (PA8) */
//配置PA8(做為MCO功能)輸出時鐘信號
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
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(GPIOA, &GPIO_InitStructure);
/* MII/RMII Media interface selection --------------------------------------*/
#ifdef MII_MODE
#ifdef PHY_CLOCK_MCO
RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1); //在PA8引腳上輸出25MHZ的時鐘信號
#endif /* PHY_CLOCK_MCO */
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII); //與PHY芯片通訊選擇MII模式
#elif defined RMII_MODE //這里要修改宏定義,注釋MII_MODE,取消注釋RMII_MODE,選擇RMII接口模式與PHY芯片進行通訊
RCC_MCO1Config(RCC_MCO1Source_PLLCLK,RCC_MCO1Div_2); //添加時鐘函數,在PA8引腳上輸出50MHZ時鐘信號
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); //與PHY芯片通訊選擇RMII模式
#endif
/* Ethernet pins configuration ************************************************/
/*
ETH_MDIO -------------------------> PA2
ETH_MDC --------------------------> PC1
ETH_RMII_REF_CLK------------------> PA1
ETH_RMII_CRS_DV ------------------> PA7
ETH_RMII_RXD0 --------------------> PC4
ETH_RMII_RXD1 --------------------> PC5
ETH_RMII_TX_EN -------------------> PB11
ETH_RMII_TXD0 --------------------> PB12
ETH_RMII_TXD1 --------------------> PB13
*/
//修改下面所有對GPIO的初始化為對應RMII接口GPIO的初始化,而RMII所用到的引腳在上面的列表中,共9個引腳
/* Configure PA1, PA2 and PA7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
/* Configure PB11,PB12 and PB13 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
/* Configure PC1, PC4 and PC5 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);
}
總結修改之前,先做一下RMII接口相關引腳的功課:
ETH_MDIO ————————> PA2
ETH_MDC ————————–> PC1
ETH_RMII_REF_CLK—————> PA1
ETH_RMII_CRS_DV —————> PA7
ETH_RMII_RXD0 ——————> PC4
ETH_RMII_RXD1 ——————> PC5
ETH_RMII_TX_EN —————–> PB11
ETH_RMII_TXD0 ——————> PB12
ETH_RMII_TXD1 ——————> PB13
修改總結:
修改GPIO時鐘使能函數 RCC_AHB1PeriphClockCmd() ,因為只用到了ABC三個引腳,所以修改成只對A,B,C三個引腳進行時鐘使能
修改宏定義,因為用的是RMII接口,所以要注釋掉MII_MODE的宏定義,取消注釋RMII_MODE的宏定義,這兩個宏定義在main.h文件的79行和87行
添加配置PHY時鐘函數 RCC_MCO1Config() ,添加在 #elif defined RMII_MODE 的下面即可
修改GPIO口初始化成RMII接口的GPIO,這里包括了對GPIOA,GPIOB,GPIOC的初始化以及將三個GPIO口的復用成RMII接口所用
接下來要來看 ETH_MACDMA_Config() 函數中的最后一個函數 ETH_Init() ,這個函數包含了所有MAC控制器相關初始化的配置,所以定位到這個函數
stm32f4xf_eth.c第416行開始:
/* Reset Timeout counter */
timeout = 0;
/* Read the result of the auto-negotiation */
// RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
/* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */
// if((RegValue & PHY_DUPLEX_STATUS) != (uint32_t)RESET)
// {
/* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */
//注釋掉其他所有內容,只留下下面兩個函數:配置為全雙工
ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
// }
// else
// {
/* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */
// ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
// }
/* Configure the MAC with the speed fixed by the auto-negotiation process */
// if(RegValue & PHY_SPEED_STATUS)
// {
/* Set Ethernet speed to 10M following the auto-negotiation */
// ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
// }
// else
// {
/* Set Ethernet speed to 100M following the auto-negotiation */
//注釋掉其他所有內容,只留下下面兩個函數:配置為100M以太網
ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
// }
修改內容:
注釋掉 stm32f4xf_eth.c 第416-441行的其他內容,只留下 ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; 和 ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
至此為止,代碼修改結束,編譯下載到板子上
如果想要修改ip地址,可以找到main.h里面的宏定義:
/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */
#define IP_ADDR0 192
#define IP_ADDR1 168
#define IP_ADDR2 0
#define IP_ADDR3 10
修改成自己想要的IP地址便可以了,接下來用pc機來ping一下
ping之前,要確定兩件事:
首先確定pc機連入的網絡ip地址和stm32的ip地址是不是同一個網段:
這里192.168.0.1和192.168.0.10就處于同一個網段其次如果是將stm32用網線接入路由器,則要確定stm32所使用的ip地址沒有被占用,檢測方法就是接入stm32前,先ping設定的地址,看能不能ping通,不能ping通表示沒有被占用;這里是直接用網線連接stm32和pc機,所以不用擔心這個問題
接下來可以用pc機ping下載好程序的stm32
win+R打開運行,輸入cmd,回車
在命令行下輸入ping 192.168.0.10
ping通成功,有圖有真相
總結:
官方移植程序幫忙做了很多事情,可以方便使用,那么修改也不外乎這么幾個地方,多多測試注意就可以成功,當能ping通,搭建好硬件軟件環(huán)境之后就可以安心地一步步調用lwip的API接口函數建立服務器,客戶端等等了。
上一篇:STM32F407VGT6+LAN8720 調試筆記
下一篇:STM32F407 以太網 外部提供時鐘源的驅動修改錯誤總結
推薦閱讀
史海拾趣
隨著產品線的拓展和技術實力的增強,格瑞寶開始積極拓展國內外市場。公司不僅在消費電子和工業(yè)類電子領域取得了顯著成績,還努力將產品和服務拓展到通信、汽車電子等新興領域。同時,格瑞寶注重品牌建設,通過提供優(yōu)質的產品和服務,贏得了廣大客戶的信賴和好評。公司的品牌知名度和影響力不斷提升,為公司的長遠發(fā)展奠定了良好基礎。
在發(fā)展過程中,格瑞寶始終秉持開放合作的理念,積極尋求與行業(yè)內外的合作伙伴建立長期穩(wěn)定的合作關系。例如,公司與唯樣商城等元器件線上平臺達成戰(zhàn)略合作,成為其代理商之一。這一合作不僅進一步擴充了格瑞寶的產品線,也為廣大客戶提供了更多的產品選擇和服務支持。通過合作與共贏的模式,格瑞寶不斷拓寬業(yè)務邊界,提升市場競爭力,實現了更快速的發(fā)展。
為了提高生產效率與產品質量,國光新業(yè)積極引進并自主研發(fā)高效自動化生產線。公司投產了行業(yè)首條高效聚合物自動化生產線,并在此基礎上不斷進行技改迭代。這些生產線的建立,不僅大幅減少了人力成本,還顯著提升了產品的生產效率與一致性。目前,公司正進行第三條全國產化技改技術攻關,旨在進一步提升生產線的智能化與自動化水平。
在快速發(fā)展的過程中,Electronic-Bauteile Goerlitz GmbH公司非常重視企業(yè)文化和團隊建設。公司倡導以人為本的管理理念,注重員工的培養(yǎng)和發(fā)展。公司定期組織各種培訓和學習活動,提高員工的專業(yè)素質和工作能力;同時,公司還建立了完善的激勵機制和福利待遇體系,確保員工能夠全身心地投入到工作中。這些努力使得公司形成了一支高效、團結、富有創(chuàng)新精神的團隊,為公司的發(fā)展提供了堅實的保障。
請注意,以上故事均為模擬構建,旨在展示一個電子公司可能的發(fā)展過程和相關故事。如有需要,您可以根據具體情況進行調整和補充。
2022年12月,中移物聯(lián)網的OneNET城市物聯(lián)網平臺在2022中國移動全球合作伙伴大會上亮相。該平臺以城市為核心,整合了各類物聯(lián)網資源,為城市管理、公共服務等領域提供了全方位的物聯(lián)網解決方案。OneNET城市物聯(lián)網平臺的推出,標志著中移物聯(lián)網在物聯(lián)網領域的技術實力和市場地位得到了進一步提升。
責、權、利統(tǒng)一的思想在人類歷史長河中一直存在。在中國古代的傳統(tǒng)文化中,就有責、權、利的思想體現,《岳陽樓記》中的“先天下之憂而憂,后天下之樂而樂”道出了一個封建士大夫立志要為天下蒼生謀福解憂的抱負。在十年浩劫中,由于時代的原因,很 ...… 查看全部問答∨ |
使用ARM9200+ USB Modem ,內核選項使用USB ACM驅動,系統(tǒng)運行后,驅動加載成功,也可以撥號成功, 但是通過監(jiān)視,發(fā)現通訊時發(fā)送數據正常,接收數據基本都有亂碼,FCS校驗都出錯,所以產生大量丟包。 開始懷疑是系統(tǒng)ACM驅動的問題,但是換ARM241 ...… 查看全部問答∨ |
請問wince環(huán)境下如何通過gprs遠程無線與exchange服務器同步? windowsmobile下手機上有個內置的activesync客戶端一直在運行的,wince下不知道有沒有這個東西,如果有,使用方式和wm下是一樣的嗎?謝謝… 查看全部問答∨ |
|
EK-LM3S811_ND Rev3在部分XP系統(tǒng)下驅動安裝問題 首先,提一點我的EK-LM3S811_ND Rev3板載調試器用的是LMeb3601.然后呢,我就在我的XP系統(tǒng)上安裝的驅動,一開始只能裝一個就是如圖所示的COM7,其余兩個如何也裝不上,我當時懷疑是板子的問題,查資料,詢問有經驗的人,兩天過后突然想,是不是我的 ...… 查看全部問答∨ |
利用CCSV5.1自帶的430ware的強大資源庫學習MSP430 本人為在校大學生,以前一直用的是51.八月初的時候被老師拉過來參加“TI杯”模擬電子專題邀請賽,這才接觸到了MSP430。學校發(fā)了三塊開發(fā)板,一塊launchpad、一塊MSP430FR5739、一塊是MSP430F5529。這些板子用著感覺都挺好的,只可惜賽后都被收回去 ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數字信號控制器(DSC)產品線 推出PWM 分辨率和 ADC 速度業(yè)界領先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網頁和arduino的通訊
- ESP32 freeRTOS使用測試