一,写在前面) v3 M3 y5 r- x* Z STM32H7目前还是一个比较新的MCU,网上的资料相对于F1 F4系列相对来说就很少了,我自己在移植这个LWIP的时候走了不少弯路,得到了不少人帮助。写这篇文章也是对我自己移植的一个总结,也是希望后来人能少走弯路。, r9 R. u) q4 C* P- w( K. g 这篇文章有由个人编辑并整理,如有错误,欢迎拍砖。! w5 u% C4 F/ R" t5 k : l3 S9 f, F h+ n; ?1 l 二,RT-Thread,STM32H7,LWIP简介 RT-Thread是一个来自中国的开源物联网操作系统,它提供了非常强的可伸缩能力:从一个可以运行在ARM Cortex-M0芯片上的极小内核,到中等的ARM Cortex-M3/4/7系统,甚至是运行于MIPS32、ARM Cortex-A系列处理器上功能丰富系统。. D, ^. V _& y- P - l( ]: w. Z. v: a STM32H7是ST意法半导体Cortex_M系列最高性能处理器。主频高达400M,FLASH高达2Mbytes,SRAM高达1Mbytes,采用六级流水线,自带 指令 和数据 Cache、集成 JPEG编解码器、编解码器、集成 双精度硬件浮点计算单元( DPFPU)和 DSP指令。2 u) b) I4 y/ D! f Q w" o, b( I2 i- g# f: t E LWIP是瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型开源的TCP/IP协议栈。 三,STM32H7的特殊性 R/ Q/ a0 i2 s6 }; J% d m; {0 g0 S 这里的特殊性,仅仅只是对比F1 F4系列:. U1 j, y" h" t3 \, I/ o : Q6 |: H6 S: r6 T8 `5 n* B5 S9 p3 i RAM6 y, W7 l4 |5 ?+ n/ G& y F1 F4系列只有一块RAM,在使用RTOS的时候直接分配给RTOS做堆就可以了。3 j; C9 S6 U+ y1 T H7的RAM构成看下表: \; m* _( G1 Q: I( v. s8 V , b4 o1 [0 c f! G7 ?' G4 {8 u DTCM的速度是400M,但是DMA无法进行访问。1 Z! v+ ^4 P* o. o" _ AXI SRAM的速度是200M,DMA可以进行访问。, `7 Z+ C* t% A4 q( D8 H+ d SRAM3是以太网和USB的缓冲区。 # O2 a# c. A8 R) P: A, z# f CACHE H7比F1 F4多了一个L1 CACHE一级缓存,这个缓存在为低速存储器带来加速的同时,也为程序带 来了一些问题,其中最为主要的时数据一致性的问题。: c' @2 m# `2 i 7 j3 c( L6 Y6 V& V DMA' M) e$ R. A* r* _ H7的DAM分为DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是独立的,就是说他们有专用的DMA和其他的DAM之间使用不冲突,无须额外使能,只需要开启中断就默认使用DMA模式。 * O7 i) U+ D: q5 I( B- \# U 四 ,移植前的准备工作 确保有一个可以在开发板上能正常运行RT_Thread的工程,目前RT_Thread已经有了正点原子H743的BSP,通过ENV工具使用scons --dist来把这个工程拿出来,复制出dist文件夹下的工程就可以直接使用了;& z! x4 `: H, w 使用ENV工具,开启软件模拟IIC,因为正点原子的开发板的PHY复位接到了pcf8574的7号引脚,然后生成工程肯定会报错,这个时候从别的BSP目录下拷贝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代码来启用模拟IIC. ~! p- A8 y! T/ U P8 Y" U' F0 A# \
这里的引脚号由硬件决定,如果不是原子的开发板可以省略这一步. O" [( i! j* v# x 因为RT-Thread目录下的STM32BSP是依赖CUBEMX,所以还需要在CUBEMX里面开启ETH的引脚,这个请和自己的板子一致;/ R( Q4 Y! Y# t! w 开启RMII模式,注意这里的PC1引脚无法选择成高电平,需要在生成的使msp.c里面自己修改为高电平,并开启中断。* G1 |! T3 c( H2 f 检查是否开启了I_CACHE和D_CACHE/ j' ^3 g* [6 E$ q3 D" T + B$ y! c1 V, D6 ?: w 这里一定要开启,里面由依赖关系,不然会导致cache无法正确运行。0 }; g, r* V4 N) f 8 s; P' E; ?! _ 然后通过CUBEMX生成工程并把时钟初始化部分拷贝出来复制到board.c中3 b2 a/ y, s' u* j ' j4 X/ k0 q' U3 N7 y 在drv_mpu.c中加入MPU配置 以太网DMA描述符区,只能配置为Strongly - order或者Device。
在工程中添加ETH库函数,stm32h7xx_hal_eth.c和stm32h7xx_hal_eth_ex.c 2 g; i7 H" J! `" H1 S9 P 五,LWIP协议栈的移植 该移植参考思路,移植也可以通过git log的方式参考这个移植步骤,但是这里移植里面有几处错误后文会提出。后来发现这个移植与STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Projects\STM32H743ZI-Nucleo\Applications\LwIP,基本一致。 - c2 Y7 v, e' ?( x) k3 f, d1 l2 [ LWIP协议栈的源码, g2 e r. N6 ? 如果你有安装CUBEMX,那么直接从STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Middlewares\Third_Party\LwIPP的目录下把LWIP的源码拷贝出来就可以了。或者下载参考思路里面的链接把LWIP源码拷贝出来。 工程中添加新的文件夹1 h* q# q* i% V 8 Q* m& c( C# F lwip/api:添加LwIP\src\api目录下的所有文件 8 G7 B( b& f) o0 t/ p R3 ], n ) Z6 u* f6 Z* a8 d2 H4 Q8 U* y lwip/core:添加LwIP\src\core目录下的文件,并包括ipv4文件夹下的文件* l; b! W. e8 g( D( Z 8 Y9 q p; C- N5 F- E * O5 Y2 ~6 n0 ], I; G- ] lwip/netif:添加ethernet.c,sysarch.c l+ v" d3 ?, z0 M& l5 h lwip/port:添加ethernetif.c,lan8742.c(lan8720也可以用) / f, p: o" \! p; ?# r( ]3 n( F% g 移植准备工作就全部做完了,下一节修改工程报错' j$ L! W* ~$ J$ g5 V 1 V" [2 V% w, z8 p9 B: S8 { ' \! \+ D0 V! D, m 2 H' \: W' W8 D9 S* F |
【经验分享】STM32_H7_ADC
STM32H7R/S高性能MCU:安全性,大存储和优异图显赋能更多应用创新
Stm32H7XX GCC下分散加载实现
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
DIY-STM32H750核心板
[nucleo-H7A3ZI-Q]1-点亮一个皮皮灯
DIY-STM32H743核心板
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
1月10日有奖直播 | 基于STM32 的CODESYS智能自动化解决方案
STM32的CAN FD位定时设置注意事项