使用环境(蓝色粗体字为特别注意内容)
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 rn");
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);
}
}
}
我是pang9998,谢谢大家