本文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位精度不够。
欢迎大家一起交流学习,如果错误请各位大佬多多指点。