DCMI简介

STM32F4DCMI接口包括如下信号

1,数据据输入(D[0:13]),接摄像头的数据输出。

2,水平同步(行同步)输入(HSYNC),接摄像头的HSYNC/HREF信号,用于确定一行数据的接收情况。

3,垂直同步(场同步)输入(VSYNC),接摄像头的VSYNC信号,用于确定一帧数据的接收情况。

4,像素时钟输入(PIXCLK),接摄像头的PCLK信号,同步时钟,数据接收同步信号。

DCMI接口的数据与PIXCLK(即PCLK)保持同步,并根据像素时钟的极性在像素时钟上升沿/下降沿发生变化。HSYNCHREF)信号指示行的开始/结束,VSYNC信号指示帧的开始/结束。

DCMI的使用

1、配置时钟,初始化IO口

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE, ENABLE); //使能GPIOA B C E 时钟RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE); //使能DCMI时钟//PA4/6初始化设置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; //PA4/6   复用功能输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6; // PB6/7   复用功能输出GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11; //PC6/7/8/9/11 复用功能输出GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; //PE5/6  复用功能输出GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI); //PA4  DCMI_HSYNCGPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI); //PA6  DCMI_PCLKGPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI); //PB7  DCMI_VSYNCGPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI); //PC6  DCMI_D0GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI); //PC7  DCMI_D1GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_DCMI); //PC8  DCMI_D2GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_DCMI); //PC9  DCMI_D3GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_DCMI); //PC11 DCMI_D4GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI); //PB6  DCMI_D5GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_DCMI); //PE5  DCMI_D6GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_DCMI); //PE6  DCMI_D7

2、根据时序配置DCMI接口

DCMI_DeInit();//清除原来的设置
DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; //连续模式
DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; //全帧捕获
DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; //8位数据格式
DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low; //HSYNC 低电平有效
DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising; //PCLK 上升沿有效
DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; //硬件同步HSYNC,VSYNC
DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_Low; //VSYNC 低电平有效
DCMI_Init(&DCMI_InitStructure);
DCMI_Cmd(ENABLE);   //DCMI使能
//中断视情况配置
DCMI_ITConfig(DCMI_IT_FRAME, ENABLE); //开启帧中断
NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
代码 DCMI 初始化结构体
1 /**
2 * @brief DCMI 初始化结构体
3 */
4 typedef struct
5 {
6 uint16_t DCMI_CaptureMode; /*选择连续模式或拍照模式 */
7 uint16_t DCMI_SynchroMode; /*选择硬件同步模式还是内嵌码模式 */
8 uint16_t DCMI_PCKPolarity; /*设置像素时钟的有效边沿*/
9 uint16_t DCMI_VSPolarity; /*设置 VSYNC 的有效电平*/
10 uint16_t DCMI_HSPolarity; /*设置 HSYNC 的有效边沿*/
11 uint16_t DCMI_CaptureRate; /*设置图像的采集间隔 */
12 uint16_t DCMI_ExtendedDataMode; /*设置数据线的宽度 */
13 } DCMI_InitTypeDef;

这些结构体成员说明如下,其中括号内的文字是对应参数在 STM32 标准库中定义的宏:
(1) DCMI_CaptureMode
本成员设置 DCMI的捕获模式,可以选择为连续摄像(DCMI_CaptureMode_Continuous)
或单张拍照 DCMI_CaptureMode_SnapShot。
(2) DCMI_SynchroMode
本成员设置 DCMI数据的同步模式,可以选择为硬件同步方式
(DCMI_SynchroMode_Hardware)或内嵌码方式(DCMI_SynchroMode_Embedded)。
(3) DCMI_PCKPolarity
本成员用于配置 DCMI接口像素时钟的有效边沿,即在该时钟边沿时,DCMI会对数
据线上的信号进行采样,它可以被设置为上升沿有效(DCMI_PCKPolarity_Rising)或下
降沿有效(DCMI_PCKPolarity_Falling)。
(4) DCMI_VSPolarity
本成员用于设置 VSYNC 的有效电平,当 VSYNC 信号线表示为有效电平时,表示新
的一帧数据传输完成,它可以被设置为高电平有效(DCMI_VSPolarity_High)或低电平
有效(DCMI_VSPolarity_Low)。
(5) DCMI_HSPolarity
类似地,本成员用于设置 HSYNC 的有效电平,当 HSYNC 信号线表示为有效电平时,
表示新的一行数据传输完成,它可以被设置为高电平有效(DCMI_HSPolarity_High)或
低电平有效(DCMI_HSPolarity_Low)。
(6) DCMI_CaptureRate
本成员可以用于设置 DCMI捕获数据的频率,可以设置为全采集、半采集或 1/4 采集
(DCMI_CaptureRate_All_Frame/ 1of2_Frame/ 1of4_Frame),在间隔采集的情况下,
STM32的 DCMI外设会直接按间隔丢弃数据。
(7) DCMI_ExtendedDataMode
本成员用于设置 DCMI的数据线宽度,可配置为 8/10/12及 14位数据线宽
(DCMI_ExtendedDataMode_8b/10b/12b/14b)。
配置完这些结构体成员后,我们调用库函数 DCMI_Init 即可把这些参数写入到 DCMI
的控制寄存器中,实现 DCMI的初始化。

DCMI的DMA传输

DCMI接收到的数据,存储在DCMI_DR寄存器(32位)里面,我们采用8位数据宽度,所以每4个像素时钟,才会捕获完32位数据,第一个字节存放在LSB位置,第四个字节存放在MSB位置,如下图所示:

DCMI支持DMA传输,当DCMI_CR寄存器中的CAPTURE位置1时,激活DMA接口。摄像头接口每次在其寄存器(DCMI_DR)中收到一个完整的32位数据块时,都将发一个DMA请求,由DMA将DCMI_DR寄存器的值搬运到目的地址。

/*** @brief  配置 DCMI/DMA 以捕获摄像头数据* @param  DMA_Memory0BaseAddr:本次传输的目的首地址* @param DMA_BufferSize:本次传输的数据量(单位为字,即4字节)*/
void OV2640_DMA_Config(uint32_t DMA_Memory0BaseAddr,uint16_t DMA_BufferSize)
{DMA_InitTypeDef  DMA_InitStructure;/* 配置DMA从DCMI中获取数据*//* 使能DMA*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);  DMA_Cmd(DMA2_Stream1,DISABLE);while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}   DMA_InitStructure.DMA_Channel = DMA_Channel_1;  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;//外设地址为:DCMI->DRDMA_InitStructure.DMA_Memory0BaseAddr = DMA_Memory0BaseAddr;//DMA传输的目的地址(传入的参数) DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;DMA_InitStructure.DMA_BufferSize =DMA_BufferSize; //传输的数据大小(传入的参数)DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//数据地址,自增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC8;DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/*DMA初始化 */DMA_Init(DMA2_Stream1, &DMA_InitStructure);DMA_Cmd(DMA2_Stream1,ENABLE);while(DMA_GetCmdStatus(DMA2_Stream1) != ENABLE){}
}

传输设置

//DCMI,启动传输
void DCMI_Start(void)
{  DMA_Cmd(DMA2_Stream1, ENABLE);//开启DMA2,Stream1 DCMI_CaptureCmd(ENABLE);//DCMI捕获使能
}
//DCMI,关闭传输
void DCMI_Stop(void)
{ DCMI_CaptureCmd(DISABLE);//DCMI捕获使关闭  while(DCMI->CR&0X01);        //等待传输结束 DMA_Cmd(DMA2_Stream1,DISABLE);//关闭DMA2,Stream1
}

stm32f4的数字摄像头接口(DCMI)使用相关推荐

  1. STM32F407传输OV2640视频数据并在PC端显示

    一.整体架构 STM32使用DCMI驱动OV2640,DMA通道获取图像数据,然后通过以太网将数据发送至PC端,PC端通过socket接收数据,并用BufferedImage将其显示.(PC端使用的j ...

  2. 基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

    硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670 ...

  3. 通信管理员(一)居于MAC地址的网络通信

    通信管理员(一)居于MAC地址的网络通信 文章目录 前言 一.居于MAC的网络通信的互联网物理地址PA分配 二.路由器和终端设备(主机) 总结 前言 没有办法,这将是一场持久战,要劳逸结合.到处游玩( ...

  4. 滚球经验总结(PID)

    1.正点原子STM32F407探索者 + openmv3--串口通信 最近在用stm32f407探索者做滚球,一开始使用的摄像头是openmv3(openmv4太贵)--实时检测小球坐标(x,y),然 ...

  5. STM32F4驱动OV7670总结

    前言:之前因为贪图便宜买了一个7块钱的ov7670摄像头,然后想用我的stm32开发板驱动起来结合rtthread做个小项目出来,但是一路上遇到了许多问题,最终没能成功,在此记录一下用stm32驱动o ...

  6. STM32F4外设配置速查【OV2640摄像头部分】

    文章目录 OV2640 SCCB时序 基本概念简介 行输出时序 帧输出时序 JPEG时序 相关硬件配置 OV2640传感器窗口设置 图像尺寸设置 图像窗口设置 图像输出大小设置(缩放设置) OV264 ...

  7. (40)STM32——OV2640摄像头实验

    目录 学习目标 运行结果 内容 OV2640 特点 时序 帧输出时序 配置 DCMI 特点 信号 DMA 寄存器 配置 硬件连接 代码 总结 学习目标 今天我们要学习的是OV2640摄像头实验,采用的 ...

  8. 基于STM32F407摄像头实验(有代码)

    1.OV2640 简介 OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(16321232)图像 传感器.该传感器体积小.工作电压低,提供单片 UXGA ...

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

    目录: 一.OV2640 Camera 二.读取OV2640模块图像数据过程: 三.DCMI(Digital camera interface)接口 四.SCCB协议 1.起始信号 2.停止信号 五. ...

  10. STM32 F4 OV2640摄像头学习笔记(三)

    四.DCMI(Digital camera interface)接口 功能描述 STM32F4 自带了一个数字摄像头(DCMI)接口,该接口是一个同步并行接口,能够接收外部8位.10位.12位或14位 ...

最新文章

  1. Confluence 6 数据库结构图
  2. HBuilder完成webApp入门(3) 关于webview (转)
  3. kalman滤波在雷达目标跟踪中的应用_简述Automotive radar中的多目标跟踪处理
  4. 深入理解JVM逃逸分析
  5. esb接口测试_接口测试用例.docx
  6. html文字自适应屏幕居中显示,DIV+CSS经典布局[宽度自适应][自动屏幕居中]的实现...
  7. python自学看什么书-有什么好的自学 Python 的书籍推荐?
  8. PR预设 16个毛刺效果抖音故障特效视频转场PR预设V2版本
  9. PyTorch 体验感悟
  10. Hadoop技术博文祝大家新年快乐
  11. 人人网发布QQ劝架补丁 同时兼容QQ及360
  12. 小米2022校招前端实习一面总结
  13. 对io.UnsupportedOperation: fileno错误的解决办法
  14. 《逆袭大学》文摘——7.1.2 中学生学习单片机的启示
  15. i5十代不能装win7系统_i5处理器是装Windows7还是Windows10系统?
  16. Unity游戏设计与实现 南梦宫一线程序员的开发实例
  17. 中科创达怎么样-是外包公司吗-智能网联汽车和智能物联网推动业务快速增长
  18. 国外经典幽默漫画和笑话集
  19. python人脸头发身体部位识别人数统计
  20. 前端JS编程之——校对拼写错误(王大锤)

热门文章

  1. java-数字转换汉语中人民币的大写
  2. python开发网站的优势与劣势_python的优势和劣势
  3. Jieba库与wordcloud库的学习汇总
  4. cmake gcc target specific option mismatch
  5. mongodb意外断电,非正常关闭, 造成不可启动, 日志出现WT_ERROR: non-specific WiredTiger error, terminating
  6. pyecharts动态图表嵌入ppt
  7. 【vue】pdf转图片
  8. 动态数组是怎么创建的?BQe
  9. 华氏温度与摄氏温度转换 java_用JAVA写一个将华氏温度转换成摄氏温度的程序
  10. 台式计算机cpu允许温度,台式机cpu温度多少正常 台式电脑工作时温度范围