stm32f4的数字摄像头接口(DCMI)使用
DCMI简介
STM32F4的DCMI接口包括如下信号
1,数据据输入(D[0:13]),接摄像头的数据输出。
2,水平同步(行同步)输入(HSYNC),接摄像头的HSYNC/HREF信号,用于确定一行数据的接收情况。
3,垂直同步(场同步)输入(VSYNC),接摄像头的VSYNC信号,用于确定一帧数据的接收情况。
4,像素时钟输入(PIXCLK),接摄像头的PCLK信号,同步时钟,数据接收同步信号。
DCMI接口的数据与PIXCLK(即PCLK)保持同步,并根据像素时钟的极性在像素时钟上升沿/下降沿发生变化。HSYNC(HREF)信号指示行的开始/结束,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)使用相关推荐
- STM32F407传输OV2640视频数据并在PC端显示
一.整体架构 STM32使用DCMI驱动OV2640,DMA通道获取图像数据,然后通过以太网将数据发送至PC端,PC端通过socket接收数据,并用BufferedImage将其显示.(PC端使用的j ...
- 基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理
硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670 ...
- 通信管理员(一)居于MAC地址的网络通信
通信管理员(一)居于MAC地址的网络通信 文章目录 前言 一.居于MAC的网络通信的互联网物理地址PA分配 二.路由器和终端设备(主机) 总结 前言 没有办法,这将是一场持久战,要劳逸结合.到处游玩( ...
- 滚球经验总结(PID)
1.正点原子STM32F407探索者 + openmv3--串口通信 最近在用stm32f407探索者做滚球,一开始使用的摄像头是openmv3(openmv4太贵)--实时检测小球坐标(x,y),然 ...
- STM32F4驱动OV7670总结
前言:之前因为贪图便宜买了一个7块钱的ov7670摄像头,然后想用我的stm32开发板驱动起来结合rtthread做个小项目出来,但是一路上遇到了许多问题,最终没能成功,在此记录一下用stm32驱动o ...
- STM32F4外设配置速查【OV2640摄像头部分】
文章目录 OV2640 SCCB时序 基本概念简介 行输出时序 帧输出时序 JPEG时序 相关硬件配置 OV2640传感器窗口设置 图像尺寸设置 图像窗口设置 图像输出大小设置(缩放设置) OV264 ...
- (40)STM32——OV2640摄像头实验
目录 学习目标 运行结果 内容 OV2640 特点 时序 帧输出时序 配置 DCMI 特点 信号 DMA 寄存器 配置 硬件连接 代码 总结 学习目标 今天我们要学习的是OV2640摄像头实验,采用的 ...
- 基于STM32F407摄像头实验(有代码)
1.OV2640 简介 OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(16321232)图像 传感器.该传感器体积小.工作电压低,提供单片 UXGA ...
- 【STM32】OV2640摄像头学习笔记
目录: 一.OV2640 Camera 二.读取OV2640模块图像数据过程: 三.DCMI(Digital camera interface)接口 四.SCCB协议 1.起始信号 2.停止信号 五. ...
- STM32 F4 OV2640摄像头学习笔记(三)
四.DCMI(Digital camera interface)接口 功能描述 STM32F4 自带了一个数字摄像头(DCMI)接口,该接口是一个同步并行接口,能够接收外部8位.10位.12位或14位 ...
最新文章
- Confluence 6 数据库结构图
- HBuilder完成webApp入门(3) 关于webview (转)
- kalman滤波在雷达目标跟踪中的应用_简述Automotive radar中的多目标跟踪处理
- 深入理解JVM逃逸分析
- esb接口测试_接口测试用例.docx
- html文字自适应屏幕居中显示,DIV+CSS经典布局[宽度自适应][自动屏幕居中]的实现...
- python自学看什么书-有什么好的自学 Python 的书籍推荐?
- PR预设 16个毛刺效果抖音故障特效视频转场PR预设V2版本
- PyTorch 体验感悟
- Hadoop技术博文祝大家新年快乐
- 人人网发布QQ劝架补丁 同时兼容QQ及360
- 小米2022校招前端实习一面总结
- 对io.UnsupportedOperation: fileno错误的解决办法
- 《逆袭大学》文摘——7.1.2 中学生学习单片机的启示
- i5十代不能装win7系统_i5处理器是装Windows7还是Windows10系统?
- Unity游戏设计与实现 南梦宫一线程序员的开发实例
- 中科创达怎么样-是外包公司吗-智能网联汽车和智能物联网推动业务快速增长
- 国外经典幽默漫画和笑话集
- python人脸头发身体部位识别人数统计
- 前端JS编程之——校对拼写错误(王大锤)
热门文章
- java-数字转换汉语中人民币的大写
- python开发网站的优势与劣势_python的优势和劣势
- Jieba库与wordcloud库的学习汇总
- cmake gcc target specific option mismatch
- mongodb意外断电,非正常关闭, 造成不可启动, 日志出现WT_ERROR: non-specific WiredTiger error, terminating
- pyecharts动态图表嵌入ppt
- 【vue】pdf转图片
- 动态数组是怎么创建的?BQe
- 华氏温度与摄氏温度转换 java_用JAVA写一个将华氏温度转换成摄氏温度的程序
- 台式计算机cpu允许温度,台式机cpu温度多少正常 台式电脑工作时温度范围