首页 > 解决方案 > 如何使用中断而不是偶尔发生,环形缓冲区实现问题

问题描述

我正在尝试使用 DMA 中断来指示新数据可从连接到相机的 DCMI 接口获得。

然后在主循环中使用 DMA(图像)的缓冲区内容将图像数据发送到显示器。显示器写入和传输速度较慢,因此当旧图片未完全写入显示器时,会发生新图片准备就绪,并且图像的写入重叠。

我已阅读有关消费者生产者/缓冲区队列/循环缓冲区的信息,但不确定我是否了解如何实现它。

我无法实现缓冲区队列(带有头部和尾部)的问题之一是因为 DMA 将整个数据集写入数组,并不是每个像素在写入时都可以被监控。另一方面,图像(保存在数组中)是逐像素读取的。

这是一个代码示例:

void DMA_IRQ(void)
{
    if (DMA_Full && DMA_Enabled)
    {
        DMA->CLEARFLAG = CLEAR; //Clear Interrupt Flag

        //Now in the Background the variable
        //dma_frame_buffer is filled with read data of the DMA

        //DMA Indicator
        dma_frame_read = 1;
    }
}

在我的主要看起来像这样:

int main (void)
{
    if(dma_frame_read == 1)
    {
    for(int pixel_counter=0; pixel_counter<253; pixel_counter++)
    {
          ILI9341_Color_Send(dma_frame_buffer[pixel_counter]);
      dma_frame_read = 0;
    }
}

标签: cinterrupt

解决方案


推荐阅读