看完摄像头的寄存器之后,就开始配置摄像头的DMA采集。
还是看网上的大神截图,摄像头的时序。
从中我们可以看出,在行信号之后开始采集PCLK的图像信息。所以我们用PCLK的上升沿触发DMA进行图像采集,DMA目的地址默认加一这样就能实现图像的自动采集,每次行中断过来进行DMA目的地址的修正,具体下面的代码。
// MT9V034 Port Init
void MT_Init(void)
{
uint16_t data = 0;
EXTI_Init(GPIOD,13,rising_up); //行中断
EXTI_Init(GPIOD,14,falling_up); //场中断
GPIO_Init(GPIOD,0,GPI,0); //八位数据输入口
GPIO_Init(GPIOD,1,GPI,0);
GPIO_Init(GPIOD,2,GPI,0);
GPIO_Init(GPIOD,3,GPI,0);
GPIO_Init(GPIOD,4,GPI,0);
GPIO_Init(GPIOD,5,GPI,0);
GPIO_Init(GPIOD,6,GPI,0);
GPIO_Init(GPIOD,7,GPI,0);
SCCB_Init(); //初始化IIC IO口
if(SCB_RegRead(0x5C,MT_VERSION,&data) == 0)//读取摄像头版本寄存器
{
if(data != VERSION) //版本号不对说明出错
{
while(1);
}
}
else
{
while(1);
}

SCB_RegWrite(MT_I2C_ADDR,MT_Mode,0x30a);          //设置摄像头图像4*4分频输出PCLK 27/4 = 6.75M
/*下面的三个配置可以提高图像的稳定性*/
SCB_RegWrite(MT_I2C_ADDR,0x20,0x3C7);
SCB_RegWrite(MT_I2C_ADDR,0x2B,0x003);
SCB_RegWrite(MT_I2C_ADDR,0x2F,0x003);
DMACaptureInit(DMA_CH1,(void*)&PTD_BYTE0_IN,(void*)Image_Data1,PTD12,DMA_BYTE1,Image_Width,DMA_rising_down);//初始化DMA采集
Image_Data1_Status = Captrueing;
Image_Data2_Status = INIT;

}
volatile u8 Image_Data1[Height][Width];
volatile u8 Image_Data2[Height][Width];

u16 Image_Width = Width;//窗口宽度
u16 Image_Height= Height;//窗口高度

/* 状态机 */
typedef enum
{
INIT,
Captrueing,
Finish,
Using
}MT9V034_Status;
MT9V034_Status Image_Data1_Status;
MT9V034_Status Image_Data2_Status;
//摄像头图像采集中断处理函数
void PORTD_IRQHandler(void)
{
static uint32_t h_counter=0;
//行中断PTD13
if((PORTD_ISFR & 0x2000))//行中断 (1<<13)
{
PORTD_ISFR |= 0x2000; //清除中断标识
if(h_counter > Image_Height)
{
h_counter=0;
}

    if(Image_Data1_Status == Captrueing||Image_Data1_Status == Finish){DMA_SetDestAddress(DMA_CH1,(uint32_t)(&Image_Data1[h_counter++][0]));}else if(Image_Data2_Status == Captrueing||Image_Data2_Status == Finish){DMA_SetDestAddress(DMA_CH1,(uint32_t)(&Image_Data2[h_counter++][0]));}DMA_SetMajorLoopCounter(DMA_CH1,Image_Width);DMA_EN(DMA_CH1);    return ;
}
//场中断PTD14
if((PORTD_ISFR & 0x4000))//(1<<14)
{PORTD_ISFR |= 0x4000; //清除中断标识    // 用户程序 if(Image_Data1_Status == Captrueing){if(Image_Data2_Status != Using){Image_Data1_Status = Finish;Image_Data2_Status = Captrueing;   }}else if(Image_Data2_Status == Captrueing){if(Image_Data1_Status != Using){Image_Data2_Status = Finish;Image_Data1_Status = Captrueing;}}else{}h_counter = 0;return ;
}

}
/***************************************************************
* 河南科技大学一队
*
* 函数名称:void DMACaptureInit(DMA_CHn CHn,void *SADDR, void *DADDR,PTXn_e ptxn,DMA_BYTEn byten,u32 count,DMA_PORTx2BUFF_cfg cfg)
* 功能说明:初始化DMA
* 参数说明:
* 函数返回:读取字节
* 修改时间:2018年3月5日
* 备 注:
***************************************************************/
void DMACaptureInit(DMA_CHn CHn,void *SADDR, void *DADDR,PTXn_e ptxn,DMA_BYTEn byten,u32 count,DMA_Count_cfg cfg)
{
u8 BYTEs = (byten == DMA_BYTE1 ? 1 : (byten == DMA_BYTE2 ? 2 : (byten == DMA_BYTE4 ? 4 : 16 ) ) ); //计算传输字节数

//开启时钟
SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;                        //打开DMA模块时钟
SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;                     //打开DMA多路复用器时钟// 配置 DMA 通道 的 传输控制块 TCD ( Transfer Control Descriptor )
DMA_SADDR(CHn) =    (u32)SADDR;                    // 设置  源地址
DMA_DADDR(CHn) =    (u32)DADDR;                    // 设置目的地址
DMA_SOFF(CHn)  =    0;                                  // 设置源地址不变
DMA_DOFF(CHn)  =    BYTEs;                                  // 每次传输后,目的加BYUEsDMA_ATTR(CHn)  =    (0| DMA_ATTR_SMOD(0x0)                // 源地址模数禁止  Source address modulo feature is disabled| DMA_ATTR_SSIZE(byten)             // 源数据位宽 :DMA_BYTEn  。    SSIZE = 0 -> 8-bit ,SSIZE = 1 -> 16-bit ,SSIZE = 2 -> 32-bit ,SSIZE = 4 -> 16-byte| DMA_ATTR_DMOD(0x0)                // 目标地址模数禁止| DMA_ATTR_DSIZE(byten)             // 目标数据位宽 :DMA_BYTEn  。  设置参考  SSIZE);
DMA_CITER_ELINKNO(CHn)  = DMA_CITER_ELINKNO_CITER(count); //当前主循环次数
DMA_BITER_ELINKNO(CHn)  = DMA_BITER_ELINKYES_BITER(count);//起始主循环次数DMA_CR &= ~DMA_CR_EMLM_MASK;                            // CR[EMLM] = 0  disable Minor Loop MappingDMA_NBYTES_MLNO(CHn) =   DMA_NBYTES_MLNO_NBYTES(BYTEs); // 通道每次传输字节数,这里设置为BYTEs个字节。注:值为0表示传输4GB // 配置 DMA 传输结束后的操作
DMA_SLAST(CHn)      =   0;                              //调整源地址的附加值,主循环结束后恢复源地址
DMA_DLAST_SGA(CHn)  =   0;                              //调整目的地址的附加值,主循环结束后恢复目的地址或者保持地址
DMA_CSR(CHn)        =   (0| DMA_CSR_DREQ_MASK            //主循环结束后停止硬件请求| DMA_CSR_INTMAJOR_MASK        //主循环结束后产生中断);// 配置 DMA 触发源
DMAMUX_CHCFG_REG(DMAMUX_BASE_PTR, CHn) = (0| DMAMUX_CHCFG_ENBL_MASK                        // Enable routing of DMA request | DMAMUX_CHCFG_SOURCE((ptxn >> 5) + DMA_Port_A) // 通道触发传输源:     );SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << (ptxn>>5));                                                               //开启PORTx端口
GPIO_PDDR_REG(GPIOX[(ptxn>>5)]) &= ~(1 << (ptxn & 0x1f));                                                       //设置端口方向为输入
PORT_PCR_REG(PORTX[(ptxn>>5)], (ptxn & 0x1F)) = ( 0| PORT_PCR_MUX(1)               // 复用GPIO| PORT_PCR_IRQC(cfg & 0x03 )    // 确定触发模式| ((cfg & 0xc0 ) >> 6)          // 开启上拉或下拉电阻,或者没有);
GPIO_PDDR_REG(GPIOX[(ptxn>>5)]) &= ~(1 << (ptxn && 0x1F));  //开启中断
DMA_EN(CHn);                                    //使能通道CHn 硬件请求
//DMA_IRQ_EN(CHn);                                //允许DMA通道传输

}
/***************************************************************
* 河南科技大学一队
*
* 函数名称:void DMA_SetDestAddress(uint8_t ch,uint32_t address)
* 功能说明:设置DMA传输的目的地址
* 参数说明:
* 函数返回:读取字节
* 修改时间:2018年3月5日
* 备 注:
***************************************************************/
void DMA_SetDestAddress(uint8_t CHn,uint32_t address)
{
DMA_DADDR(CHn) = address; // 设置目的地址
}
/***************************************************************
* 河南科技大学一队
*
* 函数名称:void DMA_SetMajorLoopCounter(uint8_t CHn,uint32_t Val)
* 功能说明:设置传输循环次数
* 参数说明:
* 函数返回:void
* 修改时间:2018年3月5日
* 备 注:
***************************************************************/
void DMA_SetMajorLoopCounter(uint8_t CHn,uint32_t Val)
{
DMA_CITER_ELINKNO(CHn) = DMA_CITER_ELINKNO_CITER(Val); //当前主循环次数
DMA_BITER_ELINKNO(CHn) = DMA_BITER_ELINKYES_BITER(Val);//起始主循环次数
}
这样就行实现图像的采集,但是图像还是有一个黑边,可能和DMA的频率有关KV58的DMA最高频率只有27.5MHZ,虽然我把MT9V034的频率降低到了6.75MHZ,但是采集的余量还不是很大,在使能DMA之后就要进行第一个像素点的采集,有对不齐的现象出现。
DMA时钟配置图,

MT9V034摄像头学习笔记(三)相关推荐

  1. MT9V034摄像头学习笔记(二)

    再次想骂坑爹的龙邱,他们的图像采集摄像头是默认的配置信息.然后靠程序延时采集图像,仅仅就是表面看起来能用而已. MT9V034摄像头内部寄存器 重点内容 内部图像配置寄存器有两套,好像是可以分页使用的 ...

  2. MT9V034摄像头学习笔记(一)

    最近在做智能车,从龙邱买了两个MT9V034摄像头使用,结果坑爹的龙邱只给了摄像头的IO采集程序,配置摄像头的程序,KV58DMA采集都没有写,这就需要自己研究了.因为坑爹的龙邱不给完整的库函数,今天 ...

  3. MT9V034摄像头学习笔记(四)

    DMA采集图像之后就能实现图像的采集了,接下来就要对图像做处理.我这里写了配套的上位机上传上来,又添加前面所说的大津法动态二值化.先看一下上位机的截图 https://download.csdn.ne ...

  4. 【STM32】OV2640摄像头学习笔记 转

    [STM32]OV2640摄像头学习笔记 2019年03月03日 13:01:35 淹死的大白鲨 阅读数 4736更多 分类专栏: [STM32] 版权声明:本文为博主原创文章,遵循 CC 4.0 B ...

  5. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  6. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  7. Ethernet/IP 学习笔记三

    Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...

  8. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  9. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

最新文章

  1. 与15级新加入团队同学的约定
  2. python 面向对象(类)--学习笔记
  3. 关于.net Microsoft.Office.Interop.Word组建操作word的问题,如何控制word表格单元格内部段落的样式。...
  4. URAL 1427. SMS(DP+单调队列)
  5. 【ARM】协处理器指令
  6. git 本地推送本地仓库到远程
  7. hql分页获取数据总数_最简洁的分页插件PageHelper
  8. java并发编程之正确地终止一个线程interrupt/interrupted
  9. SpringMVC详解(四)------SSM三大框架整合之登录功能实现
  10. [转]Using Named Pipes (FIFOs) with Bash
  11. 人行地区代码一览表_世界各国和地区名称代码表
  12. Python入门最完整的基础知识大全【纯干货,建议收藏】
  13. 【PostMan】测试Post请求
  14. windows-xp桌面图标有蓝底怎么去掉:电脑桌面图标有蓝色阴影的解决办法
  15. 2023年全国最新二级建造师精选真题及答案52
  16. 【markdown】表格合并单元格
  17. 【电子电路】五款单按键开关机电路图
  18. 小米K20pro刷international版
  19. yum离线下载依赖包
  20. win7使用命令提示符怎么运行C语言,怎么有效的解决win7系统的命令提示符打开

热门文章

  1. JS——如何利用js实现流星雨效果?
  2. 机械硬盘(HDD)与固态硬盘(SSD)
  3. 2022公司邮箱登录入口官网介绍,个人邮箱用户登录
  4. 速腾激光雷达 xavier环境驱动配置踩坑记录
  5. C语言中如何测量各种变量的长度
  6. JavaFx界面功能隐藏和禁用
  7. 如何进bios设置ssd固态硬盘为第一启动
  8. APP首次启动提示开启定位服务
  9. document image inpaint
  10. 消息称魅族将首发Helio X30:今年用联发科是最好选择