微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32F10XXX 双通道ADC数据采集,TIM2触发采集

STM32F10XXX 双通道ADC数据采集,TIM2触发采集

时间:11-17 来源:互联网 点击:
/********** (C) COPYRIGHT 2007 STMicroelectronics ***********

*STM32F10XXX 双通道ADC数据采集

*环境:keil for arm mdk 4.71a 官方V3.5库

*STM32数据采集部分

* 1、ADC1/ADC2实现并行同时数据采集,12BIT最高可达1MSPS采样速度并通过STM32的DMA传输放入内存中

* 2、TIM2 CC2实现对ADC采样的触发,ADC_Sample_Frequency_Set函数实现自定义TIM2 CC2频率输出,

* 3、采样的频率和采样个数通过接收到的UDP控制命令来指定

* 采样的频率为20HZ~1MHZ;

* 采样深度为1~4000个数据(受限于STM32内存20KB容量,一个数据为2个12bitADC通道读数,需一个word)

*******************************************************************************/

#define ADC1_DR_addr ((u32)0x4001244C) //AD转换结果存放地址定义

/*******************************************************************************

* Function Name : DMA_ADC_Transfer_Reset

* Description : ADC1/ADC2 DMA传输通道复位,准备下一次DMA传输

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void DMA_ADC_Transfer_Reset(void)

{

//开始DMA传输

DMA_Channel1->CCR &= ~(1<0); //禁用DMA_Channel,EN是CCR1寄存器的0位

DMA->IFCR |= 0x0000000F;//清除CHANNEL1的4个标志

DMA_Channel1->CNDTR = (u16)SampleDepth;//重新设置要设置的DMA传输数据量

DMA_Channel1->CCR |= (1<0);//重新使能DMA_channel1

while(!(DMA->ISR & DMA_FLAG_TC1));

DMA_Channel1->CCR &= ~(1<0); //禁用DMA_Channel,EN是CCR1寄存器的0位

}

/*******************************************************************************

* Function Name : DMA_ADC_Transfer_Init

* Description : ADC1/ADC2 DMA传输通道初始化

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void DMA_ADC_Transfer_Init(void)

{

DMA_InitTypeDef DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* DMA channel1 configuration ----------------------------------------------*/

DMA_DeInit(DMA_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_DR_Address;//ADC数据寄存器地址

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Data_Buffer[0];//目标缓冲区地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设是源

DMA_InitStructure.DMA_BufferSize = 0;//设置DMA读取长度为

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_Normal;//DMA模式:Circular循环模式/Normal普通模式

DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//优先级

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//内存到内存模式不使能

DMA_Init(DMA_Channel1, &DMA_InitStructure);

/* Enable DMA channel1 */

//DMA_Cmd(DMA_Channel1, ENABLE);

}

/*******************************************************************************

* Function Name : ADC_Initial

* Description : ADC1/ADC2初始化

*******************************************************************************/

void ADC_Initial(void)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC通道时钟

ADC_InitTypeDef ADC_InitStructure;

/* ADC1 configuration ------------------------------------------------------*/

ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//ADC1/ADC2同时并行采样模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE;//多通道扫描模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//单次转换模式(转换后即停止)

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;//触发模式

ADC_InitStructure.ADC_DataAlign = ADC_Dat

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top