Я строю систему для управления большой строкой светодиодов RGB WS2812, для которых требуется высокочастотный (800 кГц) сигнал данных.Перестановка последовательных данных в параллельные данные в C
Моя система, которая в настоящее время осуществляется на STM32F3 выглядит следующим образом:
Input:
PC (UART) -> DMA -> Memory
Output:
Memory -> DMA -> GPIO
Проблема у меня в том, что в настоящее время я только передачи данных для одной светодиодной полосы (одного GPIO) по USART и сохранение этих данных в буфере 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 и сделать чтение/переупорядочение данных на основе прерываний. Как это происходит?
Мой единственный вариант - увеличить пропускную способность моих данных с ПК до 8 раз, что это сейчас в основном передать в кучу 0s.
Любые предложения?
Спасибо, что я закончил работу с USART DMA – spizzak