ST意法半导体
直播中

陈韵瑄

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

DMA何时回绕并再次开始对缓冲区0进行操作呢?

我的以太网驱动程序没有像我预期的那样换行。
RM0399 中的“61.10.1 描述符概述”部分指出,最多 N-1 个描述符由 DMA 拥有,并且 DMA 继续处理描述符,直到当前描述符指针 == 尾指针。
为了退出挂起状态,必须更新尾指针以使当前描述符指针 < 尾指针。
使用图 841 中的示例,尾指针指向条目 10(这不是有效条目,因为只有 0 到 9 是有效的)。我可以看到 DMA 一直运行到当前描述符指向 10,但它不会返回到零。如果尾指针必须大于当前指针,它应该是什么?它应该指向条目 11 吗?
DMA 何时回绕并再次开始对缓冲区 0 进行操作?


回帖(1)

袁声瑜

2022-12-9 14:57:06
以下报错是H7所有带ETH外设的参考手册:


  • RM0399 修订版 3 第 61.10.2 节
  • RM0433 修订版 7 第 58.10.2 节
  • RM0468 修订版 3 第 63.10.2 节

根据他人的信息和常识,以下各节中加粗格式的句子是错误和误导的:
----------
通道 Tx 描述符尾指针寄存器 (ETH_DMACTXDTPR) 或通道 Rx 描述符尾指针寄存器 (ETH_DMACRXDTPR) 包含指向描述符地址 (N) 的指针。基地址和当前描述符指针决定了DMA可以处理的当前描述符的地址。比描述符尾部指针 (N – 1) 指示的位置少一个位置的描述符由 DMA 拥有。DMA 继续处理描述符,直到出现以下情况:
当前描述符指针 == 描述符尾指针;
当这种情况发生时,DMA 进入挂起状态。应用程序必须对 Descriptor 尾指针寄存器执行写操作并更新尾指针,以便满足以下条件:
当前描述符指针 < 描述符尾指针;
----------
描述符尾指针寄存器不会以某种方式神奇地“包含”某些值,并且描述符 N 的地址也不是初始化的最佳值。通常最好的是 N+1 或任何有效禁用尾指针匹配停止的东西。这是安全的,因为即使 DMA 在应用程序处理和环绕之前填充所有描述符,它仍将进入挂起状态,因为描述符 0 上的 OWN 位仍将被清除。因此,尾指针不能确定描述符的所有权,并且文本具有误导性。并且关系运算符“<”不是“==”的逻辑反义词。"!=" 是,其中还包括 ">" 的情况。Alister' 中的常识和第 4 点
在寄存器描述中还有另一个与尾指针相关的错误信息:
----------
通道 Tx 描述符尾指针寄存器 (ETH_DMACT X DTPR)
ChannelTx 描述符尾指针寄存器指向距基址的偏移量,并指示最后一个有效描述符的位置。
通道 Rx 描述符尾指针寄存器 (ETH_DMACR X DTPR)
通道 Rx 描述符尾指针指向距基址的偏移量并指示最后一个有效描述符的位置。
----------
除了“ChannelTx”中缺少空格、Rx 中缺少单词“register”和“Points”中不必要的大写字母外,信息还说这些寄存器保存了描述符列表基地址的偏移量。再次来自其他人甚至 HAL ETH 驱动程序的信息相反地表明,这些寄存器保存了尾指针的绝对地址。
还有一件事情。与参考手册相反,CMSIS 头文件命名 ETH 寄存器(不仅是这两个),名称中没有“X”字母(在上例中格式为粗体)。必须纠正其中之一。
举报

更多回帖

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