您的位置:首页 > 其它

全功能智能车之无FIFO摄像头 DMA传送优化(第三篇)

2015-11-03 09:20 169 查看
无FIFO摄像头 DMA传送优化:

原来虽说是DMA传输,但是那是定时器定时触发DMA的,并不是根据摄像头的引脚信号触发的DMA,存在很多的不合理性,这次的程序是用摄像头PCLK引脚来触发DMA。

STM32F103的缺陷:

1.定时器没有回溯清除DMA请求标志的功能,也就是说要启用一个定时器触发中断,在该中断里清除自己的状态位,好让下次的DMA再次请求,

//定时器1触发中断服务程序

void TIM1_TRG_COM_IRQHandler(void)

{

TIM_ClearITPendingBit(TIM1, TIM_IT_Trigger); //清除TIMx的中断待处理位:TIM 中断源

}

2.FSMC没有的LCD没有DMA请求标志,而DMA_Mode_Circular模式每次的DMA传输就是一行的数据,但是最无奈的是LCD外设的速度远远跟不上DMA的速度,造成不能够用DMA把数据直接拷贝到LCD,这是十分坑爹的,十分,十分的无奈!!!!!!!!!

最后只能够在一行的像素数据采集完之后,用for循环把数据放到LCD里!这个有点偏离两个DMA的初衷,十分的无奈,DMA完成中断:

extern u8 Row[640];

void DMA1_Channel4_IRQHandler(void)

{

u16 j;

u16 color;

DMA_ClearITPendingBit(DMA1_IT_GL4);

for(j=0;j<320;j++)

{

color=Row[j*2];

color<<=8;

color|=Row[j*2+1];

LCD->LCD_RAM=color;

}

}

为了保证屏幕不会出现双屏现象,在行中断里归零LCD坐标:

//外部中断4服务程序 即场同步信号HREF中断

void EXTI4_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line4)!=RESET)//是3线的中断

{

LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右

LCD_SetCursor(0x00,0x0000); //设置光标位置

LCD_WriteRAM_Prepare(); //开始写入GRAM

LED0=!LED0;

}

EXTI_ClearITPendingBit(EXTI_Line4); //清除EXTI6线路挂起位

}

每次DMA传送一行数据,所以在行中断里重新使能DMA:

//外部中断3服务程序 即行同步信号HREF中断

void EXTI3_IRQHandler(void)

{

if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//是3线的中断

{

MYDMA_Enable(DMA1_Channel3); //TIM3的UPDATE对应DMA的通道3 开始一次DMA传输

}

EXTI_ClearITPendingBit(EXTI_Line3); //清除EXTI6线路挂起位

}

有图有真相,下面是本实验的图片:









2016-03-24:

由于有网友反映不知道硬件连接怎么连,这里将我写在书上的笔记上传上来,这里再次说明用的开发板是原子公司的战舰开发板,这里将上传图片,怎么连接请大家仔细琢磨,如有疑问,请邮箱联系,QQ邮箱:384710930@qq.com 这里感谢网友关注。















如果看不清楚,这里看这里的的压缩文件里的图片
http://download.csdn.net/detail/chengdong1314/9471920
源码下载:
http://download.csdn.net/detail/chengdong1314/9235795
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: