STM32驱动OV7670(无FIFO)相关问题的解决

这篇具有很好参考价值的文章主要介绍了STM32驱动OV7670(无FIFO)相关问题的解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32驱动OV7670(无FIFO)相关问题的解决



前言

之前入手了一块OV7670,直到最近才想着研究研究。首先是直接驱动摄像头显示在LCD上,然后通过串口输出到上位机显示。发现用了串口之后,串口占用CPU时间过长,导致图像刷新就很慢,于是用了DMA与串口进行改进。

后来听说HAL库扩展性很好,而且官方已经停止维护标准库了,所以HAL库可能才是未来的方向。于是又利用HAL库与STM32CUBEMX重新实现了一遍。这样我对HAL库也有了开发的经验了,总之收获很大。

最后把资源传上来了,大家自取吧。
https://download.csdn.net/download/wing_man/85251101?spm=1001.2014.3001.5501


一、OV7670大体介绍与需要关注的点

首先,我们第一步应当对其管脚做相应的了解。看下图
STM32驱动OV7670(无FIFO)相关问题的解决
3.3V和GND: 不必多说,供电用。

SCL与SDA: 并不是I2C总线,这里是 SCCB总线所用管脚,与I2C总线很像。主要是用来配置OV7670内部寄存器用的。这个网上资料很多,这里只是说明以下管脚的用途。

VS和HS: VSYNC与HSYNC,图像输出的同步信号。

PCLK与MCLK: PCLK是摄像头输出给32的,MCLK是32输入给摄像头的。

D7-D0: 图像信号输出所用的数据线。

二、遇到的问题及解决

1.引脚冲突

我是在别人代码上做的更改,而且用的标准库。所以对引脚的定义并没有太过深究。下面说明问题, STM32精英版的LCD背光引脚为PB0,而在代码中PB0-7已经被定义为了数据引脚D0-D7。PB0本来在初始化LCD是定义为推挽输出高电平, 后来对OV7670时又被配置成了下拉输入。 于是LCD背光就很闪。

后来转HAL库时利用STM32CUBEMX可视化引脚定义时,发现了这个问题。后来把数据引脚初始化为PC0-PC7时就没有了这个现象。

2.DMA只能发送一次的问题

这个比较坑,初始化DMA后,开启DMA传送后只能传送一次,然后就卡住了。这是因为DMA没有被重新使能,解决方法也很简单,开启一次DMA传送后,在下一次将要开启DMA传送前重新失能使能,然后再开启DMA传送即可。

3.DMA发送数据对齐问题

我定义的采集到的图像数组为16为无符号整型,而串口的发送寄存器为八位的。
STM32驱动OV7670(无FIFO)相关问题的解决
然而上位机只能接收灰度图(不是自己编写的,只能如此),OV7670输出的为RGB565格式。所以将RGB565格式转为灰度图后,每一个地址上的数据高8位均为0。比如0xabcd转成0xfa00, 0x1234转为0xba00(并不是实际准确的数值,只是说明格式而已)。

那么按照上卖弄的数据,我们DMA发送时应当发送0xfa, 0xba。高8位的00被舍掉。利用这个特性,引出DMA的数据对齐问题。看下图

STM32驱动OV7670(无FIFO)相关问题的解决
按道理来说,我们memory设为半字,peripheral设为byte刚刚好,此时DMA应当传送0xfa,0xba,这样才符合逻辑。然而DMA传送的实际上位0xfa,0x00,0xba,0x00。即高8位并没有舍去,这点很蹊跷。于是只能在要传送的数据上动手脚。

算法:将0xaa00, 0xbb00, 0xcc00, 0xdd00转为0xaabb,0xccdd(类似格式)

void pic_reject(void)
{
	u16 *addr = &Image_Use[0][0];   //要处理的图片数组 
	int i,j;
	for(i=0;i<PIC_WIDTH/2;i++)     //Iamge_Use[PIC_WIDTH][PIC_LENGTH]
	{
		for(j=0;j<PIC_LENGTH;j++)
		{
			*(addr+i*PIC_LENGTH+j) = (*(addr+(2*(i*PIC_LENGTH+j))) ) | ((*(addr + (2*(i*PIC_LENGTH+j))+1)) << 8); 
		}
	}
}

只能先这样解决,具体也没有什么更好的办法。 后续看看能不能找到DMA不能对齐的原因。

4.OV7670图片发白

这可能是输入到OV7670 MCLK引脚的时钟速度不对。 必须满足OV7670操作时序才能得到正确的结果,因此MCLK不论过快还是过慢都会导致OV7670操作时序不匹配,导致图像出现各种各样的问题。 我利用STM32CUBEMX将PA8的速度配置为36MHz解决了这个问题,(8MHz的时候出现的这个问题)。

5.上位机图片下方模糊

这个我不知道是什么原因,我猜测应该是上位机软件设计的原因。毕竟我将串口速度在提高一点的时候,上位机软件就不行了,所以我很怀疑上位机软件设计是否合理。
STM32驱动OV7670(无FIFO)相关问题的解决
下方有明显的横条纹。

6.一个比较细节的问题

看代码

int count = 0;
while(1)
{
	if(count == 0)
	{
		xxx;
		count++;
	}
	else
	{
		xxx;
	}
	count=count+1;
}
	

请思考,在第一循环执行完xxx后,程序会不会进入else中执行yyy呢?他惊醒我要时刻注意细节。答案是不会。
好,那么在思考第二次循环,程序会不会进入else中执行xxx呢?答案很简单,会进入,但是调试的时候则很不明显。

if中的xxx和else中的xxx是相同的。在keil中,若你设置编译器优化程度高,那么编译器对你的代码进行优化后。执行到else中,他会转到if中的xxx去执行,因为这样减小程序的大小,毕竟STM32的SRAM就512K。

那么我是怎么发现的呢? 碰巧看到了keil代码窗口上方的汇编结果。 汇编代码直接BL到if中的xxx处。 所以学会ARM汇编还是挺有用的,可以不精通,但一定能看懂。否则你连32启动前初始化的程序都搞不明白。

7.帧率提高的一些思考

STM32虽然性能相对较高,但想要达到实时的效果还是不太现实的。想要提高帧率,可以配置主时钟到72M,AHB,APB都配置到stm32所能承受的最高速度。如果有可能的话,尽可能提高输送给OV7670的MCLK的速度,但要注意OV7670的操作时序图,在能满足时序要求的情况下尽可能提高MCLK的速度。

其次对于一些硬件能实现的功能尽量用硬件去实现,若要软件实现那么必然会占用CPU资源,导致速度变慢。

其次时间分配要合理,比如我的串口速度为115200波特,DMA发送。即使我启动DMA发送后不去管它,立刻去读取OV7670的数据,显示在LCD上,仍然要等上1秒左右DMA才能发送完。 那么在提高一倍或者多倍串口速度将会比较均衡。 但是这时候要考虑误码率的因素,如果硬件支持的话还是尽量提高串口速度。


总结

收获蛮多,简单总结一下。
1,操作一个设备之前,要对这个设备有大致的了解。我这次成功只是运气好,乱改一通恰好问题解决。若要问题没有解决呢?那么必须看时序操作手册,看寄存器配置,借助示波器看看时序是否符合等等。实际是很复杂的,所以尽量先看设别手册对设备有了具体的了解之后在进行操作。
2,能用硬件尽量用硬件,尽量少占用CPU资源,各个任务的时间要分配好,尽量均衡一点。
3,不要固步自封,比如标准库我用着很顺手,但是官方已经停止维护了,某些32芯片也不支持标准库了,那么我们可以早点转HAL库。当然这并不意味着要抛弃标准库,只是我们要尽早的接触新的东西,比如HAL库。
4,理清思路再去进行操作,不要边操作边想办法,这样很容易走入死胡同。
5,实在想不出问题可以先出去走走,否则也容易走入死胡同。
6,问题解决后想一想它的深层原因,为什么这样就解决了。

技术要点和感悟均已总结完毕,期待我们大家都能共同进步。文章来源地址https://www.toymoban.com/news/detail-403726.html

到了这里,关于STM32驱动OV7670(无FIFO)相关问题的解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过stm32cubemx配置DCMI驱动ov5640摄像头

    打开stm32cubemx选择芯片 选择外部时钟源 选择debug方式 配置dcmi   打开dma 打开dcmi中断 选择合适的io 设置reset、pwdn、scl、sda引脚,注意scl和sda设置为开漏输出,之前参考别人的设置为推挽输出,导致一直没有成功,不知道什么原因  配置时钟 配置项目 最后生成代码 系统初始化

    2024年02月13日
    浏览(51)
  • STM32面试相关问题

    总结以下之前面试时遇到的一些问题,以便回顾起来学习! 技术面试一般都是看项目提问的,可能会问: STM32的内核型号有哪些?        回答: ARM Cortex®-M0,M0+,M3, M4和M7内核 ,按内核架构分为不同产品: 主流产品 (STM32F0、STM32F1、STM32F3)、 超低功耗产品 (STM32L0、ST

    2024年02月20日
    浏览(37)
  • 基于STM32、OV2640及ESP8266的无线图传

            本文利用STM32F407单片机、OV2640摄像机模块以及ESP8266 WIFI模块,并基于C#编写的TCP上位机服务,来实现图像的无线传输。         本文受启发于博客:ESP8266+STM32F407+OV7670实现图片传输,在此感谢该文作者。与该文不同的是,本文采用的摄像机模块是0V2640,传输的

    2024年01月18日
    浏览(55)
  • STM32+ov7725+ESP8266实现无线图传-完成上位机图像显示

    stm32f407探索者开发板和STM32F103ZET6战舰开发板。接正点原子ov5640、OV7725、OV2640摄像头,通过esp8266Wi-Fi模块(透传模式)将摄像头采集到的rgb565格式图片通过tcp/ip协议上传到上位机显示。 【1】使用QT开发上位机,建立TCP服务器,接收ESP8266发送过来的图像数据显示。 【2】编写S

    2024年02月08日
    浏览(72)
  • STM32的DMA中FIFO和突发模式理解

    STM32的DMA中FIFO和突发模式理解 学习stm32DMA时遇到了FIFO和突发配置的疑惑,看手册完全云里雾里,节拍是什么等等都不清楚。 首先理解什么是突发,突发传输就是两个设备进行数据传输,一个设备发数据,一个设备接收数据,或者像是CPU到内存进行读取数据,肯定是每读取一

    2024年02月11日
    浏览(26)
  • STM32CubeIDE更新ST LINK驱动失败解决方法

    当使用CubeIDE下载程序时,在这里遇到个STM32CubeIDE需要ST Link更新的提示 弹出 “in order to use the attached ST-LINK with this version of STM32CubeIDE an update of the ST LINK firmware is required” “为了将连接的ST-LINK与此版本的STM32CubeIDE一起使用,需要更新ST-LINK固件” 但是使用Cube更新失败的情况,

    2024年02月16日
    浏览(44)
  • 记录一次对STM32G4串口硬件FIFO的调试

    前言:通常我们使用串口接收多字节数据会使用中断和DMA两种方式。使用中断方式,每接收到一个字节就会触发一次中断,我们可以在中断函数里将接收到的这一字节保存在内存中然后等待其他程序处理,也可以直接在中断函数里处理。使用DMA方式,需要事先开辟一块内存,

    2024年02月09日
    浏览(36)
  • 基于STM32配置PWM的输出和相关GPIO口的配置(有关重映像问题解答)

    使用STM32定时器进行PWM的配置有以下几个步骤,以下是参考例差可以作为历程参考。 在上述PWM初始化函数中使用定时器TIM3和TIM4来输出PWM波,其中为了更好的应用IO口的布局等等TIM3进行了部分重映像的操作,这意味着部分引脚可以使用重映像的操作使之拥有另外的功能,即让

    2024年02月07日
    浏览(50)
  • STM32F407ZGT6控制ESP8266与OV2640下的百度智能图片识别

    前言: STM32F407ZGT6控制OV2640下采集到JPG图片格式的二进制数据,然后对二进制数据进行BASE64编码,接着通过串口将数据传输给ESP8266并上传至训练好的EASYDL的AI算法识别平台进行识别并返回垃圾种类与边缘信息。 STM32与ov2640 ov2640简绍 stm32f407zgt6之dcmi stm32f407zgt6代码 main.c main.h l

    2024年02月04日
    浏览(52)
  • 【正点原子STM32】RS485串行通信标准(串口基础协议 和 MODBUS协议、总线连接、通信电路、通信波形图、RS485相关HAL库驱动、RS485配置步骤、)

    一、RS485介绍 二、RS485相关HAL库驱动介绍 三、RS485配置步骤 四、编程实战 五、总结 串口、UART、TTL、RS232、RS422和RS485之间的关系可以如此理解: 串口 :是一个广义术语,通常指的是采用串行通信协议的接口,它可以包括多种具体的物理接口标准和逻辑电平标准。 UART (通用

    2024年04月13日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包