OV7725 DCMI+DMA+双缓冲,使用原子兄的例程显示出错,原子兄帮我看看!

2019-07-20 10:19发布

OV7725 DCMI+DMA+双缓冲,使用原子兄的例程显示出错,原子兄帮我看看!

//获取图像,帧中断
void Data_process(void)
{        
    OV7725_Line_Number = OV7725_Line_Cont;
    OV7725_Data_Len = OV7725.Frame_Data_Len;
    OV7725.Frame_Data_Len = 0;  //帧数据长度
    OV7725_Line_Cont = 0;
//*       
        __HAL_DMA_DISABLE(&DMADMCI_Handler);//关闭DMA
        YUV_data_len = __HAL_DMA_GET_COUNTER(&DMADMCI_Handler);  //得到数据长度       

    __HAL_DMA_SET_COUNTER(&DMADMCI_Handler, Window_W_Word);        //传输数据长度
        __HAL_DMA_ENABLE(&DMADMCI_Handler); //打开DMA   */

    OV7725.Data_OK = 1;
    OV7725.Frame_Cont ++;       //帧计数
}

//OV7725数据接收回调函数,行中断,采用乒乓模式
void OV7725_dcmi_rx_callback(void)
{  
        u16 i;
        u8 *pbuf_out;

    pbuf_out = Img_buf + OV7725.Frame_Data_Len;//偏移到有效数据末尾

        if (DMA2_Stream1->CR & (1<<19))   //DMA使用buf1,读取buf0
        {
                for(i = 0; i < Window_W_Word; i ++)
               {
                      *(pbuf_out++) = OV7725_Line_Data_Buf[0][i];      //读取buf0里面的数据
                      *(pbuf_out++) = OV7725_Line_Data_Buf[0][i] >> 16;//读取buf0里面的数据
               }
        }
    else                                    //DMA使用buf0,读取buf1
        {
                for(i = 0; i < Window_W_Word; i ++)
                {
                         *(pbuf_out++) = OV7725_Line_Data_Buf[1][i];      //读取buf1里面的数据
                        *(pbuf_out++) = OV7725_Line_Data_Buf[1][i] >> 16;//读取buf1里面的数据
               }
        }
    SCB_CleanInvalidateDCache();        //清除无效化DCache

    OV7725.Frame_Data_Len += Debug_Window_W;//偏移   
    OV7725_Line_Cont ++;
}

1.采用上面的函数可以显示图像,但是行中断数量比设置的数量少,而且图像会左右不断移动。

2.将第一个函数的
/*
      __HAL_DMA_DISABLE(&DMADMCI_Handler);//关闭DMA
        YUV_data_len = __HAL_DMA_GET_COUNTER(&DMADMCI_Handler);  //得到数据长度       

      __HAL_DMA_SET_COUNTER(&DMADMCI_Handler, Window_W_Word);        //传输数据长度
        __HAL_DMA_ENABLE(&DMADMCI_Handler); //打开DMA   */
和第二个函数的
//SCB_CleanInvalidateDCache();        //清除无效化DCache

注释掉,行数量和图片数据量就都对,但是图片显示一片乱码!

DCMI的设置是使用的原子兄的例程。

希望原子兄百忙之中,抽空帮我解答一下!





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
denglu
1楼-- · 2019-07-20 11:22
哎!自己解决了!SCCB的接口原因。多谢原子兄回复!
denglu
2楼-- · 2019-07-20 17:17
 精彩回答 2  元偷偷看……
denglu
3楼-- · 2019-07-20 18:37
自己顶一下!
正点原子
4楼-- · 2019-07-20 22:42
我们例程在我们开发板上运行良好啊,你接我们开发板试过么?
denglu
5楼-- · 2019-07-20 23:42
 精彩回答 2  元偷偷看……
denglu
6楼-- · 2019-07-21 02:48
用LED测试了一下,行中断和帧中断都进入正常,就是在行中断读取不到数据!