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的设置是使用的原子兄的例程。
希望原子兄百忙之中,抽空帮我解答一下!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>