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

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

[复制链接]
STMCU小助手 发布时间:2021-12-25 11:17
一,写在前面
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系列:

RAM
F1 F4系列只有一块RAM,在使用RTOS的时候直接分配给RTOS做堆就可以了。
H7的RAM构成看下表:
20190504165951455.png


DTCM的速度是400M,但是DMA无法进行访问。
AXI SRAM的速度是200M,DMA可以进行访问。
SRAM3是以太网和USB的缓冲区。

CACHE
H7比F1 F4多了一个L1 CACHE一级缓存,这个缓存在为低速存储器带来加速的同时,也为程序带 来了一些问题,其中最为主要的时数据一致性的问题。

DMA
H7的DAM分为DMA1,DAM2,BDMA,MDMA。其中SDIO和ETH的DMA又是独立的,就是说他们有专用的DMA和其他的DAM之间使用不冲突,无须额外使能,只需要开启中断就默认使用DMA模式。

20190504172355726.png


四 ,移植前的准备工作
确保有一个可以在开发板上能正常运行RT_Thread的工程,目前RT_Thread已经有了正点原子H743的BSP,通过ENV工具使用scons --dist来把这个工程拿出来,复制出dist文件夹下的工程就可以直接使用了;
使用ENV工具,开启软件模拟IIC,因为正点原子的开发板的PHY复位接到了pcf8574的7号引脚,然后生成工程肯定会报错,这个时候从别的BSP目录下拷贝出pcf8574.c pcf8574.h phy_reset.c,放到工程里,然后在rtconfig.h加入以下代码来启用模拟IIC
  1. #define BSP_USING_I2C2

  2. #define BSP_I2C2_SCL_PIN 116
  3. #define BSP_I2C2_SDA_PIN 117
复制代码

这里的引脚号由硬件决定,如果不是原子的开发板可以省略这一步

因为RT-Thread目录下的STM32BSP是依赖CUBEMX,所以还需要在CUBEMX里面开启ETH的引脚,这个请和自己的板子一致;

20190504230500122.png


开启RMII模式,注意这里的PC1引脚无法选择成高电平,需要在生成的使msp.c里面自己修改为高电平,并开启中断。

检查是否开启了I_CACHE和D_CACHE

20190504230946919.png


这里一定要开启,里面由依赖关系,不然会导致cache无法正确运行。

然后通过CUBEMX生成工程并把时钟初始化部分拷贝出来复制到board.c中

在drv_mpu.c中加入MPU配置
以太网DMA描述符区,只能配置为Strongly - order或者Device。
  1.   MPU_Region_InitTypeDef MPU_InitStruct;

  2.   /* Disable the MPU */
  3.   HAL_MPU_Disable();

  4.   /* Configure the MPU attributes as Device not cacheable
  5.      for ETH DMA descriptors */
  6.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  7.   MPU_InitStruct.BaseAddress = 0x30040000;
  8.   MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  9.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  10.   MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  11.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  12.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  13.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  14.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  15.   MPU_InitStruct.SubRegionDisable = 0x00;
  16.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  17.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  18.   /* Configure the MPU attributes as Cacheable write through
  19.      for LwIP RAM heap which contains the Tx buffers */
  20.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  21.   MPU_InitStruct.BaseAddress = 0x30044000;
  22.   MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
  23.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  24.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  25.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  26.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  27.   MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  28.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  29.   MPU_InitStruct.SubRegionDisable = 0x00;
  30.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  31.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  32.   /* Enable the MPU */
  33.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
复制代码

在工程中添加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,基本一致。

LWIP协议栈的源码
如果你有安装CUBEMX,那么直接从STM32Cube\Repository\STM32Cube_FW_H7_V1.3.2\Middlewares\Third_Party\LwIPP的目录下把LWIP的源码拷贝出来就可以了。或者下载参考思路里面的链接把LWIP源码拷贝出来。
工程中添加新的文件夹

lwip/api:添加LwIP\src\api目录下的所有文件

20190505093456906.png


lwip/core:添加LwIP\src\core目录下的文件,并包括ipv4文件夹下的文件

2019050509354914.png


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

20190505093617351.png


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

20190505093754704.png


移植准备工作就全部做完了,下一节修改工程报错



收藏 1 评论0 发布时间:2021-12-25 11:17

举报

0个回答

所属标签

相似分享

官网相关资源

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