本帖最后由 一匹夫尓 于 2018-3-15 23:25 编辑
请教一个问题:现在是这样的,我要用一个触发信号控制F4用0V2640拍照,获取一帧数据之后彩信发出去,我修改了原子哥的程序,但是用串口看得数据 一直都是有两帧(Size:VGA),其他图片大小的也是两帧。 我想请教一下,我要如何才能这个触发信号来了,就拍一次照片,每次只要一张照片,然后不需要一直DMA传输,相当于一个触发信号就做一次数据处理,处理完就关掉。不知道描述的有没有问题,但大意是这样的。
以下是我的代码 修改自原子哥的程序(做毕业设计 应该不算其他用途吧)只修改了这两部分:
void jpeg_test(void)
{
u32 i;
u8 *p;
u8 key;
u8 effect=0,saturation=2,contrast=2;
u8 size=1; //默认是QVGA 320*240尺寸
u8 msgbuf[15]; //消息缓存区
LCD_Clear(WHITE);
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4");
LCD_ShowString(30,70,200,16,16,"OV2640 JPEG Mode");
LCD_ShowString(30,100,200,16,16,"KEY0:Contrast"); //对比度
LCD_ShowString(30,120,200,16,16,"KEY1:Saturation"); // {MOD}彩饱和度
LCD_ShowString(30,140,200,16,16,"KEY2:Effects"); //特效
LCD_ShowString(30,160,200,16,16,"KEY_UP:Size"); //分辨率设置
sprintf((char*)msgbuf,"JPEG Size:%s",JPEG_SIZE_TBL[size]);
LCD_ShowString(30,180,200,16,16,msgbuf); //显示当前JPEG分辨率
OV2640_JPEG_Mode(); //JPEG模式
My_DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&jpeg_buf,jpeg_buf_size,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//DCMI DMA配置
OV2640_OutSize_Set(jpeg_img_size_tbl[size][0],jpeg_img_size_tbl[size][1]);//设置输出尺寸
DCMI_Start(); //启动传输
if(jpeg_data_ok==1) //已经采集完一帧图像了
{
DCMI_Stop();
BEEP = 1;
p=(u8*)jpeg_buf;
LCD_ShowString(30,210,210,16,16,"Sending JPEG data..."); //提示正在传输数据
for(i=0; i<jpeg_data_len*4; i++) //dma传输1次等于4字节,所以乘以4.
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART1,p
);
key=KEY_Scan(0);
if(key)break;
}
BEEP = 0;
jpeg_data_len = 0;
LCD_ShowString(30,210,210,16,16,"Send data complete!!");//提示传输结束设置
jpeg_data_ok=2; //标记jpeg数据处理完了,可以让DMA去采集下一帧了.
}
}
int main(void)
{
u8 key;
u8 t;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
usart2_init(42,115200); //初始化串口2波特率为115200
LED_Init(); //初始化LED
BEEP_Init(); //蜂鸣器初始化
LCD_Init(); //LCD初始化
KEY_Init(); //按键初始化
//TIM3_Int_Init(10000-1,8400-1);//10Khz计数,1秒钟中断一次
usmart_dev.init(84); //初始化USMART
POINT_COLOR=RED;//设置字体为红 {MOD}
LCD_ShowString(30,50,200,16,16,"Test Code ");
LCD_ShowString(30,70,200,16,16,"Code ver 1.0");
LCD_ShowString(30,90,200,16,16,"xxxxxxxxx");
LCD_ShowString(30,110,200,16,16,"2018/3/14");
while(OV2640_Init())//初始化OV2640
{
LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
delay_ms(200);
LCD_Fill(30,130,239,170,WHITE);
delay_ms(200);
}
LCD_ShowString(30,130,200,16,16,"OV2640 OK");
LCD_ShowString(30,150,200,16,16,"SIM800C OK");
LCD_ShowString(30,170,200,16,16,"KEY0:Run Mode");
LCD_ShowString(30,190,200,16,16,"KEY1
ebug Mode");
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES) //RGB565模式
{
rgb565_test();
}
else if(key==KEY1_PRES) //JPEG模式
{
ov2640_mode = 1;
jpeg_test();
}
}
}
望不吝赐教
DCMI_Start(); //启动传输
while(jpeg_data_ok!=1); //等待第一帧图片采集完
jpeg_data_ok=2; //忽略本帧图片,启动下一帧采集
while(jpeg_data_ok!=1); //等待第二帧图片采集完
jpeg_data_ok=2; //忽略本帧图片,启动下一帧采集
while(jpeg_data_ok!=1); //等待第三帧图片采集完,第三帧,才保存到SD卡去.
这里三帧保存最后一帧的意思是保证数据的完整性吗
一周热门 更多>