一,写在前面- @ n, Q; U% z3 g3 ] STM32H7目前还是一个比较新的MCU,网上的资料相对于F1 F4系列相对来说就很少了,我自己在移植这个LWIP的时候走了不少弯路,得到了不少人帮助。写这篇文章也是对我自己移植的一个总结,也是希望后来人能少走弯路。1 p& Q; p( M& Y3 b3 W2 e 这篇文章有由个人编辑并整理,如有错误,欢迎拍砖。 二,RT-Thread,STM32H7,LWIP简介8 v: e" x ?/ [: P, M RT-Thread是一个来自中国的开源物联网操作系统,它提供了非常强的可伸缩能力:从一个可以运行在ARM Cortex-M0芯片上的极小内核,到中等的ARM Cortex-M3/4/7系统,甚至是运行于MIPS32、ARM Cortex-A系列处理器上功能丰富系统。 - q! \5 X/ b% n& d+ P. {4 q STM32H7是ST意法半导体Cortex_M系列最高性能处理器。主频高达400M,FLASH高达2Mbytes,SRAM高达1Mbytes,采用六级流水线,自带 指令 和数据 Cache、集成 JPEG编解码器、编解码器、集成 双精度硬件浮点计算单元( DPFPU)和 DSP指令。 $ `* K7 t2 J( J7 D( a% z$ V LWIP是瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型开源的TCP/IP协议栈。( C8 A2 G4 U' V* V) B& D 0 G, }1 l4 e% F- N* G! A 三,STM32H7的特殊性 这里的特殊性,仅仅只是对比F1 F4系列: RAM1 t8 @. E, `; y8 G; `, z. H- q! b F1 F4系列只有一块RAM,在使用RTOS的时候直接分配给RTOS做堆就可以了。. r& G0 t+ Q3 b8 ~ H7的RAM构成看下表:" _5 Y: r+ J) I f DTCM的速度是400M,但是DMA无法进行访问。 AXI SRAM的速度是200M,DMA可以进行访问。 SRAM3是以太网和USB的缓冲区。 + a6 ^, z8 V# h) F B9 k CACHE/ O& b' k$ ~9 O8 W, q H7比F1 F4多了一个L1 CACHE一级缓存,这个缓存在为低速存储器带来加速的同时,也为程序带 来了一些问题,其中最为主要的时数据一致性的问题。 " ~. O# F H3 S DMA' J! }+ x( d m/ v! \; C+ V6 q7 G H7的DAM分为DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是独立的,就是说他们有专用的DMA和其他的DAM之间使用不冲突,无须额外使能,只需要开启中断就默认使用DMA模式。/ M2 n% L" H9 } ( ?- G n7 M4 p* Y 4 u& J( j- N, X* Q 四 ,移植前的准备工作3 j$ U8 c9 h/ E6 U3 }( e 确保有一个可以在开发板上能正常运行RT_Thread的工程,目前RT_Thread已经有了正点原子H743的BSP,通过ENV工具使用scons --dist来把这个工程拿出来,复制出dist文件夹下的工程就可以直接使用了;1 V9 ~0 ^6 K2 P" j7 l- C: x 使用ENV工具,开启软件模拟IIC,因为正点原子的开发板的PHY复位接到了pcf8574的7号引脚,然后生成工程肯定会报错,这个时候从别的BSP目录下拷贝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代码来启用模拟IIC
这里的引脚号由硬件决定,如果不是原子的开发板可以省略这一步5 Y, r" ^1 p7 m6 Z 因为RT-Thread目录下的STM32BSP是依赖CUBEMX,所以还需要在CUBEMX里面开启ETH的引脚,这个请和自己的板子一致;9 ]9 N1 X: P' Z 1 F V5 l+ K* G" f% I; o : I- e }, ]: I( Q 开启RMII模式,注意这里的PC1引脚无法选择成高电平,需要在生成的使msp.c里面自己修改为高电平,并开启中断。 检查是否开启了I_CACHE和D_CACHE 8 a7 [/ B5 @( ~ p * j! y v. W% ?. [ 这里一定要开启,里面由依赖关系,不然会导致cache无法正确运行。: E, [9 s5 m- I8 I: P6 T2 M0 n 然后通过CUBEMX生成工程并把时钟初始化部分拷贝出来复制到board.c中 在drv_mpu.c中加入MPU配置9 F" Z0 c1 [- {) s* k 以太网DMA描述符区,只能配置为Strongly - order或者Device。( e/ p: t' {) X9 y& ?8 T2 D; D1 ?
在工程中添加ETH库函数,stm32h7xx_hal_eth.c和stm32h7xx_hal_eth_ex.c 五,LWIP协议栈的移植. b$ r( H( l+ V& o m. ` 该移植参考思路,移植也可以通过git log的方式参考这个移植步骤,但是这里移植里面有几处错误后文会提出。后来发现这个移植与STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Projects\STM32H743ZI-Nucleo\Applications\LwIP,基本一致。 LWIP协议栈的源码( D6 F7 H" X8 q 如果你有安装CUBEMX,那么直接从STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Middlewares\Third_Party\LwIPP的目录下把LWIP的源码拷贝出来就可以了。或者下载参考思路里面的链接把LWIP源码拷贝出来。 工程中添加新的文件夹4 _# I7 Q6 D, d0 o3 x+ X$ v) q lwip/api:添加LwIP\src\api目录下的所有文件 + P( F7 T! T) k+ o0 k3 L+ \* L ' z6 _1 }$ M9 C lwip/core:添加LwIP\src\core目录下的文件,并包括ipv4文件夹下的文件) `6 S d7 Q4 M8 C$ u & d* c3 t( o3 b( K lwip/netif:添加ethernet.c,sysarch.c . T1 A r/ ]; b3 }8 _$ R5 v lwip/port:添加ethernetif.c,lan8742.c(lan8720也可以用)+ X# a! u$ c4 p) {: h 2 Q7 |" f; F+ G3 m* z - R t* I0 \% W1 | 移植准备工作就全部做完了,下一节修改工程报错 - N# D+ W/ B- { J( Y" q6 {6 N( U ` |
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题