STM32F103C8T6驱动ov2640拍照串口传输到上位机

使用环境(蓝色粗体字为特别注意内容)
1、软件环境:Keil MDK 5.15
2、硬件环境:STM32F103C8T6最小系统,OV2640摄像头模块

最近想玩玩摄像头,于是在网上找找性价比比较高的摄像头(笔者喜欢用最廉价的东西做最牛逼的事情,给我一根足够长的杠杆,我就能撬动整个宇宙,哈哈哈~~~),之前用过OV7670这款摄像头,不过这款摄像头对单片机要求较高,一般的单片机驱动起来非常费劲,除非ARM级别的微处理器才能够胜任。要想使用低端单片机驱动的话需要加上FIFO模块,一加上这玩意价格就翻了3倍。。。。原来20块钱的东西涨到了70+,我的天。。。。这简直就是打劫嘛,不符合中华民族勤俭节约的传统美德!于是找了大半天,终于找到OV2640这款摄像头,这摄像头是我目前遇到的性价比最高的摄像头了,竟然支持直接输出JPG格式的图片,最高支持1600*1200(200W)像素!!!价格只有带FIFO的OV7670摄像头的一半!而且STM32F103系列单片机就能够轻松驱动(前提是SRAM足够大)。

于是决定使用性价比比较高的STM32F103C8T6这款单片机来驱动,这款单片机单单芯片的话只需8元人民币,而且性能还可以,48脚,RAM20KB,FLASH64K,主频72M,算是性价比较高的了。废话少说,直接上干货,系统连接图如下所示:

 

摄像头采集图像之后通过串口发送到上位机,上位机软件如下:

20k的RAM带起来还是比较吃力的

640*480图片效果如下: 

320*240效果如下

 

 效果基本可以,这得益于笔者在单片机代码中耗尽毕生所学,做了大量的优化工作,比如:能用寄存器操作的部分尽量使用寄存器操作,在循环中精简冗余代码等,将单片机的性能发挥到了极致。其中主函数如下:

int main(void)
{
	u8 res;
	u8 *pname;			//带路径的文件名

	Stm32_Clock_Init(9);		// 系统时钟设置
	uart_init(72, 115200);	        // 串口初始化为115200
	delay_init(72);	   	 	// 延时初始化
	usmart_dev.init(72);		// 初始化USMART
	LED_Init();		        // 初始化与LED连接的硬件接口
	RCC->AHBENR |= RCC_AHBENR_CRCEN;//硬件crc初始化
	delay_ms(5500);
	delay_ms(5500);
	printf("Enter Main \r\n");
	while(OV2640_Init())		 //初始化OV2640
	{
		printf("ov2640 error");
		delay_ms(200);
	}
	printf("ov2640 ok");
	delay_ms(1500);
	OV2640_JPEG_Mode();		  //RGB565模式
	OV2640_OutSize_Set(pic_width, pic_height);
	ov2640_speed_ctrl();

	while(1)
	{
		while(!OV2640_VSYNC)	;
		while(OV2640_VSYNC)	   //等待帧信号
		{
			res = ov2640_jpg_photo(pname);
			delay_ms(10000);
		}

	}
}

如果遇到什么问题可以参考我这篇文章OV2640拍摄jpg图像无法解析

如需帮助,欢迎联系,一起学习探讨技术,交流学习心得。

                                                                                        我是pang9998,谢谢大家

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值