OpenEdv-开源电子网

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

STM32F4驱动OV5640串口输出数据异常

[复制链接]

7

主题

61

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2016-3-1
在线时间
76 小时
发表于 2022-12-25 18:30:07 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 feiyinglala 于 2022-12-25 18:35 编辑

使用STM43F429驱动OV5640摄像头模块,目前在尝试通过串口输出摄像头数据,遇到2个问题,如图所示
中断优先级优化后.JPG
1.每次得到的jpeg数据长度差别很大
2.上位机软件没有像素显示

目前开发主要参考了原子哥探索者的源码“(库函数版本,适合探索者STM32F4开发板)扩展实验15A OV5640摄像头实验”,主要处理流程如下,我想请教一下,我应该重点排查哪些地方。
①DCMI帧中断触发后,启动jpeg_data_process;
②jpeg_data_process中,根据当前数据状态,处理标志位jpeg_data_ok
  1. //处理JPEG数据
  2. //当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集.
  3. void jpeg_data_process(void)
  4. {
  5.         if(jpeg_data_ok==0)        //jpeg数据还未采集完?
  6.         {        
  7.                 DMA_Cmd(DMA2_Stream1, DISABLE);        //停止当前传输
  8.                 while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置  
  9.                 jpeg_data_len=jpeg_buf_size-DMA_GetCurrDataCounter(DMA2_Stream1);//得到此次数据传输的长度
  10.                         
  11.                 jpeg_data_ok=1;                                 //标记JPEG数据采集完按成,等待其他函数处理
  12.         }
  13.         if(jpeg_data_ok==2)        //上一次的jpeg数据已经被处理了
  14.         {
  15.                 DMA2_Stream1->NDTR=jpeg_buf_size;                //更新DMA流结构体中数据量
  16.                 DMA_SetCurrDataCounter(DMA2_Stream1,jpeg_buf_size);//传输长度为jpeg_buf_size*4字节
  17.                 DMA_Cmd(DMA2_Stream1, ENABLE);                        //重新传输
  18.                 jpeg_data_ok=0;                                                        //标记数据未采集        
  19.         }
  20. }
复制代码


③主函数中:
jpeg_data_ok=1 时,串口输出数据

  1. //***************OV数据串口输出测试代码*********************
  2.                 if(jpeg_data_ok==1)        //已经采集完一帧图像了
  3.                 {  
  4.                         OV_UART_p=(u8*)jpeg_buf;
  5.                         CAMERA_DEBUG("jpeg_data_len:%d\r\n",jpeg_data_len*4);//
  6.                         //LCD_ShowString(30,210,210,16,16,"Sending JPEG data..."); //提示正在传输数据
  7.                         jpglen=0;        //设置jpg文件大小为0
  8.                         headok=0;        //清除jpg头标记
  9.                         for(OV_i=0;OV_i<jpeg_data_len*4;OV_i++)//查找0XFF,0XD8和0XFF,0XD9,获取jpg文件大小
  10.                         {
  11.                                 if((OV_UART_p[OV_i]==0XFF)&&(OV_UART_p[OV_i+1]==0XD8))//找到FF D8
  12.                                 {
  13.                                         jpgstart=OV_i;
  14.                                         headok=1;        //标记找到jpg头(FF D8)
  15. CAMERA_DEBUG("已匹配到jpg头标志FFD8\r\n");//调试输出
  16.                                 }
  17.                                 if((OV_UART_p[OV_i]==0XFF)&&(OV_UART_p[OV_i+1]==0XD9)&&headok)//找到头以后,再找FF D9
  18.                                 {
  19. CAMERA_DEBUG("已匹配到jpg尾标志FFD9\r\n");//调试输出                                
  20.                                         jpglen=OV_i-jpgstart+2;
  21.                                         break;
  22.                                 }
  23.                         }
  24.                         if(jpglen)        //正常的jpeg数据
  25.                         {
  26. CAMERA_DEBUG("jpg文件数据长为:%d\r\n",jpglen);//                        
  27.                                 OV_UART_p+=jpgstart;                        //偏移到0XFF,0XD8处(头)
  28.                                 for(OV_i=0;OV_i<jpglen;OV_i++)        //发送整个jpg文件
  29.                                 {
  30.                                         while((UART7->SR&0X40)==0);        //循环发送,直到发送完毕   
  31.                                         UART7->DR=OV_UART_p[OV_i];  
  32.                                 }  
  33.                         }
  34.                         jpeg_data_ok=2;        //标记jpeg数据处理完了,可以让DMA去采集下一帧了.
  35.                 }//if(jpeg_data_ok==1)        //已经采集完一帧图像了
复制代码


最佳答案

查看完整内容[请看2#楼]

自己结贴了,折腾几天,分析了一下现象:数据局部有重复、错误等现象,我最开始怀疑是串口输出的问题,但是在仿真中发现数据也还是会存在这个问题,后来我想起,在调试OV模块时,HSE未能正确使用,然后就排查电路板,HSE对应的25M晶振就一直没正常工作,所以就把晶振换了,问题迎刃而解。 摄像头折腾挺久的,第一次看到自己控制的摄像头输出画面,还是超级开心的。 结论:数据局部错误较多,是因为驱动OV5640的时钟源选择的是HSI ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

61

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2016-3-1
在线时间
76 小时
 楼主| 发表于 2022-12-25 18:30:08 | 显示全部楼层
自己结贴了,折腾几天,分析了一下现象:数据局部有重复、错误等现象,我最开始怀疑是串口输出的问题,但是在仿真中发现数据也还是会存在这个问题,后来我想起,在调试OV模块时,HSE未能正确使用,然后就排查电路板,HSE对应的25M晶振就一直没正常工作,所以就把晶振换了,问题迎刃而解。
摄像头折腾挺久的,第一次看到自己控制的摄像头输出画面,还是超级开心的。
结论:数据局部错误较多,是因为驱动OV5640的时钟源选择的是HSI,精度不足,排除晶振问题后,HSE正常启用,选用12M晶振经过2分频为OV5640提供时钟,调通。
回复

使用道具 举报

7

主题

61

帖子

0

精华

高级会员

Rank: 4

积分
581
金钱
581
注册时间
2016-3-1
在线时间
76 小时
 楼主| 发表于 2022-12-26 01:05:51 | 显示全部楼层
折腾一晚上,现在串口输出的数据好像有点规律了
20221226 串口输出摄像头数据-备忘.rar (43.61 KB, 下载次数: 0)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 20:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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