本帖最后由 STM23小白 于 2017-9-10 15:03 编辑
我要采集RGB565图像到数组以方便做图像处理,数组是申请的片外RAM,但如何判断一帧图像的帧头和帧尾呢。例程里面是直接判断JPG格式,RGB565如何判断呢?
贴上代码,求大神看一看逻辑上应该如何修改。
这是采集到一帧图像回调
if(photo_data_ok == IMG_START)
{
__HAL_DMA_DISABLE(&DMADMCI_Handler);//关闭DMA
while(DMA2_Stream1->CR&0X01); //等待DMA2_Stream1可配置
rlen=lcddev.width-__HAL_DMA_GET_COUNTER(&DMADMCI_Handler);//得到剩余数据长度
pbuf=photo_data_buf+photo_data_len;//偏移到有效数据末尾,继续添加
if(DMADMCI_Handler.Instance->CR&(1<<19))
for(i=0;i<rlen;i++)
pbuf=dcmi_line_buf_photo[1];//读取buf1里面的剩余数据
else
for(i=0;i<rlen;i++)
pbuf=dcmi_line_buf_photo[0];//读取buf0里面的剩余数据
photo_data_len += rlen;
photo_data_ok = IMG_FINISH;
}
if(photo_data_ok == IMG_NEXT)
{
__HAL_DMA_SET_COUNTER(&DMADMCI_Handler,photo_line_size); //传输长度为photo_buf_size*4字节
__HAL_DMA_ENABLE(&DMADMCI_Handler); //打开DMA
photo_data_ok = IMG_START;
photo_data_len = 0; //数据重新开始
}
这是DMA2数据流1中断回调
//图像采集回调函数
void data_dcmi_rx_callback(void)
{
u32 i;
u32 *pbuf;
pbuf=photo_data_buf+photo_data_len;//偏移到有效数据末尾
if(DMADMCI_Handler.Instance->CR&(1<<19))//buf0已满,正常处理buf1
{
for(i=0;i<lcddev.width;i++)pbuf=dcmi_line_buf_photo[0];//读取buf0里面的数据
photo_data_len+=lcddev.width;//偏移
}
else //buf1已满,正常处理buf0
{
for(i=0;i<lcddev.width;i++)pbuf=dcmi_line_buf_photo[1];//读取buf1里面的数据
photo_data_len+=lcddev.width;//偏移
}
}
这是主函数大循环
//获取图像
void camera_get_img(void)
{
photo_data_len=0;
photo_data_ok = IMG_START;//开始采集一帧图像保存至数组
dcmi_rx_callback = data_dcmi_rx_callback;//设置保存图像回调函数
while(photo_data_ok != IMG_FINISH);
photo_data_ok = IMG_NEXT;//采集第二帧
while(photo_data_ok != IMG_FINISH);
dcmi_rx_callback = lcd_dcmi_rx_callback;//设置显示回掉函数
DCMI_DMA_Init((u32)dcmi_line_buf_photo[0],(u32)dcmi_line_buf_photo[1],lcddev.width/2,DMA_MDATAALIGN_HALFWORD,DMA_MINC_ENABLE);//DCMI DMA配置
}
基本上根据原子代码修改的,求给一个实现功能的思路
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
如果帧中断能把数据全部写完,那行DAM2S1的行中断又是什么意思呢
一周热门 更多>