stm32f407的高速并口12位ad——dcmi方式

article/2025/9/20 15:25:53

stm32f407的高速并口12位ad——dcmi方式

关于dcmi

在这里插入图片描述
我们可以利用这个摄像头接口,进行一个54M以下的并口ad的数据处理。
在这里插入图片描述
这个是dcmi的时序图,时钟使用mco1输出系统时钟四分频也就是42m,我的是ad9926,上升沿触发,那么ad数据也就是在下降沿能够稳定下来,那我们的dcmi时钟就配置成下降沿捕获,至于hsync和vsync两个脚就配置硬件同步,都是高电平有效,那么将hsync和vsync拉低就可以开启dcmi了。

部分相关代码

dcmi和dma的配置

void DCMI_GPIO_CONFIG(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|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|GPIO_Pin_5;;// 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_10|GPIO_Pin_11|GPIO_Pin_12;//PC6/7/8/9/11 ¸´Óù¦ÄÜÊä³öGPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PE5/6  ¸´Óù¦ÄÜÊä³ö GPIO_Init(GPIOD, &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,AF13  DCMI_HSYNCGPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_DCMI); //PA6,AF13  DCMI_PCLK  GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_DCMI); //PB7,AF13  DCMI_VSYNC GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_DCMI); //PC6,AF13  DCMI_D0  GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_DCMI); //PC7,AF13  DCMI_D1 GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_DCMI); //PC8,AF13  DCMI_D2GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI); //PC9,AF13  DCMI_D3GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_DCMI);//PC11,AF13 DCMI_D4 GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_DCMI); //PB6,AF13  DCMI_D5 GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_DCMI); //PE5,AF13  DCMI_D6GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_DCMI); //PE6,AF13  DCMI_D7GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_DCMI); //Pc10,AF13  DCMI_D8GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_DCMI); //Pc12,AF13  DCMI_D9GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_DCMI); //PB5,AF13  DCMI_D10GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_DCMI); //PD2,AF13  DCMI_D11}
void MY_DCMI_Init(void)
{DCMI_InitTypeDef  DCMI_InitStructure;DCMI_GPIO_CONFIG();   // D0~D11 GPIO³õʼ»¯ÅäÖÃDCMI_DeInit();//Çå³ýÔ­À´µÄÉèÖà DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;	// Á¬ÐøÄ£Ê½DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;		// ȫ֡²¶»ñDCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_12b;	//12λÊý¾Ý¸ñʽ  DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High;							//HSYNC µÍµçƽÓÐЧDCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;				//PCLK ϽµÑØÓÐЧDCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;	//Ó²¼þͬ²½HSYNC,VSYNCDCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;		//VSYNC µÍµçƽÓÐЧDCMI_Init(&DCMI_InitStructure);DCMI_Cmd(ENABLE);
}void DCMI_DMA_Init(void)
{DMA_InitTypeDef  DMA_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //DMA2ʱÖÓʹÄÜ DMA_DeInit(DMA2_Stream1);while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){} //µÈ´ýDMA2_Stream1¿ÉÅäÖà /* ÅäÖà DMA Stream */DMA_InitStructure.DMA_Channel = DMA_Channel_1;  //ͨµÀ1 DCMIͨµÀ DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;	//ÍâÉèµØÖ·Îª:DCMI->DR  (DCMI»ñµÃÊý¾Ý)DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&adc_value;	//DMA ´æ´¢Æ÷0µØÖ·   (LCDÄ£ÄâSRAM´æ´¢Æ÷)DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;		//ÍâÉèµ½´æ´¢Æ÷ģʽDMA_InitStructure.DMA_BufferSize = length;	//Êý¾Ý´«ÊäÁ¿ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;	//ÍâÉè·ÇÔöÁ¿Ä£Ê½DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;		//´æ´¢Æ÷ÔöÁ¿Ä£Ê½DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;	//ÍâÉèÊý¾Ý³¤¶È:32λDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;	//´æ´¢Æ÷Êý¾Ý³¤¶È  32λDMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ʹÓÃÑ­»·Ä£Ê½ DMA_InitStructure.DMA_Priority = DMA_Priority_High;//¸ßÓÅÏȼ¶DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; //FIFOģʽ        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;//ʹÓÃÈ«FIFO DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«ÊäDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«ÊäDMA_Init(DMA2_Stream1, &DMA_InitStructure);//³õʼ»¯DMA StreamDMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;		//DMA2 ÖжÏNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				NVIC_Init(&NVIC_InitStructure);}void DMA2_Stream1_IRQHandler(void)
{u16 i;DCMI_Stop();if(DMA_GetITStatus(DMA2_Stream1, DMA_IT_TCIF1))  //ÅжÏDMAÖжÏÊÇ·ñÍê³É{//DCMIÍ£Ö¹for(i=0;i<length;i++)//´òÓ¡ADµÄÖµ{printf("%u\r\n",(uint16_t)adc_value[i]);printf("%u\r\n",(uint16_t)(adc_value[i] >> 16));}DMA_ClearITPendingBit(DMA2_Stream1, DMA_IT_TCIF1);//Çå³ýÖжϱêÖ¾delay_ms(1000);DCMI_Start();}}

mco以及hsync和vsync的引脚配置

void MY_HV_init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//PAʱÖÓʹÄÜGPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//PA1 PA2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);//PA1 PA2 ÉèÖÃλ¸ßµçƽ
}
void MCO1Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜʱÖÓGPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//PA8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´ÓÃGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed; GPIO_Init(GPIOA, &GPIO_InitStructure);RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_4);///PLL 4·ÖƵ 
}void nMCO1Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//PA8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//¸´ÓÃGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed; GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}
void DCMI_Start(void)
{DCMI_CaptureCmd(ENABLE);//DCMI²¶»ñʹÄÜ  MCO1Init();H_V_start;DMA_Cmd(DMA2_Stream1, ENABLE);//¿ªÆôDMA2,Stream1 
}void DCMI_Stop(void)
{DCMI_CaptureCmd(DISABLE);//DCMI²¶»ñʹ¹Ø±Õ	//while(DCMI->CR&0X01);		//µÈ´ý´«Êä½áÊø  	DMA_Cmd(DMA2_Stream1, DISABLE);//¹Ø±ÕDMA2,Stream1nMCO1Init();H_V_stop;
}

main函数

int main(void)
{u16 i;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2delay_init(168);LED_Init();MCO1Init();uart_init(115200);MY_HV_init();DCMI_GPIO_CONFIG();MY_DCMI_Init();DCMI_DMA_Init();DCMI_Start();//delay_ms(200);while(1);
}
//引脚
//pA1--PA4 DCMI_HSYNC
//PA2--PB7 DCMI_VSYNC
//PA8--PA6 DCMI_PCLK+ad clock
//PC6,AF13  DCMI_D0  
//PC7,AF13  DCMI_D1 
//PC8,AF13  DCMI_D2
//PC9,AF13  DCMI_D3
//PC11,AF13 DCMI_D4 
//PB6,AF13  DCMI_D5 
//PE5,AF13  DCMI_D6
//PE6,AF13  DCMI_D7
//Pc10,AF13  DCMI_D8
//Pc12,AF13  DCMI_D9
//PB5,AF13  DCMI_D10
//PD2,AF13  DCMI_D11

大概流程就是dcmi的数据通过dma存到一个uint32_t类型大小500的数组,前16位是一个数据后十六位也是一个数据,就一次是1000个数据,触发dma中断(没有使用dcmi中断),中断打印数据。

不喜勿喷!
完整程序在https://download.csdn.net/download/Just_zz/21107388
不过我好像把代码都复制写在上面了,没有积分可以自己建一下工程,就这样。


http://chatgpt.dhexx.cn/article/QxgxAYEk.shtml

相关文章

STM32H7B0 HAL库中关于DMA的注意事项以及DCMI调试遇到的问题及解决方法

先总结总结问题 问题1&#xff1a;MX_DCMI_Init();放到 MX_DMA_Init();后 问题2&#xff1a;DMA缓存缓存要放到SRAM中__align(32) uint32_t buffer[65535] __attribute((at(0X24040000))); 问题3&#xff1a;IO复用问题&#xff0c;DCMI数据口可以复用到其他IO口&#xff0…

STM32——DCMI接口与OV2640原理与配置

一、OV2640简介 1、什么是OV2640&#xff1f; OV2640是OmniVision公司生产的一颗1/4寸的CMOS UXGA&#xff08;1632*1232&#xff09;图像传感器。该传感器体积小、工作电压低&#xff0c;提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB总线控制&#xff0c;可以输出整…

DCMI接口之OV2640摄像头

一、OV2640简介 OV2640是OmniVision公司生产的一颗1/4寸的CMOS UXGA&#xff08;1632 * 1232&#xff09;图像传感器。该传感器体积小、工作电压低&#xff0c;提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB 总线控制&#xff0c;可以输出整帧、子采样、缩放和取窗口等…

OV2640 DCMI

OV2640 简介&#xff1a; 1/4寸CMOSUXGA (1632 * 1232)图像传感器。体积小、工作电压低,提供单片UXGA摄像头和影像处理器的所有功能。通过SCCB总线控制&#xff0c;可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率8/10位影像数据。&#xff08;此处一般选8位&#xff0…

STM32F429之DCMI 数字相机接口

嵌入式系列文章 参考&#xff1a;《STM32F429_DM00031020_ENV19.pdf》 本文目的&#xff1a;翻译STM32F429的PRM&#xff0c;深入理解DCMI接口的工作原理&#xff0c;最后将DCMI工作原理转换成驱动代码。 DCMI&#xff1a;Digital camera interface&#xff0c;数字摄像头接口 …

DCMI接口

目录 DCMI数字摄像头接口 DCMI引脚 摄像头引脚 操作过程与通信方式 硬件连接图 写操作 读操作 图像输出 数据格式 rawRGB YUV RGB JPEG 代码实现过程简述 学习过程的问题 YUV是亮度和色度的格式&#xff0c;为什么UV中取Cb蓝和Cr红作为色度&#xff1f; 提问MIPI、DVP、DCMI是什…

stm32f4的数字摄像头接口(DCMI)使用

DCMI简介 STM32F4的DCMI接口包括如下信号 1&#xff0c;数据据输入&#xff08;D[0:13]&#xff09;&#xff0c;接摄像头的数据输出。 2&#xff0c;水平同步&#xff08;行同步&#xff09;输入&#xff08;HSYNC&#xff09;&#xff0c;接摄像头的HSYNC/HREF信号&#xff…

Java开发技术

1、基础技术 数据结构与算法 逻辑结构&#xff1a;数据对象中的数据元素之间的逻辑关系 1.集合结构&#xff1a;集合结构中的数据元素除了同属一个集合外&#xff0c;没有其他关系。 2.线性结构&#xff1a;线性结构中的数据元素之间是一对一的关系。 3.树形结构&#xff1a;树…

JAVA 中的代码生成包 CGLIB (Code Generation Library)

JAVA 中的代码生成包 CGLIB &#xff08;Code Generation Library&#xff09; CGLIB 是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为 JDK 的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理&#xff0c;但当要代…

Java开发实战讲解!java开发CPU最低要求

前言 本人是底层 211 本科,刚毕业,⽆科研经历,但是有些项⽬经历。 在国内监控行业某头部企业做过一段时间的实习。 想着投下字节,可以积累⼀下⾯试经验和为金九银十面招做准备。投了简历之后,过了一段时 间,HR 就打电话跟我约时间, 说明一下&#xff0c;我投的是北京 office。…

Java面试题技术类一

前端技术导航大全 1、面向对象编程的三大特性是什么? 2、String 和StringBuffer的区别 3、说出ArrayList,Vector, LinkedList的存储性能和特性 4、Collection 和 Collections的区别 5、HashMap和Hashtable的区别 6、final, finally, finalize的区别 7、Overload和Overri…

Java专项练习(三)

JAVA选择题 401、下列类定义代码&#xff0c;当用来声明对象car&#xff0c;并用Car carnew Car();实例化后&#xff0c;可以通过car对象直接赋值的字段是&#xff08;&#xff09;402、以下哪个不是Collection的子接口&#xff1f;403、下列说法正确的是( )404、下面的程序将来…

Java学习汇总

6/28日已更新&#xff0c;错误已修改~~~有错误的地方&#xff0c;欢迎大家留言&#xff01; 目录 一、Java基础篇 1.接口和抽象类的区别 2.重载和重写的区别 3.和equals的区别 4.异常处理机制 5.HashMap原理 6.想要线程安全的HashMap怎么办&#xff1f; 7.ConcurrentHa…

java面经整理

面试问题 一、Java基础1.jdk1.7到jdk1.8HashMap发生了什么变化&#xff08;底层&#xff09;&#xff1f;2.jdk1.7到jdk1.8虚拟机发生了什么变化3.String、StringBuilder、StringBuffer4.ArrayList和LinkedList有什么区别&#xff1f;5.ConcurrentHashMap的扩容机制6.接口和抽象…

获得阿里Java开发P7岗“农村穷苦”小伙就得安于现状?

前言 相信大家看到这个标题其实就已经可以联想到我大概是个什么样的情况了&#xff0c;很多人都在生活中或者是网络上甚至是家庭中都大致听过这样的话&#xff0c;“你这样的出生&#xff0c;达到现在这样的生活已经很不错了&#xff0c;还是别为了不切实际的梦想去冒险了&…

Java基础 常见数据结构与算法 项目总结

Java基础 1 Java基础必知必会 1.1 Java语言有哪些特点&#xff1f; 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff0c;平台无关性的具体表现在于&#xff0c;Java 是“一次编写&#xff0c;到处运行&#xff08;Wri…

Java面试知识点概览(持续更新)

Java 基础 说说自定义注解的场景及实现 利用自定义注解,结合SpringAOP可以完成权限控制、日志记录、统一异常处理、数字签名、数据加解密等功能。 实现场景&#xff08;API接口数据加解密&#xff09; 1&#xff09;自定义一个注解&#xff0c;在需要加解密的方法上添加该注…

java开发工程师面试总结

面试中常被问到的问题 介绍jvmjvm内存模型程序计数器虚拟机栈本地方法栈方法区堆 垃圾回收判断对象是否存活引用计数算法可达性分析算法 垃圾收集算法复制算法标记清除算法&#xff0c;标记整理算法 垃圾收集器新生代收集器SerialParNewParallel Scavenge 老年代收集器Serial O…

Java面试经验总结

目录 Java面试知识点基础常识前端基础知识Java基础知识1、**并行与并发**2、**线程与进程**3、**HashMap和HashTable区别**4、**new对象创建过程原理&#xff08;在JVM&#xff09;,从执行的角度(其他角度待续)**4、**Volatile和Synchronized**5、**线程创建的几种方法**6、**垃…

java怎么写api接口,绝对干货

正文 下文中截图来源于朋友一个pdf版本的面经,把所以知识点的答案整理了下来,耗费他至少1个月时间,在本文最后部分把这个pdf分享给大家,觉得有用的麻烦点赞关注走一波,谢谢!!!面经中有他的知识点的答案,如下图示例,非常详细(文末有领取方式)!!! 1.数据结构与算…