STM32H723配置以太网+Freertos注意事项

这篇具有很好参考价值的文章主要介绍了STM32H723配置以太网+Freertos注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于STM32H743涨价到300元以上,项目换用了Pin2Pin替换的STM32H723,看上去cpu运行速度快了20%达到550Mhz。 但是内存布局存在很大不一样,而且ST官方代码库升级迭代快,要手动修改地方每个版本不一样,在有H743的经验下,花了2天时间搞好了记录一下。很多信息来源于英文ST支持论坛才搞定。

1.预备知识

STM32H723配置以太网+Freertos注意事项
STM32H723配置以太网+Freertos注意事项

  1. 熟悉H7系列都知道,以太网,DMA等设备,无法访问0x20000000,也就是TCM区的地址。为了让我们代码使用DMA搬运数据,整个代码的变量可以放在RAM D1区域,或者叫AXI区域,就要在.ld脚本中定义.data段,.bss段到 0x24000000. 这一块我们有320KB可以用。

  2. 而DTCM(0x20000000)的128K由于不能DMA访问,但是速度又很快,我们可以用于存放图像数据,高速ADC缓存数据,或者把定义RAMCode函数。

  3. 而涉及到ETH,以及Lwip 的收发缓存相关的地址,把他们定义到D2区域的固定地址。这样就可以使用MPU设置Cache规则,让CPU拿到正确的数据。

2.准备工作

有了以上2点准备,还要注意,如果使用的是CubeMXIDE 1.9.0 , FW库 1.9.0 以下的版本。 由于芯片比较新,ST官方仍然在进行迭代,最好进行升级,否则生成代码后仍然是不工作,不好查问题。现在是2022-12月, 下面基于1.11.0版本。
STM32H723配置以太网+Freertos注意事项
软件自动下载的固件库也是同样:STM32Cube_FW_H7_V1.11.0

调试过程中看了2个参考文章:

https://community.st.com/s/article/How-to-create-project-for-STM32H7-with-Ethernet-and-LwIP-stack-working
(其中提到到多处H723系列的特殊内存地址的问题,这个很关键)

https://blog.csdn.net/Motseturtle/article/details/126165780
(基本步骤有参考意义,但这个CSDN博文有一处内存地址0x3007ffff没写对是超范围的。另外几个步骤不适用于最新的1.11.0版本)

下面是具体生成步骤:

  1. 选择芯片
    STM32H723配置以太网+Freertos注意事项
  2. 如果本机没有H7固件库会下载。1G,大概2分钟左右。STM32H723配置以太网+Freertos注意事项
3.配置基本时钟外设

配置RCC,开启外置晶振,以太网不适合使用内置晶振。开启内置LDO,设置0档,这样支持芯片内核跑到500Mhz以上。
STM32H723配置以太网+Freertos注意事项
进入Clock Configuration, 自动求解时钟配置。一般硬件上是 16Mhz 或者 25Mhz无源晶振。按自己板子输入。路径选择圆点也要点上, 主频最高可以跑550Mhz。自动求解后,没有出现红色部分即可。
STM32H723配置以太网+Freertos注意事项

4.配置FreeRTOS

接下来准备配置 FreeRTOS。
把SYS内选择一个没用到的计时器。 用于HAL时钟,如自带的Delay,HAL API内超时等。
而原本的Systick要被RTOS占用,用于操作系统时钟节拍,上下文切换。
STM32H723配置以太网+Freertos注意事项
在中间件选项,打开Freertos,接口选择“CMSIS_V1”,这样代码体积小一些。功能是一样。
STM32H723配置以太网+Freertos注意事项

把默认任务的堆栈从128改为512以上,因为默认任务内有比较大的 LWIP 初始化。默认的128太小会导致初始化会Hardfault。 一般1024可以很够用了。
STM32H723配置以太网+Freertos注意事项

5.配置 Ethernet + Lwip

我用的LAN8742 / LAN8720(平替), 价格高一点,但是好处是可以代码全兼容不加额外PHY代码。组要要改的是 ETH涉及的GPIO要手动改为VeryHigh模式。默认是Low,是会导致PHY通信失败。
STM32H723配置以太网+Freertos注意事项
打开ETH全局中断
STM32H723配置以太网+Freertos注意事项
当使用CubeMXIDE时,是使用Gcc编译器, TX/RX Descriptor的内存地址由 *.LD链接脚本决定。这里可以不设置,但也可以设置一下。

TX/RX Descriptor 是给dma用的, 里面包括了 内存搬运的起始地址 结束地址 什么的,dma 分析这个结构体完成数据传输。所以这部分要单独存储,并且用MPU保护防止Cache引起的数据不一致。
STM32H723配置以太网+Freertos注意事项
接下来配置 LWIP
由于我要固定IP地址,把DHCP设为Disbale,下面输入固定IP的信息。
STM32H723配置以太网+Freertos注意事项
由于 STM32H723 / STM32H733 的 D2 RAM 是0x3000000开始,它的头16K用于ETH的DMA,后16K可以用于LWIP堆栈。默认的值0x30044000是适用于H743系列等,这里一定要改对,否则LWIP开机内存初始化函数会访问0x30044000(不存在于H723)会导致HardFault。
STM32H723配置以太网+Freertos注意事项
PHY就选一下,而且只有一种选项。 如果要改为DP83848或者RTL8201 低成本PHY可以参考其他文章,就是代码内PHY相关寄存器和地址改一下。
STM32H723配置以太网+Freertos注意事项
LWIP其余选项默认就行。

6.配置MPU

关于H7的MPU和Cache 可以看这个文章有了解
番外篇:STM32H7的Cache和MPU以及内存分配问题

H7主频工作在400MHz-550Mhz,除了ITCM DTCM 和Cache以满速度工作,其它AXI SRAM,SRAM1-4等都是以200MHz工作。数据缓存D-Cache就是解决CPU加速访问SRAM。

而以太网数据由于数据流量大,会被快速更新。被D-Cache缓存后已经是面目全非,所以我们使用MPU关闭以太网用的相关内存区域的Cache访问权,一旦Cache失效,CPU就老实去真实地址拿数据。这部分数据会慢一点,但是由于不是CPU自己生成的,来源于外部所以只能这样。
STM32H723配置以太网+Freertos注意事项
STM32H723配置以太网+Freertos注意事项
第一部分,把32K整个 D2区的SRAM 1 /2 处理为Level 1,关闭所有Cache行为。
第二部分,把头256B,也就是DMA描述符部分配置为Level 0。具体这里不展开。
可以参考:
STM32H743+CubeMX-梳理MPU的设置

7.配置LD脚本

根据ST支持论坛,1.11.0 版本的以太网驱动经过重构要手动加上一块代码,让我们能够指定RX_buff区域。打开 LWIP\Target\ethernetif.c, #120行附近
实现 memp_memory_RX_POOL_base 数组由.Rx_PoolSection段指定地址

/* USER CODE BEGIN 2 */
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
#pragma location = 0x30000400
extern u8_t memp_memory_RX_POOL_base[];

#elif defined ( __CC_ARM )  /* MDK ARM Compiler */
__attribute__((at(0x30000400)) extern u8_t memp_memory_RX_POOL_base[];

#elif defined ( __GNUC__ ) /* GNU Compiler */
__attribute__((section(".Rx_PoolSection"))) extern u8_t memp_memory_RX_POOL_base[];

#endif
/* USER CODE END 2 */

在LD脚本 STM32H723VETX_FLASH.ld 下部添加:

  .lwip_sec (NOLOAD) : {
    . = ABSOLUTE(0x30000000);
    *(.RxDecripSection) 
    
    . = ABSOLUTE(0x30000200);
    *(.TxDecripSection)
    
    . = ABSOLUTE(0x30000400);
    *(.Rx_PoolSection) 
  } >RAM_D2 AT> FLASH

到此配置结束,测试 Ping
STM32H723配置以太网+Freertos注意事项

后记: 测试发现,UDP接受超过1180字节后,LWIP协议栈停止工作,无法ping通收发数据。排查后发现是LWIP的TX堆栈位置(下图是设置为0x30004000)有问题,因为RAM2 的32K已经被ETH DMA用完了。改为0x2404B000,占用320K的RAM D1的末尾20KB就行了。同时在LD脚本把RAM D1 改小一点,改为300K,防止编译器占用我们需要的20K。STM32H723配置以太网+Freertos注意事项
LD脚本把RAM D1 改小一点,改为300K,防止编译器占用我们需要的20K。STM32H723配置以太网+Freertos注意事项
LD脚本把RAM D1 改小一点,改为300K,防止编译器占用最后20K。文章来源地址https://www.toymoban.com/news/detail-417079.html

到了这里,关于STM32H723配置以太网+Freertos注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32的以太网外设+PHY(LAN8720)使用详解(5):MAC及DMA配置

    stm32的ETH外设挂载在AHB1总线上,位于RCC_AHB1ENR的bit25-bit27: 相关语句如下: 直接调用ETH_DeInit函数来复位ETH外设 上述语句操作的寄存器如下: 首先设置位25为1复位以太网MAC(复位MAC寄存器到默认值),然后设置为0取消复位。 首先调用ETH_SoftwareReset函数复位MAC的DMA 上述语句操

    2024年02月03日
    浏览(32)
  • STM32以太网通信-LWIP简介

    LwIP全名:Light weight IP,意思是轻量化的TCP/IP协议,是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。 LwIP的设计初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈,其中“完整”主要指的是TCP协议的完整性,实现的重点是在保持TCP协议主要功能

    2024年02月07日
    浏览(39)
  • STM32的以太网外设+PHY(LAN8720)使用详解(6):以太网数据接收及发送

    1.1.1 检查是否接收到一帧完整报文 使用轮询的方式接收以太网数据是一种简单但是效率低下的方法,为了保证及时处理以太网数据我们需要在主循环内高频轮询是否接收到了以太网数据。轮询的函数为ETH_CheckFrameReceived,内容如下: 当以太网帧大于我们设置的DMA描述符buffer大

    2024年01月23日
    浏览(40)
  • STM32+W5500实现以太网通信

    STM32系列32位微控制器基于Arm® Cortex®-M处理器,旨在为MCU用户提供新的开发自由度。它包括一系列产品,集高性能、实时功能、数字信号处理、低功耗/低电压操作、连接性等特性于一身,同时还保持了集成度高和易于开发的特点。本例采用STM32作为MCU。 W5500是一款全硬件TCP/

    2023年04月22日
    浏览(32)
  • 【STM32F1】以太网通信之UDP/TCP实验

    在本实验中,开发板主控芯片通过 SPI 接口与 CH395Q 以太网芯片进行通讯,从而完成对 CH395Q 以太网芯片的功能配置、数据接收等功能,同时将 CH395Q 以太网芯片的 Socket0 配 置为 UDP 模式,并可通过按键发送 UDP 广播数据至其他的 UDP 客户端,也能够接收其他 UDP 客户端广播的数

    2024年02月07日
    浏览(40)
  • STM32F407+LWIP+DP83848以太网驱动移植

      最近有个项目上需要用到网络功能,于是开始移植网络相关代码。在移植的过程中感觉好难,网上找各种资料都没有和自己项目符合的,移植废了废了好的大劲。不过现在回头看看,其实移植很简单,主要是当时刚开始接触网络,各种新的知识和概念扑面而来,加上LWI

    2024年02月12日
    浏览(27)
  • STM32的以太网外设+PHY(LAN8720)使用详解(2):硬件设计

    在LAN8720上电或复位时会读取一些特定引脚的电平,根据电平来进行硬件配置。LAN8720的引脚分布如下: 注意,LAN8720有些引脚内部自带上/下拉,定义如下: LAN8720的PHYAD[0]用来配置PHY地址的bit0,当接入了多个PHY时可以用来区分不同的PHY。该引脚自带内部下拉,同时我们也只用到

    2024年04月14日
    浏览(52)
  • STM32F407以太网DMA描述符和数据链路层收发数据

    本文主要介绍STM32F407单片机MAC内核的DMA描述符,以及如何实现以太网二层的数据收发。这一篇先实现数据链路层的正常收发,下一篇再去介绍如何把LWIP移植到单片机上。大部分资料都是把LWIP移植和以太网卡驱动放在一起介绍,对新手不友好。所以我在这篇文章先把网卡驱动

    2024年02月10日
    浏览(38)
  • STM32的以太网外设+PHY(LAN8720)使用详解(1):ETH和PHY介绍

    STM32F4系列MCU内部集成了一个以太网外设(ETH),可以通过介质独立接口(MII)或简化介质独立接口(RMII)和外部PHY(如LAN8720)相连实现MCU的联网功能。 STM32F4系列的以太网外设(ETH)框图如下: 以太网外设框图中包含了MII、RMII、SMI三种接口,它们的详细介绍如下: 1.2.1 介

    2024年01月23日
    浏览(39)
  • STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解

    前面介绍到,站管理接口(SMI)允许应用程序通过2线时钟和数据线访问任意PHY寄存器,同时该接口支持访问最多32个PHY,也就是说PHY地址共有5位。 应用程序可以从32个PHY中选择一个PHY,然后从任意PHY包含的32个寄存器中选择一个寄存器,发送控制数据或接收状态信息。任意给

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包