ST意法半导体
直播中

王秀珍

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

是否有一种方法可以找出通过DMA传输到外围设备的数据呢

我一直很想知道是否有一种方法可以找出通过DMA传输到外围设备的数据可能已经发送出去。
例如一个定时器
它所做的只是
  • 创建具有不同 CCR1 值(占空比)的阵列
  • 完成后,启用 DMA 以开始将 CCR1 值从阵列传输到外设
  • 然后我从这里监视 DMA 传输完成标志,但这只是告诉您 DMA 已完成,但我怎么知道外设已完成将数据发送到现实世界?如果那有意义的话
代码:
创建数组
  • uint32_t RGB = GREEN << 16 | RED << 8 | BLUE;
  •         wait();
  •         LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_4, ((offset * 24) + 50));
  •         for (uint32_t LED = 0; LED < offset; LED++) {
  •                 if ((offset - 1) == LED) {
  •                         for (int bit = 23 + ((int)LED * 24); bit >= 0 + ((int)LED * 24); bit--) {
  •                                 if ((RGB) & (1 << ((23 + (LED * 24)) - bit))) {
  •                                         WS28128B_BUFF[bit] = 0xC0;
  •                                 } else {
  •                                         WS28128B_BUFF[bit] = 0x60;
  •                                 }
  •                         }
  •                 } else {
  •                         for (int bit = 23 + ((int)LED * 24); bit >= 0 + ((int)LED * 24); bit--) {
  •                                 WS28128B_BUFF[bit] = 0x60;
  •                         }
  •                 }
  •         }
  •         for (uint32_t RESET_LINE = (offset * 24); RESET_LINE < ((offset * 24) + 50); RESET_LINE++) {
  •                  WS28128B_BUFF[RESET_LINE] = 0x00;
  •         }
启用 DMA 和外设
  • LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_4);
  •         LL_tiM_EnableCounter(TIM15);
  •         WS2812B::block = true;
一旦 DMA 传输标志完成标志完成禁用
  • extern "C" void DMA1_Stream4_IRQHandler() {
  •         LL_DMA_ClearFlag_TC4(DMA1);
  •         LL_TIM_DisableCounter(TIM15);
  •         WS2812B::block = false;
  • }
我可以信任 DMA 标志,当它设置为将数据发送到现实世界时,还是我现在需要依赖 TIMER 外设中的标志来做到这一点?


回帖(1)

倪驰銮

2022-12-16 10:09:26
DMA TC 标志表示数据已传输到外设,但并不表示外设已“完成”处理。您需要等待另一个计时器更新周期才能发生这种情况,并且没有超级干净的方法可以做到这一点。
另一种方法是在不影响流的缓冲区末尾添加一个额外的虚拟字节(即 0% 占空比的 CCR 值)并在该字节期间(在 TC 标志处)中断。仔细检查范围,您可能需要两个虚拟字节。
举报

更多回帖

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