所需硬件:
1.stm32 103ZET6核心板,没有lcd(调试摄像头一定要买一个lcd,太方便了,都是泪);
2.OV7670带FIFO淘宝一搜一大把最常见的那种;
驱动代码:参考正点原子官方例程 实验35摄像头实验;也可以使用淘宝卖家提供的例程,ov7670寄存器配置有点麻烦,也懒得研究,刚开始调试的时候不出图像,换了几个版本的寄存器配置最后还是换回去用了正点原子的,毕竟大厂还是有保障的;没有lcd的话会调试到你怀疑人生,不知道是上位机写的不好用还是驱动没写好,所以最好还是买一块lcd进行调试;
初始化摄像头的时候如果错误,红灯会亮起一直初始化完成,也可以接串口看返回的错误代码;当发送图片给的时候绿灯会亮起,表示正在发送,发送完成绿灯灭;
我是直接把要发送到屏幕的数据直接发送到上位机,上位机有协议的要加上协议,数据头和尾巴;还有要区分32库函数printf和USART_SendData()的区别,区分发送的数据是字符还是十六进制原始数据,数据长度要计算清楚;我才采集的是320*240 RGB565的图像,得到的是16位数据,串口一次只能发送8位,所以分成两个字节发送,也就是发送的图像数据量是320*240*2,一定要区分发送字节的高位低位,很重要很重要很重要,上位机RGB565转RGB888要用得到,直接决定显示的成败;
但是用printf发送,如果用我这种方式发送,发送的是字符,prinft("%04X", color);如果color=0xFEA5,串口收到的是'F' 'E' 'A' '5',在上位机上还有一步转化操作,所以发送的数据量就是320*240*2*2(至于我为什么这么写,完全是为了兼容我的上位机,上位机是参考的别人代码,懒得大改了,c#不是很熟练,就在MCU上动手脚了),这个地方也会有一个问题,printf()发送速度会比USART_SendData()速度慢,可能会导致上位机显示的图像有线条。线条问题最后是通过提高波特率解决的,用的200000;
void camera_refresh1(void)//更新LCD显示
{
u32 w,h;
u16 color;
if(ov_sta)//有帧中断更新?
{
OV7670_RRST=0; //开始复位读指针
OV7670_RCK_L;
OV7670_RCK_H;
OV7670_RCK_L;
OV7670_RRST=1; //复位读指针结束
OV7670_RCK_H;
printf("data:n");
for(w=0;w<240;w++)//数据开始(从上往下,从左往右)
//width:输出图像宽度,<=240
//height:输出图像高度,<=320
{
printf("L");//列有效
for(h=0;h < 320;h++)//一列
{
OV7670_RCK_L;
color=GPIOF->IDR&0XFF; //读数据
OV7670_RCK_H;
color<<=8;
OV7670_RCK_L;
color|=GPIOF->IDR&0XFF; //读数据
OV7670_RCK_H;
printf("%04X", color);// printf发送的是字符串
//delay_us(50);
}
printf("n");
}
ov_sta=0; //清零帧中断标记
ov_frame++;
}
}
上位机开发语言:C#,参考连接https://blog.csdn.net/zyxhangiian123456789/article/details/79163959,加了图像采集和测试按钮,改进了保存图片的方式;
测试按钮是测试上位机和单片机死否通信正常,点击此按钮会给单片机发送一组指令,让单片机绿灯闪烁两次,代表通信正常;
采集按钮是发送指令让单片机拍照上传,点击后绿灯亮起,代表正在发送数据,绿灯灭后代表数据发送完毕,如果上位机没有显示图像则代表发送失败;
保存按钮改进了原作者只能覆盖保存的功能,点击保存会连续保存不会覆盖上一张保存的照片;
数据发送高位地位和原作者有区别;
有些修改的地方:
上位机github地址:https://github.com/WW-0/OV7670-PC/upload/master
32+上位机代码下载:https://download.csdn.net/download/qq_34824576/12407112
上位机参考连接:https://blog.csdn.net/zyxhangiian123456789/article/details/79163959
https://github.com/jack13163/OV7670
所需硬件:
1.stm32 103ZET6核心板,没有lcd(调试摄像头一定要买一个lcd,太方便了,都是泪);
2.OV7670带FIFO淘宝一搜一大把最常见的那种;
驱动代码:参考正点原子官方例程 实验35摄像头实验;也可以使用淘宝卖家提供的例程,ov7670寄存器配置有点麻烦,也懒得研究,刚开始调试的时候不出图像,换了几个版本的寄存器配置最后还是换回去用了正点原子的,毕竟大厂还是有保障的;没有lcd的话会调试到你怀疑人生,不知道是上位机写的不好用还是驱动没写好,所以最好还是买一块lcd进行调试;
初始化摄像头的时候如果错误,红灯会亮起一直初始化完成,也可以接串口看返回的错误代码;当发送图片给的时候绿灯会亮起,表示正在发送,发送完成绿灯灭;
我是直接把要发送到屏幕的数据直接发送到上位机,上位机有协议的要加上协议,数据头和尾巴;还有要区分32库函数printf和USART_SendData()的区别,区分发送的数据是字符还是十六进制原始数据,数据长度要计算清楚;我才采集的是320*240 RGB565的图像,得到的是16位数据,串口一次只能发送8位,所以分成两个字节发送,也就是发送的图像数据量是320*240*2,一定要区分发送字节的高位低位,很重要很重要很重要,上位机RGB565转RGB888要用得到,直接决定显示的成败;
但是用printf发送,如果用我这种方式发送,发送的是字符,prinft("%04X", color);如果color=0xFEA5,串口收到的是'F' 'E' 'A' '5',在上位机上还有一步转化操作,所以发送的数据量就是320*240*2*2(至于我为什么这么写,完全是为了兼容我的上位机,上位机是参考的别人代码,懒得大改了,c#不是很熟练,就在MCU上动手脚了),这个地方也会有一个问题,printf()发送速度会比USART_SendData()速度慢,可能会导致上位机显示的图像有线条。线条问题最后是通过提高波特率解决的,用的200000;
void camera_refresh1(void)//更新LCD显示
{
u32 w,h;
u16 color;
if(ov_sta)//有帧中断更新?
{
OV7670_RRST=0; //开始复位读指针
OV7670_RCK_L;
OV7670_RCK_H;
OV7670_RCK_L;
OV7670_RRST=1; //复位读指针结束
OV7670_RCK_H;
printf("data:n");
for(w=0;w<240;w++)//数据开始(从上往下,从左往右)
//width:输出图像宽度,<=240
//height:输出图像高度,<=320
{
printf("L");//列有效
for(h=0;h < 320;h++)//一列
{
OV7670_RCK_L;
color=GPIOF->IDR&0XFF; //读数据
OV7670_RCK_H;
color<<=8;
OV7670_RCK_L;
color|=GPIOF->IDR&0XFF; //读数据
OV7670_RCK_H;
printf("%04X", color);// printf发送的是字符串
//delay_us(50);
}
printf("n");
}
ov_sta=0; //清零帧中断标记
ov_frame++;
}
}
上位机开发语言:C#,参考连接https://blog.csdn.net/zyxhangiian123456789/article/details/79163959,加了图像采集和测试按钮,改进了保存图片的方式;
测试按钮是测试上位机和单片机死否通信正常,点击此按钮会给单片机发送一组指令,让单片机绿灯闪烁两次,代表通信正常;
采集按钮是发送指令让单片机拍照上传,点击后绿灯亮起,代表正在发送数据,绿灯灭后代表数据发送完毕,如果上位机没有显示图像则代表发送失败;
保存按钮改进了原作者只能覆盖保存的功能,点击保存会连续保存不会覆盖上一张保存的照片;
数据发送高位地位和原作者有区别;
有些修改的地方:
上位机github地址:https://github.com/WW-0/OV7670-PC/upload/master
32+上位机代码下载:https://download.csdn.net/download/qq_34824576/12407112
上位机参考连接:https://blog.csdn.net/zyxhangiian123456789/article/details/79163959
https://github.com/jack13163/OV7670
举报