我在用正点原子的ov5640配置表配置了摄像头然后启动摄像头,图像数组放在内部sram中,uint16_t ov5640_buffer[240*240];
这里的话我启动了色块测试模式,理论上画面应该是彩条
[C] 纯文本查看 复制代码 HAL_DCMI_Stop(&hdcmi);
OV5640_RESET_RESET;
OV5640_POWER_ON;
HAL_Delay(10);
OV5640_RESET_SET;
HAL_Delay(10);
OV5640_POWER_ON;
OV5640_WG(0X3008,0X82); //软复位
HAL_Delay(10);
uint16_t id;
id=OV5640_RG(OV5640_CHIPIDH)<<8|OV5640_RG(OV5640_CHIPIDL);
if(id==OV5640_ID)
LOAD("Read Sensor Id:%X\r\n",id);
else{
ERROR("OV5640 NOT FOUND WITH %X\r\n",id);
}
HAL_Delay(10);
for(int i=0;i<sizeof(ov5640_init_reg_tbl)/4;i++)
{
OV5640_WG(ov5640_init_reg_tbl[i][0],ov5640_init_reg_tbl[i][1]);
}
//OV5640_Focus_Init();
//OV5640_Light_Mode(0); //自动模式
//OV5640_Color_Saturation(3); //色彩饱和度0
//OV5640_Brightness(4); //亮度0
//OV5640_Contrast(3); //对比度0
//OV5640_Sharpness(33); //自动锐度
//OV5640_Focus_Constant(); //启动持续对焦
OV5640_OutSize_Set(0,0,240,240);
OV5640_RGB565_Mode();
OV5640_Test_Pattern(2);
//INFO("Use mem of %p---%p\r\n",ov5640_buffer,(&ov5640_buffer[640*480]));
if(HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)ov5640_buffer,120*240)!=HAL_OK)
ERROR("Start Fail\r\n");
然后在Frame中断中再次开启DCMI_IT_FRAME中断,同时使用DMA2D搬运图像数组到显存
[C] 纯文本查看 复制代码 void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi)
{
HAL_DCMI_Stop(hdcmi);
__HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME);
LTDC_Color_Fill(0,0,240,240,ov5640_buffer);
}
然后在DMA2D的中断中再次开启摄像,但是在ltdc显示是就会出现这样的情况
这是我的LTDC填充函数
[C] 纯文本查看 复制代码 void LTDC_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color)
{
uint32_t psx,psy,pex,pey; //以LCD面板为基准的坐标系,不随横竖屏变化而变化
uint16_t offline;
uint32_t addr;
//坐标系转换
if(lcdltdc.dir) //横屏
{
psx=sx;psy=sy;
pex=ex;pey=ey;
}else //竖屏
{
psx=sy;psy=lcdltdc.pheight-ex-1;
pex=ey;pey=lcdltdc.pheight-sx-1;
}
offline=lcdltdc.pwidth-(pex-psx+1);
addr=((uint32_t)ltdc_framebuf[lcdltdc.activelayer]+lcdltdc.pixsize*(lcdltdc.pwidth*psy+psx));
RCC->AHB3ENR|=1<<4; //使能DMA2D时钟
DMA2D->CR&=~(1<<0); //先停止DMA2D
DMA2D->CR=0<<16; //存储器到存储器模式
DMA2D->FGPFCCR=LCD_PIXFORMAT; //设置颜色格式
DMA2D->FGOR=0; //前景层行偏移为0
DMA2D->OOR=offline; //设置行偏移
DMA2D->FGMAR=(uint32_t)color; //源地址
DMA2D->OMAR=addr; //输出存储器地址
DMA2D->NLR=(pey-psy+1)|((pex-psx+1)<<16); //设定行数寄存器
__HAL_DMA2D_ENABLE_IT(&hdma2d,DMA2D_IT_TC);
__HAL_DMA2D_ENABLE(&hdma2d);
// DMA2D->CR|=1<<0; //启动DMA2D
}
求教一下,我感觉是搬运函数有问题,但是不知道怎么修改
|