因为摄像头实验例程里,DMA_BufferSize为16位的,最大支持65536,超过该大小的数据会编译不过。分辨率被限制在220*280左右。
然后自己的想法是分多次传输存储到外部SRAM。
外部SRAM地址从0x6800 0000开始,定义一个sram_buf[400*300/2] at0x6800 0000de 的数组用来存储数据
下面代码的基本思路是:有数据时触发中断,每次传输200*150/2的数据,传输完以后地址增加,再穿下一帧。但画面始终不对
是思路错了?还是设置有问题?
[mw_shl_code=applescript,true]void DMA2_Stream1_IRQHandler(void)
{
//u32 addr=0x68000000;
if(DMA_GetFlagStatus(DMA2_Stream1,DMA_FLAG_TCIF1)==SET)//DMA2_Steam1,传输完成标志
{
DCMI_DMA_Init(addr,200*150/2,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);
addr += 200*150/2;
DMA_ClearFlag(DMA2_Stream1,DMA_FLAG_TCIF1);//清除传输完成中断
}
if(addr >= 0x6803A97C)
addr = 0x68000000;
} [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
慢慢改,方法就是这样
原子哥,利用内部SRAM接近成功了
画面的顶部(高度有几个像素高的横条)会一直闪烁
就差一点点了,帮忙看看是不是哪里逻辑错了
下面是DMA的中断函数
[mw_shl_code=c,true]void DMA2_Stream1_IRQHandler(void)
{
u16 i=0;
u16 temp_h,temp_l;
delay_us(300);
if(DMA_GetFlagStatus(DMA2_Stream1,DMA_FLAG_TCIF1)==SET){//DMA2_Steam1,传输完成标志
if(DMA2_Stream1->CR&(1<<19)){//buf0已满,正常处理buf1
for(i=0;i<bufsize;i++){
temp_l=(u16)(yuv422_to_Gray(jpeg_buf0));
if(temp_l>0x7FFF) temp_l = 0xffff;
else temp_l=0x00;
LCD_WriteRAM(temp_l);
temp_h=(u16)(yuv422_to_Gray(jpeg_buf0)>>16);
if(temp_h>0x7FFF) temp_h = 0xffff;
else temp_h=0x00;
LCD_WriteRAM(temp_h);
}
}
else{//buf1已满,正常处理buf0
for(i=0;i<bufsize;i++){
temp_l=(u16)(yuv422_to_Gray(jpeg_buf1));
if(temp_l>0x7FFF) temp_l = 0xffff;
else temp_l=0x00;
LCD_WriteRAM(temp_l);
temp_h=(u16)(yuv422_to_Gray(jpeg_buf1)>>16);
if(temp_h>0x7FFF) temp_h = 0xffff;
else temp_h=0x00;
LCD_WriteRAM(temp_h);
}
}
}
DMA_ClearFlag(DMA2_Stream1,DMA_FLAG_TCIF1);//清除传输完成中断
}[/mw_shl_code]
main函数基本就是初始化了
[mw_shl_code=c,true]void sw_ov2640_mode(void)
{
OV2640_PWDN=0;//OV2640 Power Up
GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_DCMI); //PC8,AF13 DCMI_D2
GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI); //PC9,AF13 DCMI_D3
GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_DCMI); //PC11,AF13 DCMI_D4
}
int main(void)
{
sw_ov2640_mode();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化LED
TIM3_Int_Init(10000-1,8400-1);//10Khz计数,1秒钟中断一次
LCD_Init(); //LCD初始化
FSMC_SRAM_Init(); //初始化外部SRAM.
KEY_Init(); //按键初始化
POINT_COLOR=RED;
while(font_init()) //检查字库
{
LCD_ShowString(30,50,200,16,16,"Font Error!");
delay_ms(200);
LCD_Fill(30,50,240,66,WHITE);//清除显示
delay_ms(200);
}
Show_Str(30,50,200,16,"Explorer STM32F4开发板",16,0);
Show_Str(30,70,200,16,"照相机实验",16,0);
Show_Str(30,90,200,16,"KEY0:拍照(bmp格式)",16,0);
Show_Str(30,110,200,16,"KEY1:拍照(jpg格式)",16,0);
Show_Str(30,130,200,16,"WK_UP:FullSize/Scale",16,0);
Show_Str(30,150,200,16,"2014年5月16日",16,0);
//jpeg_buf0=mymalloc(SRAMIN,bufsize); //为jpeg dma接收申请内存
//jpeg_buf1=mymalloc(SRAMIN,bufsize); //为jpeg dma接收申请内存
//sram_buf=mymalloc(SRAMEX,yuv_sram_buf_size); //为jpeg文件申请内存(最大300KB)
while(OV2640_Init())//初始化OV2640
{
Show_Str(30,190,240,16,"OV2640 错误!",16,0);
delay_ms(200);
LCD_Fill(30,190,239,206,WHITE);
delay_ms(200);
}
Show_Str(30,190,200,16,"OV2640 正常",16,0);
LCD_Clear(WHITE);
OV2640_YUV422_Mode(); //JPEG模式
My_DCMI_Init(); //DCMI配置
//OV2640_ImageWin_Set((1600-480)/2,(1600-800)/2,480,800);//1:1真实尺寸
OV2640_OutSize_Set(width1,height1);
LCD_Set_Window(0,0,width1,height1);
DCMI_DMA_Init((u32)&jpeg_buf0,(u32)&jpeg_buf1,bufsize,DMA_MemoryDataSize_Word,DMA_MemoryInc_Enable);//DCMI DMA配置
DCMI_Stop(); //启动传输
while(1)
{
DCMI_Stop();
DCMI_Start();
LCD_WriteRAM_Prepare();
}
}[/mw_shl_code]
一周热门 更多>