采用STM32F407的DCMI接口以及AD9283制作采样率高达100MSPS的ADC

本文DCMI资料来自于正点原子开发手册,因为篇幅只简单介绍,详细资料请大家去开发手册查看

采用FPGA的ADC对信号进行采集麻烦,并且对数据处理也十分麻烦,FPGA价格相对较贵,所以我使用STM32自制一块高速ADC 采样率理论值是100MSPS,但是受限于DCMI接口的速率,实际只能到54MSPS左右

采用STM32F407VGT6开发板,以及AD9283,为满足各种环境需求,项目含有串口通信以及RS485通信。

1.        数字摄像头接口(DCMI)

1.1        DCMI 简介

             数字摄像头接口是一个同步并行接口,能够接收外部 8 位、10 位、12 位或 14 位 CMOS 摄 像头模块发出的高速数据流。

1.2        DCMI 主要特性

                ● 8 位、10 位、12 位或 14 位并行接口

                ● 内嵌码/外部行同步和帧同步

1.3        DCMI 引脚

1.4        DCMI 物理接口

        该接口由 11/13/15/17 个输入信号组成。仅支持从模式。 根据 DCMI_CR 寄存器中 EDM[1:0] 位的设置,摄像头接口可以捕获 8 位、10 位、12 位或 14 位数据。如果使用的位数少于 14,则必须将未使用的输入引脚接地

1.5        DCMI 功能概述

        数字摄像头接口是一个同步并行接口,可接收高速(可达 54 MB/s)数据流。该接口包含多 达 14 条数据线 (D13-D0) 和一条像素时钟线 (PIXCLK)。像素时钟的极性可以编程,因此可 以在像素时钟的上升沿或下降沿捕获数据。

         这些数据被放到 32 位数据寄存器 (DCMI_DR) 中,然后通过通用 DMA 进行传输。图像缓冲 区由 DMA 管理,而不是由摄像头接口管理。

         从摄像头接收的数据可以按行/帧来组织(原始 YUB/RGB/拜尔模式),也可以是一系列 JPEG 图像。要使能 JPEG 图像接收,必须将 JPEG 位(DCMI_CR 寄存器的位 3)置 1。

         数据流可由可选的 HSYNC(水平同步)信号和 VSYNC(垂直同步)信号硬件同步,或者通 过数据流中嵌入的同步码同步

1.6        DCMI的DMA传输

8位数据

 该项目采用的是AD9283是一个8位的AD,所以DCMI我们将采用8位

2.        AD9283

2.1        芯片介绍

        

  • 低功耗:90 mW(100 MSPS)
  • 片内基准电压源和采样保持
  • 475 MHz模拟带宽
  • 信噪比:
    46.5 dB(100 MSPS,41 kHz输入频率)
  • 1 Vp-p模拟输入范围
  • +3.0 V单电源供电(2.7 V 至 3.6 V)
  • 省电模式:4.2 mW


AD9283 是一款高度集成的 8 位单芯片采样模数转换器 (ADC),内置片内采样保持电路,专门针对低成本、低功耗、小尺寸和易用性进行了优化。它在 100 MSPS(百万样本每秒)的高速转换速率下工作,能够在整个工作范围内保持优异的动态性能,使其非常适合对速度和精度要求较高的应用场景。

3.        原理图

最下方ENCODE引脚接的是两个时钟,可以是来自PA8的内部时钟8Mhz,也可以是外部时钟。

4.        RS485通信

        因为该项目在一定条件下需要采集5米左右距离的信号,所以采用差分信号传输,可以避免信号衰减。


4.1        特点

RS485 是 半双工异步 串行通信。
支持多节点:一般最大支持 32 个节点。
传输距离远:最远通讯距离可达1200米。
抗干扰能力强:差分信号传输。
连接简单:只需要两根信号线(A+和B-)就可以进行正常的通信。


4.2        差分信号传输

RS485 通信采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。
在差分信号中,逻辑0和逻辑1是用两根信号线(A+和B-)的电压差来表示。

逻辑 1:两根信号线(A+和B-)的电压差在 +2V~+6V 之间。
逻辑 0:两根信号线(A+和B-)的电压差在 -2V~-6V 之间。


4.3        连接方式


在 RS485 通信网络中,通常会使用 485 收发器来转换 TTL 电平和 RS485 电平。
节点中的串口控制器使用 RX 与 TX 信号线连接到 485 收发器上,而收发器通过差分线连接到网络总线。
串口控制器与收发器之间一般使用 TTL 信号传输,收发器与总线则使用差分信号来传输。
发送数据时,串口控制器的 TX 信号经过收发器转换成差分信号传输到总线上。
接收数据时,收发器把总线上的差分信号转化成 TTL 信号通过 RX 引脚传输到串口控制器中。
通常在这些节点中只能有一个主机,剩下的全为从机。
 

4.4        原理图

5.        DCMI驱动代码

#include "ad9220_dcmi.h"

uint32_t adc_convert_value[ADC_DMA_DATA_LENGTH]; //存储从 DCMI 接收来的数据

/**************************************************************************
	使用 MCO 输出作为 AD9220 的时钟 -> PA8
**************************************************************************/
void MCO1_GPIO_Config(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);
}

/*******************************************************************************
  * @brief  初始化 DCMI 接口使用的 GPIO
  * @param  None
  * @retval None
  * @brief  PCLK,HSYNC,VSYNC,D0-D11
  ******************************************************************************/
void dcmi_gpio_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	/* 使能 DCMI 相关引脚时钟 */
	RCC_AHB1PeriphClockCmd( DCMI_VSYNC_GPIO_CLK | DCMI_HSYNC_GPIO_CLK | DCMI_PIXCLK_GPIO_CLK|
							DCMI_D0_GPIO_CLK| DCMI_D1_GPIO_CLK| DCMI_D2_GPIO_CLK| DCMI_D3_GPIO_CLK|
							DCMI_D4_GPIO_CLK| DCMI_D5_GPIO_CLK| DCMI_D6_GPIO_CLK| DCMI_D7_GPIO_CLK| 
							DCMI_D8_GPIO_CLK| DCMI_D9_GPIO_CLK| DCMI_D10_GPIO_CLK| DCMI_D11_GPIO_CLK, ENABLE);

	/*初始化控制/同步信号线*/
	GPIO_InitStructure.GPIO_Pin = DCMI_VSYNC_GPIO_PIN;//初始化帧同步信号线
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;//上拉
	GPIO_Init(DCMI_VSYNC_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_VSYNC_GPIO_PORT, DCMI_VSYNC_PINSOURCE, DCMI_VSYNC_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_HSYNC_GPIO_PIN ;//初始化行同步信号线
	GPIO_Init(DCMI_HSYNC_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_HSYNC_GPIO_PORT, DCMI_HSYNC_PINSOURCE, DCMI_HSYNC_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_PIXCLK_GPIO_PIN ;//初始化像素时钟信号线
	GPIO_Init(DCMI_PIXCLK_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_PIXCLK_GPIO_PORT, DCMI_PIXCLK_PINSOURCE, DCMI_PIXCLK_AF);

	/*初始化数据信号线*/
	GPIO_InitStructure.GPIO_Pin = DCMI_D0_GPIO_PIN ;
	GPIO_Init(DCMI_D0_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D0_GPIO_PORT, DCMI_D0_PINSOURCE, DCMI_D0_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_D1_GPIO_PIN ;
	GPIO_Init(DCMI_D1_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D1_GPIO_PORT, DCMI_D1_PINSOURCE, DCMI_D1_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_D2_GPIO_PIN ;
	GPIO_Init(DCMI_D2_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D2_GPIO_PORT, DCMI_D2_PINSOURCE, DCMI_D2_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_D3_GPIO_PIN ;
	GPIO_Init(DCMI_D3_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D3_GPIO_PORT, DCMI_D3_PINSOURCE, DCMI_D3_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_D4_GPIO_PIN ;
	GPIO_Init(DCMI_D4_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D4_GPIO_PORT, DCMI_D4_PINSOURCE, DCMI_D4_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_D5_GPIO_PIN ;
	GPIO_Init(DCMI_D5_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D5_GPIO_PORT, DCMI_D5_PINSOURCE, DCMI_D5_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_D6_GPIO_PIN ;
	GPIO_Init(DCMI_D6_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D6_GPIO_PORT, DCMI_D6_PINSOURCE, DCMI_D6_AF);

	GPIO_InitStructure.GPIO_Pin = DCMI_D7_GPIO_PIN ;
	GPIO_Init(DCMI_D7_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D7_GPIO_PORT, DCMI_D7_PINSOURCE, DCMI_D7_AF);
	
	GPIO_InitStructure.GPIO_Pin = DCMI_D8_GPIO_PIN ;
	GPIO_Init(DCMI_D8_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D8_GPIO_PORT, DCMI_D8_PINSOURCE, DCMI_D8_AF);
	
	GPIO_InitStructure.GPIO_Pin = DCMI_D9_GPIO_PIN ;
	GPIO_Init(DCMI_D9_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D9_GPIO_PORT, DCMI_D9_PINSOURCE, DCMI_D9_AF);
	
	GPIO_InitStructure.GPIO_Pin = DCMI_D10_GPIO_PIN ;
	GPIO_Init(DCMI_D10_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D10_GPIO_PORT, DCMI_D10_PINSOURCE, DCMI_D10_AF);
	
	GPIO_InitStructure.GPIO_Pin = DCMI_D11_GPIO_PIN ;
	GPIO_Init(DCMI_D11_GPIO_PORT, &GPIO_InitStructure);
	GPIO_PinAFConfig(DCMI_D11_GPIO_PORT, DCMI_D11_PINSOURCE, DCMI_D11_AF);	
}

/*摄像头采集图像的大小,改变这两个值可以改变数据量,
img_width和imgheight要求为4的倍数
但不会加快采集速度,要加快采集速度需要改成SVGA模式*/
//uint16_t img_width=852, img_height=480;

/********************************************************************************
  * @brief  配置 DCMI/DMA 接收 AD9220 数据
  * @param  None
  * @retval None
  *******************************************************************************/
void ad9220_dcmi_dma_init(void)
{
	DCMI_InitTypeDef DCMI_InitStructure;
	DMA_InitTypeDef  DMA_InitStructure;
	
	/*** 配置DCMI接口 ***/
	/* 使能DCMI时钟 */
	RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);

	/* DCMI 配置*/ 
	DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous;	//Specifies the Capture Mode: Continuous or Snapshot.
	DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware;	//硬件同步模式,使用 HSYNC/VSYNC 信号
	DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling;		//AD9220 数据输出在下降沿稳定,因此需要在像素时钟的下降沿读取数据
	DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High;			//VSYNC 高电平时暂停传输数据,需要将对应引脚接地
	DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High;			//HSYNC 高电平时暂停传输数据
	DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame;	//Specifies the frequency of frame capture: All, 1/2 or 1/4.
	DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_12b;//获取 D0-D11 的 12-bit 数据
	DCMI_Init(&DCMI_InitStructure); 	

	/* 使能DMA时钟*/
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);  
	DMA_Cmd(DMA2_Stream1,DISABLE); //先关闭 DMA2 Stream1,等待配置相关寄存器
	while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}	
	/* DMA2 Stream0 channel_1 configuration **************************************/
	DMA_InitStructure.DMA_Channel = DMA_Channel_1;  						// DCMI在DMA2 Channel_1中
	DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS;				// DCMI数据寄存器地址
	DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&adc_convert_value;	// DMA传输的目的地址	
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;					// 数据传输方向为外设到存储器
	DMA_InitStructure.DMA_BufferSize =ADC_DMA_DATA_LENGTH; 					// 缓冲区大小为,指一次传输的数据量
	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_Word;			// 存储器数据大小也为字,跟外设数据大小相同
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;							// 循环模式************
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;					// 禁止DMA FIFO,使用直连模式
	DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC8;
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

	DMA_Init(DMA2_Stream1, &DMA_InitStructure);/*DMA初始化 */
		
	/* DMA2_Stream1 enable 开启 DMA */
	DMA_Cmd(DMA2_Stream1,ENABLE);
	while(DMA_GetCmdStatus(DMA2_Stream1) != ENABLE){}
	
	/* 配置中断 */
	//注:这里应使用DMA来做中断触发,不用DCMI中断
 	
}

/********************************************************************************
  * @brief  开启或关闭DCMI采集
  * @param  ENABLE或DISABLE
  *******************************************************************************/
void dcmi_capture_control(FunctionalState state)
{
	DMA_Cmd(DMA2_Stream1, state);	//DMA2,Stream1
	DCMI_Cmd(state); 				//DCMI采集数据
	DCMI_CaptureCmd(state);			//DCMI捕获
}

/**************************************************************************
	配置 DMA 中断
	DCMI 使用 DMA2,数据流1
**************************************************************************/
void dcmi_dma_nvic_init(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;		//DMA2 流 1 中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;		//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//使能外部中断通道
	NVIC_Init(&NVIC_InitStructure);//配置
	//配置 DMA2 stream1 中断
	DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE); //DMA_IT_TC:传输完成中断;	ENABLE:允许中断
}

/**************************************************************************
	HSYNC 和 VSYNC 必须先处于高电平,配置好 DCMI 之后在输入低电平才能有效工作
	因此,用 IO 的高低电平模拟该协议
	PE0 -> HSYNC
	PE1 -> VSYNC
**************************************************************************/
void HSYNC_VSYNC_init(void)
{    	 
	GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟

	//GPIOF9,F10初始化设置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//LED0和LED1对应IO口
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO

	GPIO_SetBits(GPIOE,GPIO_Pin_0 | GPIO_Pin_1);//GPIOE0,E1设置高
}
#ifndef __AD9220_DCMI_H
#define	__AD9220_DCMI_H
/**
  ******************************************************************************
  * @file    ad9220_dcmi.c
  * @author  chunyu
  * @version V1.0
  * @date    2018-05-02
  * @brief   使用 STM32F4 的 DCMI 接口接收 AD9220 的数据
  ******************************************************************************
  * @attention
  * 理解 STM32F4 的 DCMI 接口的功能,实现读取 AD9220 的数据
  *   
  ******************************************************************************
  */
#include "stm32f4xx.h"

#define DCMI_DR_ADDRESS       (uint32_t)&DCMI->DR //宏定义 DCMI 数据寄存器的地址

#define ADC_DMA_DATA_LENGTH 1024

//DMCI 接口相关 IO 宏定义
//VSYNC
#define DCMI_VSYNC_GPIO_PORT        	GPIOB
#define DCMI_VSYNC_GPIO_CLK         	RCC_AHB1Periph_GPIOB
#define DCMI_VSYNC_GPIO_PIN         	GPIO_Pin_7
#define DCMI_VSYNC_PINSOURCE        	GPIO_PinSource7
#define DCMI_VSYNC_AF			          GPIO_AF_DCMI
//HSYNC
#define DCMI_HSYNC_GPIO_PORT        	GPIOA
#define DCMI_HSYNC_GPIO_CLK         	RCC_AHB1Periph_GPIOA
#define DCMI_HSYNC_GPIO_PIN         	GPIO_Pin_4
#define DCMI_HSYNC_PINSOURCE        	GPIO_PinSource4
#define DCMI_HSYNC_AF			          GPIO_AF_DCMI
//PIXCLK
#define DCMI_PIXCLK_GPIO_PORT        	GPIOA
#define DCMI_PIXCLK_GPIO_CLK         	RCC_AHB1Periph_GPIOA
#define DCMI_PIXCLK_GPIO_PIN         	GPIO_Pin_6
#define DCMI_PIXCLK_PINSOURCE        	GPIO_PinSource6
#define DCMI_PIXCLK_AF			          GPIO_AF_DCMI

//数据信号线 D0-D11
#define DCMI_D0_GPIO_PORT        	GPIOC
#define DCMI_D0_GPIO_CLK         	RCC_AHB1Periph_GPIOC
#define DCMI_D0_GPIO_PIN         	GPIO_Pin_6
#define DCMI_D0_PINSOURCE        	GPIO_PinSource6
#define DCMI_D0_AF			        GPIO_AF_DCMI

#define DCMI_D1_GPIO_PORT        	GPIOC
#define DCMI_D1_GPIO_CLK         	RCC_AHB1Periph_GPIOC
#define DCMI_D1_GPIO_PIN         	GPIO_Pin_7
#define DCMI_D1_PINSOURCE        	GPIO_PinSource7
#define DCMI_D1_AF			        GPIO_AF_DCMI

#define DCMI_D2_GPIO_PORT        	GPIOC
#define DCMI_D2_GPIO_CLK         	RCC_AHB1Periph_GPIOC
#define DCMI_D2_GPIO_PIN         	GPIO_Pin_8
#define DCMI_D2_PINSOURCE        	GPIO_PinSource8
#define DCMI_D2_AF			        GPIO_AF_DCMI

#define DCMI_D3_GPIO_PORT        	GPIOC
#define DCMI_D3_GPIO_CLK         	RCC_AHB1Periph_GPIOC
#define DCMI_D3_GPIO_PIN         	GPIO_Pin_9
#define DCMI_D3_PINSOURCE        	GPIO_PinSource9
#define DCMI_D3_AF			        GPIO_AF_DCMI

#define DCMI_D4_GPIO_PORT        	GPIOE
#define DCMI_D4_GPIO_CLK         	RCC_AHB1Periph_GPIOE
#define DCMI_D4_GPIO_PIN         	GPIO_Pin_4
#define DCMI_D4_PINSOURCE        	GPIO_PinSource4
#define DCMI_D4_AF			        GPIO_AF_DCMI

#define DCMI_D5_GPIO_PORT        	GPIOB
#define DCMI_D5_GPIO_CLK         	RCC_AHB1Periph_GPIOB
#define DCMI_D5_GPIO_PIN         	GPIO_Pin_6
#define DCMI_D5_PINSOURCE        	GPIO_PinSource6
#define DCMI_D5_AF			        GPIO_AF_DCMI

#define DCMI_D6_GPIO_PORT        	GPIOE
#define DCMI_D6_GPIO_CLK         	RCC_AHB1Periph_GPIOE
#define DCMI_D6_GPIO_PIN         	GPIO_Pin_5
#define DCMI_D6_PINSOURCE        	GPIO_PinSource5
#define DCMI_D6_AF			        GPIO_AF_DCMI

#define DCMI_D7_GPIO_PORT        	GPIOE
#define DCMI_D7_GPIO_CLK         	RCC_AHB1Periph_GPIOE
#define DCMI_D7_GPIO_PIN         	GPIO_Pin_6
#define DCMI_D7_PINSOURCE        	GPIO_PinSource6
#define DCMI_D7_AF			        GPIO_AF_DCMI

#define DCMI_D8_GPIO_PORT        	GPIOC
#define DCMI_D8_GPIO_CLK         	RCC_AHB1Periph_GPIOC
#define DCMI_D8_GPIO_PIN         	GPIO_Pin_10
#define DCMI_D8_PINSOURCE        	GPIO_PinSource10
#define DCMI_D8_AF			        GPIO_AF_DCMI

#define DCMI_D9_GPIO_PORT        	GPIOC
#define DCMI_D9_GPIO_CLK         	RCC_AHB1Periph_GPIOC
#define DCMI_D9_GPIO_PIN         	GPIO_Pin_12
#define DCMI_D9_PINSOURCE        	GPIO_PinSource12
#define DCMI_D9_AF			        GPIO_AF_DCMI

#define DCMI_D10_GPIO_PORT        	GPIOB
#define DCMI_D10_GPIO_CLK         	RCC_AHB1Periph_GPIOB
#define DCMI_D10_GPIO_PIN         	GPIO_Pin_5
#define DCMI_D10_PINSOURCE        	GPIO_PinSource5
#define DCMI_D10_AF			        GPIO_AF_DCMI

#define DCMI_D11_GPIO_PORT        	GPIOD
#define DCMI_D11_GPIO_CLK         	RCC_AHB1Periph_GPIOD
#define DCMI_D11_GPIO_PIN         	GPIO_Pin_2
#define DCMI_D11_PINSOURCE        	GPIO_PinSource2
#define DCMI_D11_AF			        GPIO_AF_DCMI

void MCO1_GPIO_Config(void);//配置 MCO1 输出
void dcmi_gpio_init(void);//初始化 DCMI 接口使用的 GPIO
void ad9220_dcmi_dma_init(void);//配置 DCMI/DMA 接收 AD9220 数据
void dcmi_capture_control(FunctionalState state);//开启或关闭DCMI采集
void dcmi_dma_nvic_init(void);//配置 DMA 中断
void HSYNC_VSYNC_init(void);

#endif /* __AD9220_DCMI_H */

6.        完整实物图

画的有点丑,请不要介意

该版本为第一版需要提供外部时钟,后续将采用时钟芯片提供时钟,不需要外部时钟,并且改为12位的ADC,通过FIFO对数据转化在传到DMA中。

7.        缺点

1.需要提供外部时钟。

2.受限于DCMI传输速率,实际采样率最高只能到达54MSPS左右(不知道怎么解决)。

3.ADC只有8位精度不够。

欢迎大家一起交流学习,如果错误请各位大佬多多指点。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值