OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3687|回复: 2

ov5640采集JPEG如何进入帧中断

[复制链接]

23

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2019-8-7
在线时间
51 小时
发表于 2022-3-5 14:00:24 | 显示全部楼层 |阅读模式
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,数据已经处理完成了,可以开始下一帧接收



/捕获到一帧图像处理函数
//hdcmiCMI句柄
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
                }
}


复制代码

学习
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2070
金钱
2070
注册时间
2021-7-17
在线时间
647 小时
发表于 2022-3-5 15:11:49 | 显示全部楼层
回复

使用道具 举报

23

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2019-8-7
在线时间
51 小时
 楼主| 发表于 2022-3-5 15:39:35 | 显示全部楼层

帮顶  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表