基於RT-Thread在STM32H7上移植LWIP(一)

2022-01-19 RTThread物聯網作業系統
一、寫在前面

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、RAM
F1 F4系列只有一塊RAM,在使用RTOS的時候直接分配給RTOS做堆就可以了。
H7的RAM構成看下表:

DTCM的速度是400M,但是DMA無法進行訪問。
AXI SRAM的速度是200M,DMA可以進行訪問。
SRAM3是乙太網和USB的緩衝區。

2、CACHE
H7比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、DMA
H7的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#define BSP_USING_I2C2
2
3#define BSP_I2C2_SCL_PIN 116
4#define BSP_I2C2_SDA_PIN 117

這裡的引腳號由硬體決定,如果不是原子的開發板可以省略這一步

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。

1  MPU_Region_InitTypeDef MPU_InitStruct;
2
3  
4  HAL_MPU_Disable();
5
6  
8  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
9  MPU_InitStruct.BaseAddress = 0x30040000;
10  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
11  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
12  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
13  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
14  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
15  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
16  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
17  MPU_InitStruct.SubRegionDisable = 0x00;
18  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
19
20  HAL_MPU_ConfigRegion(&MPU_InitStruct);
21
22  
24  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
25  MPU_InitStruct.BaseAddress = 0x30044000;
26  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
27  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
28  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
29  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
30  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
31  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
32  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
33  MPU_InitStruct.SubRegionDisable = 0x00;
34  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
35
36  HAL_MPU_ConfigRegion(&MPU_InitStruct);
37
38  
39  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

7、在工程中添加ETH庫函數,stm32h7xx_hal_eth.c和stm32h7xx_hal_eth_ex.c

五、LWIP協議棧的移植

該移植參考思路,移植也可以通過git log的方式參考這個移植步驟,但是這裡移植裡面有幾處錯誤後文會提出。後來發現這個移植與STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Projects\STM32H743ZI-Nucleo\Applications\LwIP,基本一致。

1、LWIP協議棧的源碼
如果你有安裝CUBEMX,那麼直接從STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Middlewares\Third_Party\LwIPP的目錄下把LWIP的源碼拷貝出來就可以了。或者下載參考思路裡面的連結把LWIP源碼拷貝出來。

2、工程中添加新的文件夾
lwip/api:添加LwIP\src\api目錄下的所有文件

lwip/core:添加LwIP\src\core目錄下的文件,並包括ipv4文件夾下的文件

lwip/netif:添加ethernet.c,sysarch.c

lwip/port:添加ethernetif.c,lan8742.c(lan8720也可以用)

移植準備工作就全部做完了,下一節修改工程報錯!

文章來源:https://blog.csdn.net/whj123999/article/details/89815908

NOW

RT-Thread線上活動

1、【RT-Thread能力認證考試——RCEA】在6月份考試開始之前,我們將為報名參加的小夥伴提供為期4周的考前線上培訓,並贈送官方教材一本。點擊可查看詳情,RAC能力認證:你未來就業晉升的通行證!

報名截至5月7號(明天)

RT-Thread線下活動

活動抽贈書籍/開發板

1、【武漢站】物聯網作業系統RT-Thread基礎入門免費培訓全天:2019年5月18日 9:30 ~ 2019年5月18日 17:00,培訓全程將以【理論+動手】方式進行,通過拆解一個DEMO實例,帶你從內核到組件到軟體包全面了解RT-Thread的體系框架。

2、【合肥站】物聯網作業系統RT-Thread基礎入門免費培訓全天:2019年5月19日 9:30 ~ 2019年5月19日 17:00,培訓內容同上。

掃碼報名合肥站

你可以添加微信13924608367為好友,註明:公司+姓名,拉進 RT-Thread 官方微信交流群

RT-Thread


讓物聯網終端的開發變得簡單、快速,晶片的價值得到最大化發揮。Apache2.0協議,可免費在商業產品中使用,不需要公布源碼,無潛在商業風險。

點擊閱讀原文即可進入報名頁

相關焦點

  • STM32平臺RT-Thread最小系統移植搭建 - STM32F107VCT6
    板子是沒有生命的,只有給了它軟體,供上電源,才能讓它們發揮作用。很多工程師,連最基礎的引腳配置都沒搞明白,就開始了RTOS的使用。 最小系統移植最小系統的作用:萬事開頭難,入門後,方可自由發揮。熟悉環境搭建、引腳配置、供電邏輯、調試接線、調試工具使用、調試環境驗證等。
  • 【DIY數字儀表】STM32F429移植TouchGFX到RT-Thread系統(1)
    RT-Thread的BSP模板:1.學習RT-Thread系統(學過的可以跳過此步驟)2.移植BSP參考官方使用 Env 創建 RT-Thread 項目工程的教程選擇 BSP獲取 RT-Thread 原始碼後需要根據自己手上的開發板型號找到對應的 BSP,我實驗所使用的是野火的STM32F29 V1開發板,所以可以選擇stm32f29-fire-challenger的BSP
  • 基於RT-Thread的雷射雷達避障小車
    投稿:andychen@rt-thread.com背景描述由於在學校裡很少有機會讓我將所學的東西付諸於實踐.有時候學完一個東西沒法真正了解自己是否掌握,同時為了進一步提高自己的能力,不再漫無目的的學習.所以決定做這樣一輛小車.其中PCB原理圖和初版PCB_layout是我在寒假在家中完成的,程序是基於rt-thread[BSP]stm32f429-Apollo
  • 【Lwip開發指南】第4章 移植LWIP(基於RT-Thead系統)
    RT-Thread 主要採用 C 語言編寫,淺顯易懂,方便移植。它把面向對象的設計方法應用到實時系統設計中,使得代碼風格優雅、架構清晰、系統模塊化並且可裁剪性非常好。RT-Thread 能使用在線軟體包非常豐富,配合系統配置工具實現直觀快速的模塊化裁剪。
  • stm32h7「手把手移植uCOSIII(版本3.08.00)」
    】源碼、【uC-OS3-master】源碼Micrium例程:【Micrium_STM32H743ZI-Nucleo_Blinky】官方工程裸機工程文件:【V7-001_LED】stm32h7裸機LED工程uCOSIII源碼下載地址為:https://github.com/SiliconLabs。
  • 是的,RT-Thread 3.0.3發布了
    春節過完,眨眼間2018年已經來到3月份,在3月的春光裡,RT-Thread也恢復到正常工作狀態,除了正在擴大陣容求才,還有在春節延誤的新版本( RT-Thread 3.0.3)更新發布現在也一併補上。
  • 靈動微課堂 (第140講) | 基於MM32 MCU的OS移植與應用——RT-Thread 中斷管理(2)
    上一章節講了中斷的原理和控制流程,今天我們進入基於MM32 MCU的實戰演練環節。>>>查看上一章為了把作業系統和系統底層的異常、中斷硬體隔離開來,RT-Thread 把中斷和異常封裝為一組抽象接口,如下圖1所示:系統把用戶的中斷服務程序 (handler) 和指定的中斷號關聯起來,可調用如下的接口掛載一個新的中斷服務程序:rt_isr_handler_t rt_hw_interrupt_install
  • 5月份RT-Thread社區簡報
    the AT socket callback function #3612  by luhuadong[drivers][watchdog] 修復watchdog.c 注釋的一處筆誤 #3611  by 2000000[BSP]Add stm32l433-st-nucleo BSP #3610 by Sunwancn[Kernel] Fix the maxlen issue in rt_object_get_pointers
  • 如何將RT-Thread移植到Cortex-M系列平臺Step by step
    Cortex-Mx系列平臺,移植時間大約為1個小時。RT-Thread的源碼可以從官網下載,具體方法為進入rt-thread的官網 http://www.rt-thread.org/,找到「入門」選項,單擊「下載」按鈕,進入下載頁。
  • RT-Thread ADC設備學習筆記
    上一節我們學習了RTT的PIN設備的使用,從PIN設備的例程再一次體會到RTT編程的靈活和簡單,最重要的是讓開發者專注於應用開發,文章連結:
  • 基於 NIOS II 處理器的RT-Thread物聯網作業系統移植與使用教程
    實驗說明本節以小梅哥AC620型FPGA開發板為例,說明了如何基於在Qsys中搭建支持RT-Thread作業系統的基本NIOS II處理器系統,並在此基礎上實現創建從git上下載RT-Thread作業系統的源文件,源碼地址:https://github.com/RT-Thread/rt-thread選擇master分支,點擊Clone or download按鈕,選擇Download
  • RT-Thread物聯網作業系統入門(1)——Keil 模擬器 STM32F103 上手指南
    系統啟動後先從彙編代碼 startup_stm32f103xe.s 開始運行,然後跳轉到 C 代碼,進行 RT-Thread 系統功能初始化,最後進入用戶程序入口 main()。在這裡 $Sub$$main 函數僅僅調用了 rtthread_startup() 函數。
  • 當「樹莓派」遇上RT-Thread Smart——應用編程入門
    選擇樹莓派有諸多方面的原因:第一,它可以算是普及度最廣的一款ARM Cortex-A硬體開發板,被廣泛地應用在一些創新應用,高校教育等方面。marm -msoft-float -Werror -Wall -O0 -g -gdwarf-2 -n --static")31set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -march=armv7-a -marm -msoft-float -x assembler-with-cpp -O0 -g")32set(CMAKE_CXX_FLAGS "${
  • rt-smart移植分析:從樹莓派3b入手
    rt-smart到最新的板子上具體需要注意哪些細節,哪些才是移植rt-smart的關鍵點?本文從樹莓派3b上移植rt-smart的角度,從頭分析rt-smart移植的關鍵細節。為了簡化系統,這裡只做了rt-smart的最小系統的移植,啟用了rt-smart最基本的特性。下面來描述一下移植的基本過程了思路,這種思路也可以借鑑移植到其他的類似的帶有mmu的系統平臺上,可以在不同的開發板上體驗rt-smart的開發過程。
  • RT-Thread10月社區簡報
    raspi4 watchdog&hdmi&sdio driver #3988修復ADC異常 #3979 from Dozingfiretruck[stm32] scons --target=iar/mdk #3991[update] openamp driver and add rs485 driver #3990[revert]  [lwip
  • Linux系統下ESP32開發板搭建RT-Thread開發環境
    獲取代碼cd ~git clonehttps://github.com/BernardXiong/rtthread-esp-idf cd rtthread-esp-idfgit submodule initgit submodule update cd esp-idf-port/
  • RT-Thread 當前最新的 nRF24L01 組件這麼用
    2、《RT-Thread mavlink 甜蜜相擁教程》新的 nRF24L01 組件包(v2.0.0)與上一版(v1.0.0)不同的是:作者把收和發分別放在了兩個不同的回調函數裡。\n"); for(;;) rt_thread_mdelay(10000); } else { rt_kprintf("[nrf24/demo] running."); } nrf24_send_data(nrf24, "Hi\n", 3, NRF24_DEFAULT_PIPE); while (1) {
  • RT-Thread Smart上手指南~
    rt-smart)是基於RT-Thread作業系統衍生的新分支,面向帶MMU,中高端應用的晶片,例如ARM Cortex-A系列晶片,MIPS晶片,帶MMU的RISC-V晶片等。rt-smart在RT-Thread作業系統的基礎上啟用獨立、完整的進程方式,同時以混合微內核模式執行。rt-smart.zip軟體包是RT-Thread Smart的用戶體驗軟體包,可在QEMU模擬的VExpress-A9機器中或樹莓派4B開發板上執行。本文檔是針對QEMU、樹莓派4B開發板上快速上手rt-smart入門指南文檔。
  • RT-Thread Smart 上手指南
    rt-smart在RT-Thread作業系統的基礎上啟用獨立、完整的進程方式,同時以混合微內核模式執行。rt-smart.zip軟體包是RT-Thread Smart的用戶體驗軟體包,可在QEMU模擬的VExpress-A9機器中或樹莓派4B開發板上執行。本文檔是針對QEMU、樹莓派4B開發板上快速上手rt-smart入門指南文檔。
  • STM32 上使用 PWM
    並給出了在正點原子 STM32L475 pandora 開發板上驗證的代碼示例。硬體平臺簡介本文基於正點原子 STM32L475 pandora 開發板,給出了 PWM 的具體應用示例代碼,由於 RT-Thread 上層應用 API 的通用性,因此這些代碼不局限於具體的硬體平臺,用戶可以輕鬆將它移植到其它平臺上。