硬汉嵌入式论坛

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

[有问必答] STM32的网口DMA是否只能从RAM中提取数据

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2023-2-10 11:04:51 | 显示全部楼层 |阅读模式
用stm32cube生成了一个基于stm32f407Vet6和lwip的http server的例程,试了试工程的ping通没问题,单纯手动新建tcp和udp通信也没问题,但是httpd部分网页打不开

经过一通搜索查找跟踪debug,发现httpd部分80端口tcp连接可正常连接,get请求也能正确进入http_recev,http网页数据一路来到
HAL_ETH_Transmit的WRITE_REG(heth->Instance->DMATPDR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));这行就完蛋了
网口DMA的SR寄存器报了个ETH_DMASR_FBES错误

对比了一个能运行的例程,虽然http网页数据都在flash里,但是人家的网口发送dma描述符的数据地址开头是0x2开头的,也就是数据被拷进了RAM里,然后给到网口dma
而stm32cube直接生成的例程,http网页数据在网口发送dma描述符里的地址开头是0x08,也就是说给到dma的数据地址是在flash里
而我尝试在lwip的TCP_Write函数中给一个 TCP_WRITE_FLAG_COPY 参数,让TCP_write写数据的时候把写入的数据拷入新建的pbuf进行发送,网页就能顺利打开了

所以目前所有的证据指向了:STM32的网口DMA只能从RAM中提取数据,如果从flash中取数据就会引起dma错误
不知上述理解是否正确

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2023-2-10 11:22:44 | 显示全部楼层
楼主的发送描述符缓冲地址和接受描述符缓冲地址不是分配的RAM地址空间?

我们一直都是分配的RAM空间,确实没遇到过这种问题。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-2-10 11:36:30 | 显示全部楼层
eric2013 发表于 2023-2-10 11:22
楼主的发送描述符缓冲地址和接受描述符缓冲地址不是分配的RAM地址空间?

我们一直都是分配的RAM空间,确 ...

两个描述符在RAM里,但是因为网页数据的数组是const,在flash里,所以如果对stm32cube生成的lwip的例程不做任何处理,那例程就会直接把const的数组的地址(在flash里)直接传给lwip协议栈,最终导致发送描述符的缓冲地址指向了flash里的那个const数组
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-2-10 11:40:33 | 显示全部楼层
eric2013 发表于 2023-2-10 11:22
楼主的发送描述符缓冲地址和接受描述符缓冲地址不是分配的RAM地址空间?

我们一直都是分配的RAM空间,确 ...

然后我试了试非常粗暴的做了个判断,当描述符指向的缓冲区地址在flash中,就强行改到一块ram里,网口dma就不再报错了,真服了st了,例程他们估计都没测过
if(dmatxdesc->DESC2 < 0x20000000)//缓冲区不在RAM区
{
        dmatxdesc->DESC2 = 0x20015C98;/随便安排一个RAM的地址
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2023-2-10 11:44:27 | 显示全部楼层
LeoMe 发表于 2023-2-10 11:36
两个描述符在RAM里,但是因为网页数据的数组是const,在flash里,所以如果对stm32cube生成的lwip的例程不 ...

还有这种操作,厉害了。
另外就是设置这个const数值空间4字节对齐是不是可行。


回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2023-2-14 11:07:43 | 显示全部楼层
eric2013 发表于 2023-2-10 11:44
还有这种操作,厉害了。
另外就是设置这个const数值空间4字节对齐是不是可行。

目前我看了TI和ST的手册,网口DMA部分几乎用相同的句子描述了网口DMA的数据源可以不用对齐,DMA总是会按照4字节对齐取数,然后数据送入fifo的时候会把不整齐的头部和尾部去掉
ST对齐.png TI 对齐.png
所以应该不是对齐的问题,我用stm32f746 discover试了试官方的例程,不但网页数据在flash里,而且数据数组的位置没有按照4字节对齐,传给描述符的地址也没有对齐
本来我真的认定网口DMA是不能从flash取数的,因为ti的文档里看到了这个
TI不能访问FLASH.png
ti的文档还是靠谱啊,人家明说了网口的dma只能从sram取数

但是前面那个stm32f746 的官方例程确实是在描述符里看到flash里的数据地址了
描述符地址.png
然后就又折腾了2天,找各种例程,看人家咋弄的,但是找到的stm32f407的例程,基本都是在low_level_output里把pbuf里的数据又复制了一遍
这样无论哪来的数据,最终给到dma的数据都在ram里

直到,直到今天早上我无意间去翻了stm32f746的数据手册
F7BUS.png
stm32f7的bus,mac是可以连到flash的bus的
F4BUS.png
stm32f4的bus,mac没有连到flash
所以基本就这样了,大家的F4的例程把数据拷贝一遍是没有办法,貌似网口dma确实连不到flash的总线上,而我看到的官方的例程,那是F7的,总线确实优化了,网口dma不但能连flash,还能直接挂到qspi总线上

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2023-2-14 11:54:07 | 显示全部楼层
LeoMe 发表于 2023-2-14 11:07
目前我看了TI和ST的手册,网口DMA部分几乎用相同的句子描述了网口DMA的数据源可以不用对齐,DMA总是会按 ...



非常感谢分享,找到根了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 04:07 , Processed in 0.317406 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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