作者 主题:SAMD10:采用DMA进行USART RX的最佳方法是什么? (Read 430 times)

0位成员和2位客人正在查看此主题。

 离线 冰箱

  • 超级贡献者
  • ***
  • 帖子:1160
  • 国家:  lt
SAMD10:带DMA的USART RX的最佳方法是什么?
« 上: 2020年12月5日,下午04:24:55»
I'我试图让我的USART与DMA和我一起工作'我接近完成,但我'我刚刚注意到那里'偶尔的错误使整个操作混乱。
当前DMA设置为在传输完成后禁用,并且我've注意,如果在启用DMA之前已接收到数据,则在启用DMA之后会跳过一些数据。
然后,这完全破坏了目标地址的计数,并且我的数据不再对齐。
看起来USART仅会接收前两个(?)字节,而忽略其余字节,然后DMA传输将保持待定状态,直到将其启用。所以一旦'启用仅传输RX缓冲区  :-//
如果在USART接收数据之前启用了DMA,则一切正常。
是否有更好的方法将DMA设置为始终启用,并在数据到达时将其仅转储到内存中?
我看到的另一个选项是频道暂停,起初我认为这可能会起作用:
引用
19.6.3.2频道暂停
通过在命令位中设置“挂起”命令,可以随时通过软件暂停通道操作。
通道控制B寄存器(CHCTRLB.CMD)的字段。正在进行的突发传输完成后,通道
操作被挂起,并且挂起命令被自动清除。
块传输完成后,也可以暂停通道操作。该软件必须设置
在相应的块传输控制位置(BTCTRL.BLOCKACT)中挂起块操作。当块
传输完成后,通道操作被暂停。 通道保持启用状态,可以接收传输触发器,
但会从仲裁方案中删除。
如果无效,通道将自动暂停操作
从系统内存(BTCTRL.VALID = 0)获取传输控制描述符。通道中的通道提取错误位
当获取了无效的描述符时,通道状态寄存器(CHSTATUS.FERR)被置位。仅启用的频道
可以暂停。如果通道在挂起时被禁用,则清除内部挂起命令。什么时候
暂停后,通道中断状态和清除寄存器中的通道挂起中断标志
设置(CHINTFLAG.SUSP)并生成可选的挂起中断。
有关传输描述符的更多详细信息,请参阅第276页上的“传输描述符”。
那么这是否意味着将不会进行任何数据传输?
我有一个博客 http://brimmingideas.blogspot.com/ 。现在空空如也!
 

 线上 恩兹

  • 定期贡献者
  • *
  • 职位:118
  • 国家:  德
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下方面回复#1: 2020年12月5日,下午05:19:55»
这是一个很好的说明,说明如何通过DMA接收uart数据:
//github.com/MaJerle/stm32-usart-uart-dma-rx-tx

提供了软件示例,尽管仅适用于STM32。
但是将其移植到SAMD设备应该很容易。

我不知道'但是,尚不知道SAMD设备是否支持此处使用的dma循环模式。
如果使用的微控制器有uart空闲中断,它也有帮助。

如果满足这些先决条件,则该解决方案将非常有效。

 

 离线 伏击

  • 支持者
  • ****
  • 帖子:1042
  • 国家:  b
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下方面回复#2: 2020年12月5日,下午05:42:15»
这是一个很好的说明,说明如何通过DMA接收uart数据:
//github.com/MaJerle/stm32-usart-uart-dma-rx-tx

有趣。
尽管他说UART RX DMA必须事先知道字节数,但这不是事实。
STM32 DMA可以连续不断地将UART字符直接接收到(两个大小的幂)环形缓冲区中。
//www.villagehousevacs.com/forum/microcontrollers/_best_-way-to-load-uart-data-to-ring-buffer-with-stm32hal/
 

 离线 冰箱

  • 超级贡献者
  • ***
  • 帖子:1160
  • 国家:  lt
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下方面回复#3: 2020年12月5日,下午05:43:17»

我不知道'但是,尚不知道SAMD设备是否支持此处使用的dma循环模式。
如果使用的微控制器有uart空闲中断,它也有帮助。

It'与SAMD有点不同,所以我不'认为它就像将其移植一样简单,但是至少它可以使我走上正确的道路。
我认为DMA传输以循环模式工作,这就是为什么我的数据不对齐的原因,因为DMA错过了一些传输,并且"circle" becomes offset.  :-//
但是我没有'还没有证实这一点。
我有一个博客 http://brimmingideas.blogspot.com/ 。现在空空如也!
 

 离线 冰箱

  • 超级贡献者
  • ***
  • 帖子:1160
  • 国家:  lt
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下方面回复#4: 2020年12月5日,下午05:45:05»
这是一个很好的说明,说明如何通过DMA接收uart数据:
//github.com/MaJerle/stm32-usart-uart-dma-rx-tx

有趣。
尽管他说UART RX DMA必须事先知道字节数,但这不是事实。
STM32 DMA可以连续不断地将UART字符直接接收到(两个大小的幂)环形缓冲区中。
//www.villagehousevacs.com/forum/microcontrollers/_best_-way-to-load-uart-data-to-ring-buffer-with-stm32hal/
SAMD10只有一个字节缓冲区,因此我必须按时抓取我的数据,否则我'会在缓冲区已满时错过数据。

就我而言,我确切地知道我有多少数据'm receiving.
« 最后编辑:2020年12月5日,下午07:06:34 »
我有一个博客 http://brimmingideas.blogspot.com/ 。现在空空如也!
 

 离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7139
  • 国家:  我们
    • 个人网站
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下问题上回复#5: 2020年12月5日,下午06:16:01»
DMA和UART RX难以管理。 DMA需要事先知道期望的字节数。

您可以使用DMA链接列表模式,并循环链接两个缓冲区,这样您就可以获得恒定的接收。但是让's说您有两个32字节的缓冲区,但您仅接收30个字节。好吧,您将坐下来,等待最后两个字节来处理数据。

UART的问题是字节有时会因错误而丢失,因此即使将协议设计为具有固定大小的数据包,您仍然可能不同步。因此,您需要添加超时之类的东西。

UART是一个足够慢的接口,可以使用中断和软件处理

而且,所有这些主要适用于所有的MCU,而不仅仅是D10。
亚历克斯
 

 离线 伏击

  • 支持者
  • ****
  • 帖子:1042
  • 国家:  b
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下方面回复#6: 2020年12月5日,下午06:21:39»
DMA和UART RX难以管理。 DMA需要事先知道期望的字节数。

那'并非总是如此,至少对于STM32以及其他  :-//
STM32 DMA可以连续不断地将UART字符直接接收到(两个大小的幂)环形缓冲区中。
//www.villagehousevacs.com/forum/microcontrollers/_best_-way-to-load-uart-data-to-ring-buffer-with-stm32hal/
 

 离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7139
  • 国家:  我们
    • 个人网站
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下方面回复#7: 2020年12月5日,下午06:28:05»
那'并非总是如此,至少对于STM32以及其他  :-//
您可以在D10上使用DMA和链接列表描述符组织类似的内容。与STM相比,管理起来有点困难,因为对于部分数据,您需要从DMA获取指针。
亚历克斯
 

 离线 伏击

  • 支持者
  • ****
  • 帖子:1042
  • 国家:  b
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下方面回复#8: 2020年12月5日,下午06:47:22»
是的,这就是症结所在。
如果在DMA处于活动状态时能够以原子方式读取DMA写指针,则可以算出RX环形缓冲区写指针所在的位置。
这样就可以连续接收到环形缓冲区。
 

 离线 冰箱

  • 超级贡献者
  • ***
  • 帖子:1160
  • 国家:  lt
回复:SAMD10:采用DMA进行USART RX的最佳方法是什么?
« 在以下问题上回复#9: 2020年12月5日,下午07:25:45»
到目前为止,我认为避免错误的最佳方法是在启用DMA之前清除RX缓冲区。
偶尔清除DMA地址计数器也有帮助。

另外,我还提供了一个示意图,说明我的MCU将会做什么,您可以看到一个重复的模式以及我的数据将如何到达和离开。
以115200的波特率发送一个字节大约需要69µs,我认为这应该为我的DMA腾出足够的时间来跳舞。
总包大小"free running mode"是40位,其中包括16个地址位和24个颜色位。

编辑:LED TX应该在上面'的单独的PWM行,因为它's done through DMA.
« 最后编辑:2020年12月5日,下午07:27:53 »
我有一个博客 http://brimmingideas.blogspot.com/ 。现在空空如也!
 


分享我

 掘客   脸书   SlashDot  美味的  Technorati   推特    谷歌    雅虎
中频