Я пытаюсь использовать прерывание 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;
}
}