STM32H7目前還是一個比較新的MCU,網上的資料相對於F1 F4系列相對來說就很少了,我自己在移植這個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協議,可免費在商業產品中使用,不需要公布源碼,無潛在商業風險。
點擊閱讀原文即可進入報名頁