你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于RT-Thread在STM32H7上移植LWIP(一)

[复制链接]
STMCU小助手 发布时间:2021-12-25 11:17
一,写在前面, r) R9 a0 h1 T
STM32H7目前还是一个比较新的MCU,网上的资料相对于F1 F4系列相对来说就很少了,我自己在移植这个LWIP的时候走了不少弯路,得到了不少人帮助。写这篇文章也是对我自己移植的一个总结,也是希望后来人能少走弯路。! B! [* E4 R  T% Y$ h4 ]
这篇文章有由个人编辑并整理,如有错误,欢迎拍砖。
1 x3 @8 Z- N* x% Z7 ^8 e
- P# ?) J* O- l5 w5 _/ L* \二,RT-Thread,STM32H7,LWIP简介4 |2 V. P/ {2 ?1 w/ s
RT-Thread是一个来自中国的开源物联网操作系统,它提供了非常强的可伸缩能力:从一个可以运行在ARM Cortex-M0芯片上的极小内核,到中等的ARM Cortex-M3/4/7系统,甚至是运行于MIPS32、ARM Cortex-A系列处理器上功能丰富系统。* }3 H9 c$ E# r2 g  G/ `

# _7 o) n6 q" v9 eSTM32H7是ST意法半导体Cortex_M系列最高性能处理器。主频高达400M,FLASH高达2Mbytes,SRAM高达1Mbytes,采用六级流水线,自带 指令 和数据 Cache、集成 JPEG编解码器、编解码器、集成 双精度硬件浮点计算单元( DPFPU)和 DSP指令。% f0 e; o" ?) P3 t5 f! {2 i

2 d" Q+ f/ c. w& C# ~LWIP是瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型开源的TCP/IP协议栈。# }" T  W7 e: e% |: ^' B
, N( t+ H4 }4 P8 `
三,STM32H7的特殊性
! p3 s5 @3 N/ y5 y这里的特殊性,仅仅只是对比F1 F4系列:
) J' W2 f# j: `
) J+ f: a+ ^' Q. ^; S/ VRAM( S$ I2 a" p' Z9 {; V; j
F1 F4系列只有一块RAM,在使用RTOS的时候直接分配给RTOS做堆就可以了。
5 W2 ^9 U$ b1 o0 G' v% H2 W4 ?H7的RAM构成看下表:
) L1 Y/ S' I) o& P
20190504165951455.png

3 w+ z' x1 @2 a
6 N2 r' |/ ]5 tDTCM的速度是400M,但是DMA无法进行访问。
' S  [+ z  F9 ^: q# ?AXI SRAM的速度是200M,DMA可以进行访问。7 N& ]$ [4 A, D7 U
SRAM3是以太网和USB的缓冲区。3 `( b9 p2 D+ C& Y- \
4 r+ d3 Q, ^# I4 D
CACHE
* H4 `, [1 E3 J$ `! A+ `# AH7比F1 F4多了一个L1 CACHE一级缓存,这个缓存在为低速存储器带来加速的同时,也为程序带 来了一些问题,其中最为主要的时数据一致性的问题。+ D: B& Z' B/ T& m& W

4 }. |8 g' d8 S4 O/ v7 M: d: O% d8 |DMA+ z5 c: F0 E' ?- a" \9 H3 v
H7的DAM分为DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是独立的,就是说他们有专用的DMA和其他的DAM之间使用不冲突,无须额外使能,只需要开启中断就默认使用DMA模式。7 O! k# @" L# a5 S

$ a0 h/ _# V' [, n2 s' u1 P# e
20190504172355726.png

8 ]6 D% I3 q' h5 [+ f; |) i! _! f' C9 g, q  Q- v$ G  t
四 ,移植前的准备工作
0 q0 V) D9 V+ L& b4 b1 B9 ?& i确保有一个可以在开发板上能正常运行RT_Thread的工程,目前RT_Thread已经有了正点原子H743的BSP,通过ENV工具使用scons --dist来把这个工程拿出来,复制出dist文件夹下的工程就可以直接使用了;
  f! P$ `$ i% I! s% J' T/ r8 _+ q使用ENV工具,开启软件模拟IIC,因为正点原子的开发板的PHY复位接到了pcf8574的7号引脚,然后生成工程肯定会报错,这个时候从别的BSP目录下拷贝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代码来启用模拟IIC
. W, @. a# O/ S  m/ n& F
  1. #define BSP_USING_I2C2% M' f) r0 y1 Q4 }
  2. ! p3 y2 ]  G. s' w6 _
  3. #define BSP_I2C2_SCL_PIN 116: h  z* d7 G: e5 w
  4. #define BSP_I2C2_SDA_PIN 117
复制代码

; D  @) j) M) X0 y这里的引脚号由硬件决定,如果不是原子的开发板可以省略这一步" }" l2 i4 I6 }$ `0 o

. Y; y9 j* y' ?: W, n0 [$ m因为RT-Thread目录下的STM32BSP是依赖CUBEMX,所以还需要在CUBEMX里面开启ETH的引脚,这个请和自己的板子一致;
5 J0 G! \  a# A  o8 D0 D& R8 P3 W( H+ h  b" w
20190504230500122.png
9 d  t. Q2 s- H1 `) r

$ q2 w8 {2 S  M0 T+ V开启RMII模式,注意这里的PC1引脚无法选择成高电平,需要在生成的使msp.c里面自己修改为高电平,并开启中断。
  L$ t% E2 l* i! f" i1 E( F9 R) j" `  ]( n2 q# ^5 e+ s
检查是否开启了I_CACHE和D_CACHE
0 q" A, z, L2 k9 T  k; ~
) ]+ v7 c) q6 t# F3 g- i' {. @3 G" l2 v
20190504230946919.png

! V9 f& ?  c  o, H/ ~0 N/ U; }5 G( f; k0 ?( D/ F7 s! \
这里一定要开启,里面由依赖关系,不然会导致cache无法正确运行。
: ?/ a( g! J2 ?0 x  E- _  @, y( Z
然后通过CUBEMX生成工程并把时钟初始化部分拷贝出来复制到board.c中/ g0 D" d/ y( O3 V& Y
0 f9 L. v9 M. }6 m/ o3 A
在drv_mpu.c中加入MPU配置
, B6 d  [. A) I3 B以太网DMA描述符区,只能配置为Strongly - order或者Device。5 Z/ J9 Z1 [, ?: [1 {4 s! X
  1.   MPU_Region_InitTypeDef MPU_InitStruct;
    % P% \2 V5 K2 }) o1 E

  2. 0 Y: p5 \4 O6 T; b; Y
  3.   /* Disable the MPU */  ~& l3 W8 U+ O- s9 B( F6 ]% G. o
  4.   HAL_MPU_Disable();- N' z9 S% ~( D% q2 q' ]9 b# H6 F
  5. / }* _' W) f8 }# B0 o
  6.   /* Configure the MPU attributes as Device not cacheable ' e4 j. y# R' U' }, O* d
  7.      for ETH DMA descriptors */) l+ |  P) _# b" t
  8.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;" w0 ~$ E% L! H/ z
  9.   MPU_InitStruct.BaseAddress = 0x30040000;9 `" p# _$ r6 ~
  10.   MPU_InitStruct.Size = MPU_REGION_SIZE_256B;5 t1 O% y2 F7 l  h; a: _
  11.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    1 F' N- e0 [. P& `
  12.   MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;$ e' W7 o$ R$ B) p  H0 w$ V6 Y1 G
  13.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
    6 T* `# @8 k/ d1 y( {5 \" w
  14.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    3 _7 A% K6 }9 g' V! Z" f
  15.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;- q! A; W2 a8 O  u8 @7 n' f
  16.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;5 t  g9 p0 T  C! {/ `; R
  17.   MPU_InitStruct.SubRegionDisable = 0x00;" ~! b% n) a% C" O! Q1 y
  18.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    : y1 K# j* W1 s) K
  19. 7 D; ?5 X. O0 R# ~( ?& C! K) m
  20.   HAL_MPU_ConfigRegion(&MPU_InitStruct);
    ; o3 x" {( o9 q- l

  21. & c- o8 u: [9 ^9 ]9 w. D
  22.   /* Configure the MPU attributes as Cacheable write through
    3 ~% x& y; ?' W4 T) p! [* p: j5 M3 w/ i
  23.      for LwIP RAM heap which contains the Tx buffers */8 B1 N/ g: q. J+ r7 b4 B" D' \
  24.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    ) W9 }0 T& u! n$ m# w1 {
  25.   MPU_InitStruct.BaseAddress = 0x30044000;$ o; y- D- u& m" l
  26.   MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
    5 p6 g/ y1 m' \# L0 b( E
  27.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    2 Y& g9 a# o/ J( W3 C$ A  e
  28.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    $ p! S6 @6 H' ^" Y5 R! C
  29.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;- w3 e5 J% i) V( b+ }: l
  30.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;' P5 k6 @3 B. U- W9 }1 M( ?1 J
  31.   MPU_InitStruct.Number = MPU_REGION_NUMBER1;4 c- j% g" ~6 G( r: R' ^; l
  32.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;$ m  d3 Z1 {  N6 C3 l% f6 k, Q
  33.   MPU_InitStruct.SubRegionDisable = 0x00;
    7 o9 o! F  J& f. T
  34.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    ( O; U& R: \0 _1 A6 P( m/ V; `
  35. ) s+ }: f5 n5 p0 M9 Y
  36.   HAL_MPU_ConfigRegion(&MPU_InitStruct);# n+ V% E, N0 Y6 c

  37. ' ?0 \1 C, w; Y. h( Y
  38.   /* Enable the MPU */
    ; m1 S- {+ `9 w0 o
  39.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
      z% L9 s0 x8 u8 i2 Q7 U4 F. [; H( |
复制代码
' V1 R7 @  D( v4 `+ u0 X$ C/ X
在工程中添加ETH库函数,stm32h7xx_hal_eth.c和stm32h7xx_hal_eth_ex.c
( C/ G# r$ u) R* ?' S0 ?
' Q, u" }8 Y" J- I' u五,LWIP协议栈的移植

: H  u9 g8 Z; s" l该移植参考思路,移植也可以通过git log的方式参考这个移植步骤,但是这里移植里面有几处错误后文会提出。后来发现这个移植与STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Projects\STM32H743ZI-Nucleo\Applications\LwIP,基本一致。
& f, P$ g& Y$ A# N5 ?
7 g& Y8 b, N  `( \/ `LWIP协议栈的源码
  ]; d) z! n1 F+ e" C$ y如果你有安装CUBEMX,那么直接从STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Middlewares\Third_Party\LwIPP的目录下把LWIP的源码拷贝出来就可以了。或者下载参考思路里面的链接把LWIP源码拷贝出来。4 j* N7 {6 i. P! l& a$ F! A" ?
工程中添加新的文件夹
4 R' P3 A* y) L% t( y, l, R& b2 D5 b2 P9 [1 s, {; p4 B
lwip/api:添加LwIP\src\api目录下的所有文件
+ E7 p% M) k. l& N8 k, F# r
; r; w* h8 z* Z% {1 _
20190505093456906.png

- \/ y* I) [6 |7 Z) \6 x# l; f
0 w5 t8 S4 d, x4 ^- jlwip/core:添加LwIP\src\core目录下的文件,并包括ipv4文件夹下的文件% }; W# G) _7 D" ^

2 N1 e! K7 O$ k, K" R! s' V5 N
2019050509354914.png
( n9 f7 X: r3 Z0 F
2 T/ o1 ]  L# f& G" e8 }
lwip/netif:添加ethernet.c,sysarch.c
4 ?# r) K. r' ~/ H: C# W6 \: }( X3 R' R0 b* |( t0 J" Z
20190505093617351.png
; ?2 ?; M6 U& D( J& B( C+ [5 N: J
8 ]- ^" O/ {8 M9 _+ T( c# w% ]
lwip/port:添加ethernetif.c,lan8742.c(lan8720也可以用)
( u- @, j7 b2 ^: P
4 z- g' a! L8 I4 c- h4 g; s
20190505093754704.png
6 I3 Q8 M2 ^4 V) X, V

4 Q/ e, G+ Z& f* S! ?' Q2 Q' E+ A移植准备工作就全部做完了,下一节修改工程报错
7 r$ D/ y) q8 x4 N7 l" N. Q
  a+ d: X, @) `5 Y( t
( q1 r% z  B3 \  M+ L$ P  T; f) W6 o( }6 U- K; _% d
收藏 1 评论0 发布时间:2021-12-25 11:17

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版