我一直很想知道是否有一种方法可以找出通过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 外设中的标志来做到这一点?