STM32
直播中

张强

7年用户 1282经验值
私信 关注
[问答]

STM32的网口DMA是否只能从RAM中提取数据?

STM32cube生成了一个基于stm32f407Vet6和lwip Raw API的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)

陈勇

2024-3-21 16:49:31
STM32的网口DMA不仅可以从RAM中提取数据,还可以从其他外设或数据源中提取数据。网口DMA可以通过设置DMA的地址和长度来指定数据来源和目标,并且可以使用DMA的循环模式来实现连续的数据传输。

关于你的问题,根据你的描述,可能是网页数据在传输过程中出现了错误,导致DMA的SR寄存器报了ETH_DMASR_FBES错误。FBES错误表示帧接收错误,可能是网络数据帧存在错误或丢失。

要解决这个问题,你可以尝试以下几个方面的调试和排查:

1. 确保网线和网络环境正常。可能有时候网络条件不好,如网络延迟、丢包等,导致数据传输错误。

2. 检查网页数据的完整性和正确性。可以通过Wireshark等网络抓包工具来查看网页数据的传输情况,确认数据在传输过程中是否正确。

3. 检查接收缓冲区的设置和使用。确保接收缓冲区大小足够,并且在使用接收缓冲区时没有发生越界或重复写入的情况。

4. 检查DMA传输的设置和使用。确保DMA的配置正确,并且在使用DMA传输数据时没有发生错误。

5. 可以尝试重新生成基于stm32f407Vet6和lwip Raw API的http server的例程,并对比新生成的例程与原例程的差异,查找是否有配置或代码错误。

如果以上方法都没有解决问题,可以尝试在STM32的官方技术支持或开发社区中提问,以获得更详细的帮助和指导。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分