【发布时间】:2015-10-18 09:58:44
【问题描述】:
我正在构建一个系统来驱动一大串 WS2812 RGB LED,这些 LED 需要配置高频 (800kHz) 数据信号。
我目前在 STM32F3 上实现的系统如下所示:
Input:
PC (UART) -> DMA -> Memory
Output:
Memory -> DMA -> GPIO
我遇到的问题是,目前我只通过 USART 传递单个 LED 灯条(单个 GPIO)的数据,并将该数据存储在 uint8_t 的缓冲区中。但是,由于 DMA 将数据从内存移动到 GPIO 至少需要 1 个字节的数据,所以我需要将我的 USART 位流本质上转换为字节流。像这样的:
USART Data:
R G B
{0xFF, 0xAA, 0x00}
DMA Source:
{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //R
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, //G
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} //B
现在,问题是我有非常有限的时钟周期来为 DMA 重新排列这些数据。
我希望有人有一些算法可以真正有效地重新排列内存。否则我可能会尝试摆脱 UART DMA 并在数据进入时对数据进行基于中断的读取/重新排列。
我唯一的其他选择是将 PC 的数据吞吐量提高到现在基本上传递一堆 0 的 8 倍。
有什么建议吗?
【问题讨论】: