打印
[STM32H7]

网络配置中版本的差异

[复制链接]
624|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
田舍郎|  楼主 | 2025-3-23 20:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 田舍郎 于 2025-3-23 20:47 编辑

我的项目从Atollic TrueSTUDIO® for STM32迁移到STM32CubeIDE。

在测试程序时,以太网无法正常工作,通过仿真程序查到 STM32CubeIDE生成的 ethernetif.c 文件。
我在函数中添加一行:
  SCB_CleanInvalidateDCache();
在执行 transmit 函数之前:
  HAL_ETH_Transmit(&heth, &TxConfig, ETH_DMA_TRANSMIT_TIMEOUT);
这是在已经测试过的程序中添加的,该项目由 STM32CubeMX生成。
下图显示添加语句的具体位置

为什么同一个程序在两个IDE中表现有差异,需要加指令?

使用特权

评论回复
沙发
xuanhuanzi| | 2025-3-25 11:24 | 只看该作者
应该是工程引用的头文件不在相同路径下所致吧

使用特权

评论回复
板凳
kzlzqi| | 2025-3-31 23:21 | 只看该作者
手动调用 SCB_CleanInvalidateDCache(); 可以清空并刷新 DCache,确保数据的一致性。

使用特权

评论回复
地板
夜阑风雨| | 2025-4-9 01:22 | 只看该作者
Atollic TrueSTUDIO® for STM32 迁移到 STM32CubeIDE 后,以太网(ETH)功能异常,需要手动添加 SCB_CleanInvalidateDCache() 才能正常工作,这通常与缓存一致性(Cache Coherency)和工具链差异有关

使用特权

评论回复
5
一秒落纱| | 2025-4-9 02:45 | 只看该作者
缓存一致性问题STM32CubeIDE 默认启用 D-CacheSTM32CubeIDE 基于 GCC 工具链,可能默认启用了数据缓存(D-Cache),而 Atollic TrueSTUDIO 可能未启用或处理方式不同

使用特权

评论回复
6
三生万物| | 2025-4-9 03:12 | 只看该作者
以太网 DMA 直接访问内存时,如果缓存未及时同步,会导致数据不一致(例如:DMA 读取到的是缓存中的旧数据,而非实际内存中的新数据)

使用特权

评论回复
7
别乱了阵脚| | 2025-4-9 04:33 | 只看该作者
SCB_CleanInvalidateDCache()的作用是清理并无效化 D-Cache,确保DMA访问的是最新的内存数据

使用特权

评论回复
8
远山寻你| | 2025-4-9 05:24 | 只看该作者
STM32CubeIDE 生成的启动文件(如 startup_stm32h7xx.s)可能默认启用了 MPU(内存保护单元)或缓存,而 Atollic 的配置可能不同

使用特权

评论回复
9
淡漠安然| | 2025-4-9 06:47 | 只看该作者
检查 SystemInit() 函数(在 system_stm32h7xx.c 中)是否启用了缓存

使用特权

评论回复
10
冰春彩落下| | 2025-4-9 07:28 | 只看该作者
一般来说,STM32CubeIDE 的链接脚本(.ld 文件)可能未将以太网缓冲区所在的内存区域标记为 "非缓存"Non-Cacheable),而 Atollic 可能通过其他方式(如 MPU 配置)隐式处理了这一问题

使用特权

评论回复
11
江河千里| | 2025-4-9 08:38 | 只看该作者
在以太网 DMA 操作前后,手动维护缓存一致性:注意:pData 的地址必须对齐到 32 字节(Cache Line 大小)

使用特权

评论回复
12
禁用 D-Cache(简单但影响性能)如果不想频繁操作缓存,可以全局禁用 D-Cache(不推荐高性能应用)

使用特权

评论回复
13
光辉梦境| | 2025-4-9 10:56 | 只看该作者
配置 MPU 将以太网缓冲区标记为非缓存,在main.c中通过MPU配置以太网缓冲区内存区域为非缓存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

1959

帖子

2

粉丝