全功能智能车之无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
原来虽说是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
相关文章推荐
- Java SE复习笔记62
- ibator配置文件说明文档
- Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessException
- 为什么要 MySQL 迁移到 Maria DB
- Hibernate原生SQL查询
- android java 在同时支持ipv4 与 ipv6 状况下,仅支持ipv4 或 ipv6的方法(测试中)
- spring和springmvc的配置文件写法
- 单例模式
- 昨天学习的内容
- 面试时如何谈自己的兴趣爱好
- Solr学习 DIH增量、定时导入并检索数据
- http概述
- openwrt-智能路由器hack技术(1)---"DNS劫持"
- 继承与派生
- 【Leetcode】之3Sum Closest
- Oracle GoldenGate的思想天空--感悟OGG的本质
- android:关于serializable
- php生成多条sql记录
- 练习!!!累加求和
- 【应用组件:EventBus】实例演示