金牌会员
 
- 积分
- 1684
- 金钱
- 1684
- 注册时间
- 2014-2-25
- 在线时间
- 230 小时
|
发表于 2016-8-1 08:49:39
|
显示全部楼层
/****************ADC12采样缓冲区**********************/
//低16位:FreeBackB1-FreeBackB4
//高16位:FreeBackA1-FreeBackA4
/*****************************************************/
__IO uint32_t ADC12_Buff[4];
void ADC12_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//开启时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2,ENABLE); //使能ADC传输
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); //使能GPIO传输
//GPIOC作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化GPIOC
//GPIOB作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOB
ADC_DeInit(ADC1); //复位ADC1
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟,72/6=12MHz
//-----------ADC1参数设置----------------------------------
ADC_InitStructure.ADC_Mode=ADC_Mode_RegSimult; //ADC同步规则模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //多通道模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件触发而不受外部触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=4; //顺序进行规则转换的ADC通道数目4
ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1
ADC_RegularChannelConfig(ADC1,ADC_Channel_14,1,ADC_SampleTime_71Cycles5); //ADC_Test1采样
ADC_RegularChannelConfig(ADC1,ADC_Channel_6, 2,ADC_SampleTime_71Cycles5); //ADC_Test2采样
ADC_RegularChannelConfig(ADC1,ADC_Channel_4, 3,ADC_SampleTime_71Cycles5); //ADC_Test3采样
ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 4,ADC_SampleTime_71Cycles5); //ADC_Test4采样
//-----------ADC2参数设置----------------------------------
ADC_InitStructure.ADC_Mode=ADC_Mode_RegSimult; //ADC同步规则模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE; //多通道模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件触发而不受外部触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=4; //顺序进行规则转换的ADC通道数目4
ADC_Init(ADC2,&ADC_InitStructure); //初始化ADC1
ADC_RegularChannelConfig(ADC2,ADC_Channel_15 ,1,ADC_SampleTime_71Cycles5); //FreeBack1采样
ADC_RegularChannelConfig(ADC2,ADC_Channel_7 , 2,ADC_SampleTime_71Cycles5); //FreeBack2采样
ADC_RegularChannelConfig(ADC2,ADC_Channel_5, 3,ADC_SampleTime_71Cycles5); //FreeBack3采样
ADC_RegularChannelConfig(ADC2,ADC_Channel_3, 4,ADC_SampleTime_71Cycles5); //FreeBack4采样
ADC_ExternalTrigConvCmd(ADC2, ENABLE); //使能ADC2外部触发转换
//------------DMA参数设置----------------------------------
DMA_DeInit(DMA1_Channel1); //将DMA的通道x寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC12_Buff; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从内存读取
DMA_InitStructure.DMA_BufferSize = 4; //DMA通道的DMA缓存的大小
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通道 x拥有中等优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
DMA_Cmd(DMA1_Channel1,ENABLE); //打开DMA传输
ADC_Cmd(ADC1,ENABLE); //使能ADC1
ADC_Cmd(ADC2,ENABLE); //使能ADC2
ADC_ResetCalibration(ADC1); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
ADC_ResetCalibration(ADC2); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC2)); //等待复位校准结束
ADC_StartCalibration(ADC2); //开启AD校准
while(ADC_GetCalibrationStatus(ADC2)); //等待校准结束
ADC_DMACmd(ADC1, ENABLE); //ADC1 DMA传送数据打开
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC1的软件转换功能
}
|
|