我想用f4+ov2640做颜 {MOD}识别,基本原理是摄像头捕获一帧数据,关闭DMA,调用lcd读点函数读取颜 {MOD}值,处理过后开启DMA传输下一帧数据。用的是原子的摄像头实验的程序并做了些修改。结果lcd只显示一次,之后再也不刷新了。但是LED1灯一直闪。
//DCMI中断服务函数
void DCMI_IRQHandler(void)
{
if(DCMI_GetITStatus(DCMI_IT_FRAME)==SET)//捕获到一帧图像
{
rgb_data_process();
每来一次帧中断进入这个函数处理。
DCMI_ClearITPendingBit(DCMI_IT_FRAME);//清除帧中断
LED1=!LED1;
ov_frame++;
}
}
下面是main.c里面的函数。
void rgb_data_process(void)
在这个函数里面开启或者关闭dma。
{
if(rgb_data_ok==0) //rgb数据还未采集完?
{
DMA_Cmd(DMA2_Stream1,DISABLE);//关闭DMA2,Stream1
while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置
rgb_data_ok=1; //标记rgb数据采集完按成,等待其他函数处理
}
if(rgb_data_ok==2) //上一次的rgb数据已经被处理了
{
DMA2_Stream1->NDTR=1;
LCD_SetCursor(0,0);
DMA_Cmd(DMA2_Stream1,ENABLE);//开启DMA2,Stream1
rgb_data_ok=0; //标记数据未采集
}
}
//RGB565测试
//RGB数据直接显示在LCD上面
void rgb565_test(void)
{
u8 key;
u8 effect=0,saturation=2,contrast=2;
u8 scale=1; //默认是全尺寸缩放
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 RGB565 Mode");
LCD_ShowString(30,100,200,16,16,"KEY0:Contrast"); //对比度
LCD_ShowString(30,130,200,16,16,"KEY1:Saturation"); // {MOD}彩饱和度
LCD_ShowString(30,150,200,16,16,"KEY2:Effects"); //特效
LCD_ShowString(30,170,200,16,16,"KEY_UP:FullSize/Scale"); //1:1尺寸(显示真实尺寸)/全尺寸缩放
OV2640_RGB565_Mode(); //RGB565模式
My_DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置
OV2640_OutSize_Set(lcddev.width,lcddev.height);
DCMI_Start(); //启动传输
while(1)
{
if(rgb_data_ok==1) //已经采集完一帧图像了
{
LCD_Read(115,160);
----->这一部分进行lcd的读点和颜 {MOD}值的处理。
equr=(G[0]+G[1]+G[2]+G[3]+G[4]+G[5])/6;
if(0x35<equr&&equr<0x39)
{
LED0=!LED0;
}
rgb_data_ok=2; //标记rgb数据处理完了,可以让DMA去采集下一帧了.
}
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
usart2_init(42,115200); //初始化串口2波特率为115200
LED_Init(); //初始化LED
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,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"OV2640 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/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");
rgb565_test();
}
STM32F4摄像头.zip
(7.12 MB, 下载次数: 24517)
2016-4-13 17:47 上传
点击文件名下载附件
找到原因了,少了一句 : LCD_WriteRAM_Prepare();
不会出问题,M4的速度还是够快的,你把DCMI设置成快照模式就行了。
请问原子哥,问题在哪里啊
一周热门 更多>