一、寫在前面
STM32H7目前還是一個比較新的MCU,網上的資料相對于F1 F4系列相對來說就很少了,我自己在移植這個LWIP的時候走了不少彎路,得到了不少人幫助。寫這篇文章也是對我自己移植的一個總結,也是希望后來人能少走彎路。這篇文章有由個人編輯并整理,如有錯誤,歡迎拍磚。
二、RT-Thread、STM32H7、LWIP簡介
RT-Thread是一個來自中國的開源物聯網操作系統,它提供了非常強的可伸縮能力:從一個可以運行在ARM Cortex-M0芯片上的極小內核,到中等的ARM Cortex-M3/4/7系統,甚至是運行于MIPS32、ARM Cortex-A系列處理器上功能豐富系統。
STM32H7是ST意法半導體Cortex_M系列最高性能處理器。主頻高達400M,FLASH高達2Mbytes,SRAM高達1Mbytes,采用六級流水線,自帶 指令 和數據 Cache、集成 JPEG編解碼器、 編解碼器、 集成雙精度硬件浮點計算單元( DPFPU)和 DSP指令。
LWIP是瑞典計算機科學院(SICS)的Adam Dunkels開發的一個小型開源的TCP/IP協議棧。
三、STM32H7的特殊性
這里的特殊性,僅僅只是對比F1 F4系列:
1、RAMF1 F4系列只有一塊RAM,在使用RTOS的時候直接分配給RTOS做堆就可以了。H7的RAM構成看下表:
DTCM的速度是400M,但是DMA無法進行訪問。AXI SRAM的速度是200M,DMA可以進行訪問。SRAM3是以太網和USB的緩沖區。
2、CACHEH7比F1 F4多了一個L1 CACHE一級緩存,這個緩存在為低速存儲器帶來加速的同時,也為程序帶 來了一些問題,其中最為主要的時數據一致性的問題。CACHE策略問題請參考言簡意賅的介紹M7內核的Cache工作流程,摸爬滾打半年的經驗總結。
(鏈接請復制至外部瀏覽器打開:http://forum.armfly.com/forum.php?mod=viewthread&tid=90066&highlight=%C3%FE%C5%C0%B9%F6%B4%F2)
3、DMAH7的DAM分為DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是獨立的,就是說他們有專用的DMA和其他的DAM之間使用不沖突,無須額外使能,只需要開啟中斷就默認使用DMA模式。
四、移植前的準備工作
1、確保有一個可以在開發板上能正常運行RT-Thread的工程,目前RT-Thread已經有了正點原子H743的BSP
(地址:https://github.com/RT-Thread/rt-thread/tree/master/bsp/stm32/stm32h743-atk-apollo 喜歡的話不要忘了給RT-Thread點一個),通過ENV工具使用scons --dist來把這個工程拿出來,復制出dist文件夾下的工程就可以直接使用了;
2、使用ENV工具,開啟軟件模擬IIC,因為正點原子的開發板的PHY復位接到了pcf8574的7號引腳,然后生成工程肯定會報錯,這個時候從別的BSP目錄下拷貝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代碼來啟用模擬IIC
1#defineBSP_USING_I2C223#defineBSP_I2C2_SCL_PIN1164#defineBSP_I2C2_SDA_PIN117
這里的引腳號由硬件決定,如果不是原子的開發板可以省略這一步
3、因為RT-Thread目錄下的STM32BSP是依賴CUBEMX,所以還需要在CUBEMX里面開啟ETH的引腳,這個請和自己的板子一致;
開啟RMII模式,注意這里的PC1引腳無法選擇成高電平,需要在生成的使msp.c里面自己修改為高電平,并開啟中斷。
4、檢查是否開啟了I_CACHE和D_CACHE
這里一定要開啟,里面由依賴關系,不然會導致cache無法正確運行。
5、然后通過CUBEMX生成工程并把時鐘初始化部分拷貝出來復制到board.c中
6、在drv_mpu.c中加入MPU配置以太網DMA描述符區,只能配置為Strongly - order或者Device。
1MPU_Region_InitTypeDefMPU_InitStruct; 2 3/*DisabletheMPU*/ 4HAL_MPU_Disable(); 5 6/*ConfiguretheMPUattributesasDevicenotcacheable 7forETHDMAdescriptors*/ 8MPU_InitStruct.Enable=MPU_REGION_ENABLE; 9MPU_InitStruct.BaseAddress=0x30040000;10MPU_InitStruct.Size=MPU_REGION_SIZE_256B;11MPU_InitStruct.AccessPermission=MPU_REGION_FULL_ACCESS;12MPU_InitStruct.IsBufferable=MPU_ACCESS_BUFFERABLE;13MPU_InitStruct.IsCacheable=MPU_ACCESS_NOT_CACHEABLE;14MPU_InitStruct.IsShareable=MPU_ACCESS_NOT_SHAREABLE;15MPU_InitStruct.Number=MPU_REGION_NUMBER0;16MPU_InitStruct.TypeExtField=MPU_TEX_LEVEL0;17MPU_InitStruct.SubRegionDisable=0x00;18MPU_InitStruct.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;1920HAL_MPU_ConfigRegion(&MPU_InitStruct);2122/*ConfiguretheMPUattributesasCacheablewritethrough23forLwIPRAMheapwhichcontainstheTxbuffers*/24MPU_InitStruct.Enable=MPU_REGION_ENABLE;25MPU_InitStruct.BaseAddress=0x30044000;26MPU_InitStruct.Size=MPU_REGION_SIZE_16KB;27MPU_InitStruct.AccessPermission=MPU_REGION_FULL_ACCESS;28MPU_InitStruct.IsBufferable=MPU_ACCESS_NOT_BUFFERABLE;29MPU_InitStruct.IsCacheable=MPU_ACCESS_CACHEABLE;30MPU_InitStruct.IsShareable=MPU_ACCESS_NOT_SHAREABLE;31MPU_InitStruct.Number=MPU_REGION_NUMBER1;32MPU_InitStruct.TypeExtField=MPU_TEX_LEVEL0;33MPU_InitStruct.SubRegionDisable=0x00;34MPU_InitStruct.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE;3536HAL_MPU_ConfigRegion(&MPU_InitStruct);3738/*EnabletheMPU*/39HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
7、在工程中添加ETH庫函數,stm32h7xx_hal_eth.c和stm32h7xx_hal_eth_ex.c
五、LWIP協議棧的移植
該移植參考思路,移植也可以通過git log的方式參考這個移植步驟,但是這里移植里面有幾處錯誤后文會提出。后來發現這個移植與STM32CubeRepositorySTM32Cube_FW_H7_V1.3.2ProjectsSTM32H743ZI-NucleoApplicationsLwIP,基本一致。
1、LWIP協議棧的源碼如果你有安裝CUBEMX,那么直接從STM32CubeRepositorySTM32Cube_FW_H7_V1.3.2MiddlewaresThird_PartyLwIPP的目錄下把LWIP的源碼拷貝出來就可以了。或者下載參考思路里面的鏈接把LWIP源碼拷貝出來。
2、工程中添加新的文件夾lwip/api:添加LwIPsrcapi目錄下的所有文件
lwip/core:添加LwIPsrccore目錄下的文件,并包括ipv4文件夾下的文件
lwip/netif:添加ethernet.c,sysarch.c
lwip/port:添加ethernetif.c,lan8742.c(lan8720也可以用)
移植準備工作就全部做完了,下一節修改工程報錯!
-
mcu
+關注
關注
146文章
17357瀏覽量
352794 -
編解碼器
+關注
關注
0文章
268瀏覽量
24315 -
STM32H7
+關注
關注
0文章
7瀏覽量
3867
原文標題:基于RT-Thread在STM32H7上移植LWIP(一)
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
RT-Thread內核簡介
RT-Thread的線程簡介
教你使用RT-Thread開啟STM32H7系列的RTC與Alarm組件
RT-Thread Studio提示STM32H7無法支持串口DMA請問有什么解決方案
【STM32H7教程】第21章 STM32H7的NVIC中斷分組和配置(重要)
![【<b class='flag-5'>STM32H7</b>教程】第21章 <b class='flag-5'>STM32H7</b>的NVIC中斷分組和配置(重要)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32H7教程】第8章 STM32H7的終極調試組件Event Recorder
![【<b class='flag-5'>STM32H7</b>教程】第8章 <b class='flag-5'>STM32H7</b>的終極調試組件Event Recorder](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread STM32 配置系統時鐘(使用外部晶振)
![<b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> 配置系統時鐘(使用外部晶振)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
![<b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 <b class='flag-5'>STM32</b>L475 上手指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread移植使用webserver (lwip+httpd)
![<b class='flag-5'>RT-Thread</b>移植使用webserver (<b class='flag-5'>lwip</b>+httpd)](https://file1.elecfans.com/web2/M00/A9/99/wKgZomUnepKAb9E9AABCKUIXJyA162.jpg)
RT-Thread在Lan8720a和 lwip基礎上移植ntp流程
![<b class='flag-5'>RT-Thread</b>在Lan8720a和 <b class='flag-5'>lwip</b>基礎上移植ntp流程](https://file1.elecfans.com/web2/M00/A9/A7/wKgZomUntWGAcCOHAACP1O8yWfM803.jpg)
評論