【问题标题】:Rearranging Serial Data into Parallel data in C在C中将串行数据重新排列为并行数据
【发布时间】: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 倍。

有什么建议吗?

【问题讨论】:

    标签: stm32 dma


    【解决方案1】:

    你可以试试这样的:

    unsigned char array[] = {0x00, 0x01, 0x02, 0x03, 0xa0, 0xa5};
    
    int i,j;
    for ( j = 0; j < sizeof(array); j++ ) {
        printf("array[%d] (0x%02x) bits: ", j, array[j]);
        for ( i = 0; i < 8; i++ ) {
            printf("%d ", (array[j] >> i & 0x01) );
        }
        printf("\n");
    }
    

    这个输出:

    数组[0] (0x00) 位:0 0 0 0 0 0 0 0
    数组[1] (0x01) 位:1 0 0 0 0 0 0 0
    数组[2] (0x02) 位:0 1 0 0 0 0 0 0
    数组[3] (0x03) 位:1 1 0 0 0 0 0 0
    数组[4] (0xa0) 位:0 0 0 0 0 1 0 1
    数组[5] (0xa5) 位:1 0 1 0 0 1 0 1

    要反转位,用

    替换内部循环
    for ( i = 7; i >= 0; i-- ) {
        printf("%d ", (array[j] >> i & 0x01) );
    }
    

    数组[0] (0x00) 位:0 0 0 0 0 0 0 0
    数组[1] (0x01) 位:0 0 0 0 0 0 0 1
    数组[2] (0x02) 位:0 0 0 0 0 0 1 0
    数组[3] (0x03) 位:0 0 0 0 0 0 1 1
    数组[4] (0xa0) 位:1 0 1 0 0 0 0 0
    数组[5] (0xa5) 位:1 0 1 0 0 1 0 1

    您不需要外部循环。该循环模拟您的 DMA。基本上,内部循环动态地创建一个掩码并检查该位,如果设置则输出 1,否则输出 0。然后您可以将其输出到 GPIO。您应该能够设置中断,以便 DMA 的每个字节传输都运行 ISR 中的上述代码。

    更好的是,放弃 DMA,让这种情况发生在 UART 中断上。

    【讨论】:

    • 谢谢我最终取消了 USART DMA
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 2013-08-30
    • 2021-12-07
    • 2012-12-18
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多