中级会员
 
- 积分
- 251
- 金钱
- 251
- 注册时间
- 2019-8-7
- 在线时间
- 51 小时
|
10金钱
本帖最后由 溪悦哦 于 2022-3-5 14:07 编辑
看了原子的ov5640采集JPEG代码有点疑惑,jpeg_data_ok 采集完一帧后变成1,然后关掉DMA,然后main循环发送完JPEG到串口后改为jpeg_data_ok =2,之后他怎么再次进入jpeg_data_process的,不是已经关闭DMA了吗,怎么进入帧中断回调函数呢,jpeg_data_ok 就判断不了了,开启不了下一次DMA采集

volatile u8 jpeg_data_ok = 0;//JPEG数据采集完成标志
//0,数据没有采集完;
//1,数据采集完了,但是还没处理;
//2,数据已经处理完成了,可以开始下一帧接收
/捕获到一帧图像处理函数
//hdcmi CMI句柄
void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
jpeg_data_process();//jpeg数据处理
LED1_Toggle;
ov_frame++;
//重新使能帧中断,因为HAL_DCMI_IRQHandler()函数会关闭帧中断
__HAL_DCMI_ENABLE_IT(&DCMI_Handler,DCMI_IT_FRAME);
}
//处理JPEG数据
//当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
void jpeg_data_process(void)
{
u16 i;
u16 rlen; //剩余数据长度
u32 *pbuf;
curline = yoffset; //行数复位
if(ovx_mode & 0X01) //只有在JPEG格式下,才需要做处理.
{
if(jpeg_data_ok == 0) //jpeg数据还未采集完?
{
__HAL_DMA_DISABLE(&DMADMCI_Handler);//关闭DMA
rlen = jpeg_line_size - __HAL_DMA_GET_COUNTER(&DMADMCI_Handler); //得到剩余数据长度
pbuf = jpeg_data_buf + jpeg_data_len; //偏移到有效数据末尾,继续添加
//if(DMADMCI_Handler.Instance->CR&(1<<19))for(i=0;i<rlen;i++)pbuf=dcmi_line_buf[1];//读取buf1里面的剩余数据
if(DMA1_Stream1->CR & (1 << 19))for(i = 0; i < rlen; i++)pbuf = dcmi_line_buf[1]; //读取buf1里面的剩余数据
else for(i = 0; i < rlen; i++)pbuf = dcmi_line_buf[0]; //读取buf0里面的剩余数据
jpeg_data_len += rlen; //加上剩余长度
jpeg_data_ok = 1; //标记JPEG数据采集完成,等待其他函数处理
}
if(jpeg_data_ok == 2) //上一次的jpeg数据已经被处理了
{
__HAL_DMA_SET_COUNTER(&DMADMCI_Handler, jpeg_line_size); //传输长度为jpeg_buf_size*4字节
__HAL_DMA_ENABLE(&DMADMCI_Handler); //打开DMA
jpeg_data_ok = 0; //标记数据未采集
jpeg_data_len = 0; //数据重新开始
}
}
else
{
LCD_SetCursor(0, 0);
LCD_WriteRAM_Prepare(); //开始写入GRAM
}
}
|
|