野火鹰眼7225摄像头最后完成总结:
1.鹰眼摄像头设置摄像头输出数据大小是不能够实现的,就是说配置摄像头寄存器想要的大小并不能够实现摄像头数据输出自己想要的大小,这个或许是和二值化电路有关,具体不再深究
2.摄像头数据是这样的格式:
每个PLCK上升沿输出八个像素的数据,1表示该像素为黑色,0则为白色,所以用DMA来传输数据,最后要的分辨率是320X240,也就是40*8X240,每次处理一行数据,所以DMA的次数是40,也就说纯数据的数组的大小为40.
u8 Row[40];
u16 dma_size=40;
DMA_InitStructure.DMA_BufferSize = dma_size ;
3.因为每位代表一个像素的黑或者白,如果用不同的显示方法显示一行数据要用40个FOR循环,每个循环执行八个左移,最后代码算数量十分之大,这样的话STM32是肯定跟不上摄像头的,所以这里用了STM32的内存位带操作,这样就不需要左移了,直接判断就行,行中断如下:
//外部中断3服务程序 即行同步信号HREF中断
void EXTI3_IRQHandler(void)
{
u16 j;
u32 *p;
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//是3线的中断
{
MYDMA_Enable(DMA1_Channel4); //TIM3的UPDATE对应DMA的通道3 开始一次DMA传输
p=(u32 *)(0x22000000+(((u32)Row &0xFFFFF)<<5)+0*4); //用位带操作 这样应该能够更加的节省时间
for(j=0;j<320;j++)
{
if(*p) LCD->LCD_RAM=BLACK;
else LCD->LCD_RAM=WHITE;
p++;
}
}
EXTI_ClearITPendingBit(EXTI_Line3); //清除EXTI6线路挂起位
}
4.场中断归零LCD:
//外部中断4服务程序 即场同步信号HREF中断
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4)!=RESET)//是3线的中断
{
LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
LCD_SetCursor(0x00,0x00); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
MYDMA_Enable(DMA1_Channel4); //为了采样第一行数据
LED0=!LED0;
ov_frame ++; //统计帧率
}
EXTI_ClearITPendingBit(EXTI_Line4); //清除EXTI6线路挂起位
}
2016-03-24:
由于有网友反映不知道硬件连接怎么连,这里将我写在书上的笔记上传上来,这里再次说明用的开发板是原子公司的战舰开发板,这里将上传图片,怎么连接请大家仔细琢磨,如有疑问,请邮箱联系,QQ邮箱:[email protected] 这里感谢网友关注。
如果看不清楚,这里看这里的的压缩文件里的图片
http://download.csdn.net/detail/chengdong1314/9471920
源码地址:http://download.csdn.net/detail/chengdong1314/9256119