用mini版做ov7670的图像采集至sd卡的实验,但是用下面的程序总是采集不够数据……求指导:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "gpio.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "lcd.h"
#include "fifo.h"
#include "OV7670.h"
#include "my_camera.h"
u16 a,data;
extern u8 status;
u16 i,j;
u8 res;
FATFS fatfs;
UINT WRBytes;
FIL fileW;
u16 Line_buf[240];
void WriteHeader(FIL* file)
{
UINT WRBytes;
u8 BMP_header[14];
BITMAPFILEHEADER* bmph;
bmph=(BITMAPFILEHEADER*)BMP_header;
bmph->bfType=0x4d42;
bmph->bfSize=0x25836;//文件大小,待定
bmph->bfReserved1=0;//保留,必须设置为0
bmph->bfReserved2=0;
bmph->bfOffBits=54;//从文件头到位图数据所需偏移字节
f_write(file,BMP_header,14,&WRBytes);
}
void WriteBMPInfo(FIL* file)
{
UINT WRBytes;
u8 BMP_info[40];
BITMAPINFOHEADER* bmpi;
bmpi=(BITMAPINFOHEADER*)BMP_info;
bmpi->biSize=40;
bmpi->biWidth=240;
bmpi->biHeight=320;
bmpi->biPlanes=1;
bmpi->biBitCount=16;
bmpi->biCompression=0;
bmpi->biSizeImage=0;
bmpi->biXPelsPerMeter=0;
bmpi->biYPelsPerMeter=0;
bmpi->biClrUsed=0;
bmpi->biClrImportant=0;
f_write(file,BMP_info,40,&WRBytes);
}
int main(void)
{
Stm32_Clock_Init(9);//系统时钟初始化
Delay_Init(72);//延时初始化
usart_init(72,9600);//串口1初始化
LED_Init();
JTAG_Set(JTAG_SWD_DISABLE);
FIFO_GPIO_Init();
FIFO_OE_CLR;//FIFO数据允许读出
FIFO_WE_SET;//允许写入FIFO
while(OV7670_Init()); //初始化OV7670
FIFO_RRST_CLR;
FIFO_RCK_CLR;
FIFO_RCK_SET;
FIFO_RCK_CLR;
FIFO_RRST_SET;
FIFO_RCK_SET;
status=0;
while(1)
{
if(status==2)
{
res=f_mount(0, &fatfs);
while(res)printf("SD mount failed!\n");
res=f_open(&fileW,"0:/output/ph1.bmp",FA_OPEN_ALWAYS|FA_WRITE);//创建并打开
while(res)printf("file create failed!\n");
WriteHeader(&fileW);
WriteBMPInfo(&fileW);
led0=0;
FIFO_RRST_CLR; //读复位
FIFO_RCK_CLR;
FIFO_RCK_SET;
FIFO_RCK_CLR;
FIFO_RRST_SET;
FIFO_RCK_SET;
for(j=0;j<9600;j++)
{
//1
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
//2
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
//3
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
//4
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
//5
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
//6
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
//7
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
//8
FIFO_RCK_CLR;
data=GPIOB->IDR &0x00ff;
FIFO_RCK_SET;
data<<=8;
FIFO_RCK_CLR;
data|=GPIOB->IDR&0x00ff;
FIFO_RCK_SET;
f_write(&fileW,(u8*)RGB565toRGB555(data),2,&WRBytes);
}
f_close(&fileW);
led0=1;
led1=0;
f_mount(0,NULL);
while(1);
}
}
}
采到的图像只有64.5 KB (66,048 字节),但理论上应该有150 KB (153,654 字节)啊,主体程序是用着论坛里一位大神的程序(读ov7670到lcd的ram)的改编,当时就不是很清楚要有8小段程序的重复,是因为控制时钟的问题吗?
求大神指导啊……感谢
|