硬汉嵌入式论坛

 找回密码
 立即注册
查看: 541|回复: 10
收起左侧

[以太网] 求助,STM32H7外部QSPI Flash和LWIP的问题

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2025-8-19 13:39:06 | 显示全部楼层 |阅读模式
我现在使用了STM32H750XBH6,程序Freerrtos+LWIP,运行在外部的W25Q64中。目前是QT使用tcp向单片机发数据,每包数据长度不超过lwip设置的TCP MSS(MTU)就没问题,但是当数据超过了这个值,例如每次发送4096字节的数据就会出现丢包或者是接收到的lwip数据乱码。但是我的程序运行在内部的Flash中就不会出现上述的问题,求大佬解答
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-8-20 08:37:26 | 显示全部楼层
配置下QSPI Flash的MPU Cache,看看是不是好点

指令ICache记得一定要开启


1234.png

回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-8-20 09:20:33 | 显示全部楼层
eric2013 发表于 2025-8-20 08:37
配置下QSPI Flash的MPU Cache,看看是不是好点

指令ICache记得一定要开启

目前是这样的,我外部Flash的MPU设置的和你给的图一样的

Snipaste_2025-08-20_08-50-11.bmp
然后我在网上看有人说如果将LWIP部分的MPU Cache设置为写穿模式但是如果 Cache 命中的情况下,DMA 写操作也更新了 SRAM 区的数据,CPU 直接从 Cache
里面读取的数据就是错误的,所以我把存放lwip缓冲区的地址的Cache设置为下面这样


lwip16k.bmp 乱的 lwip256b.bmp
这种情况下,长时间发送4096字节的包就会出现下面这种情况,它并不是这个包所有字节都乱码,只会是头部几个字节是
抓包2.bmp


网络抓包.bmp
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-8-22 10:14:23 | 显示全部楼层
xkjhtxy 发表于 2025-8-20 09:20
目前是这样的,我外部Flash的MPU设置的和你给的图一样的

如果配置为透写的话,底层读函数做个无效化
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-8-22 14:09:46 | 显示全部楼层
eric2013 发表于 2025-8-22 10:14
如果配置为透写的话,底层读函数做个无效化


这样搞对吗,我Lwip版本是2.1.2。然后我在网上看有人说cache无效化要32位对齐,但是新版HAL库好像把这个解决了
无效化.bmp
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-8-23 08:50:56 | 显示全部楼层
xkjhtxy 发表于 2025-8-22 14:09
这样搞对吗,我Lwip版本是2.1.2。然后我在网上看有人说cache无效化要32位对齐,但是新版HAL库好像把这 ...

简单省事些,改成直接调用你第一个箭头的函数即可
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-8-25 10:49:15 | 显示全部楼层
eric2013 发表于 2025-8-23 08:50
简单省事些,改成直接调用你第一个箭头的函数即可

增加了无效换缓存也不行,但我把DMA描述符ETH_RX_DESC_CNT从4个增加到8个后一次接收4096字节没问题,但是一次接收8192字节还是会出现错误的数据
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-8-25 18:02:55 | 显示全部楼层
eric2013 发表于 2025-8-23 08:50
简单省事些,改成直接调用你第一个箭头的函数即可

硬汉哥,有外部QSPI Flash运行lwip的程序给我参考参考吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-8-26 08:48:05 | 显示全部楼层
xkjhtxy 发表于 2025-8-25 18:02
硬汉哥,有外部QSPI Flash运行lwip的程序给我参考参考吗

这个没有,我们做的网络协议栈例子都是用的内部Flash
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-8-27 18:09:34 | 显示全部楼层
eric2013 发表于 2025-8-26 08:48
这个没有,我们做的网络协议栈例子都是用的内部Flash

硬汉哥,现在发现使用HAL_ETH_GetRxDataBuffer这个函数获得的数据是正确的,但是提交到应用层使用recv读取出来的数据就不对了
对比.jpg

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118331
QQ
发表于 2025-8-28 13:48:34 | 显示全部楼层
xkjhtxy 发表于 2025-8-27 18:09
硬汉哥,现在发现使用HAL_ETH_GetRxDataBuffer这个函数获得的数据是正确的,但是提交到应用层使用recv读 ...

这种的应该是RAM的MPU Cache处理问题,可以关闭这个RAM空间的Cache,或者读取前调用Cache无效化操作。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 16:40 , Processed in 0.066421 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表