#include "ADC.h"
#include "stm32f10x.h" // Device header
uint16_t AD_Value[4];
uint16_t MySize;
//读取通道,连续转换,非扫描模式,即自己不断刷新ADC的值
void ADC1_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//分频
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Pin=GPIO_Mode_AIN;//在AIN模式下,GPIO是无效的,不适用于数字的数字的输入,或输出,这是由于AIN是专门用于模拟信号的输入。
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//选择规则组的输入通道,补充菜单,多通道;
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_7Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_7Cycles5);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_NbrOfChannel=4;
ADC_InitStructure.ADC_ScanConvMode=ENABLE;//多个依次扫描
ADC_Init(ADC1,&ADC_InitStructure);
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)ADC1->DR;//外设地址
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//数据宽度
DMA_InitStructure.DMA_PeripheralInc=DMA_MemoryInc_Enable;//是否自增,数组之间的转运是需要自增的
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)AD_Value;//存储器地址
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//是否自增,数组之间的转运是需要自增的
DMA_InitStructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_HalfWord;//数据宽度
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//数据存储方向
DMA_InitStructure.DMA_BufferSize=4;
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//自动重装和软件触发不能同时使用
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//配置转运的优先级,有多个通道时,可进行配置
DMA_Init(DMA1_Channel1,&DMA_InitStructure);//DMA完成初始化
ADC_DMACmd(ADC1,ENABLE);//开启ADC数据转换
DMA_Cmd(DMA1_Channel1,DISABLE);//DMA使能
ADC_Cmd(ADC1,ENABLE);//开启电源
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1)==SET);//ADC_GetCalibrationStatus(ADC1)返回复位校准的状态;加上一个while循环,等待复位完成
ADC_StartCalibration(ADC1);//校准
while(ADC_GetCalibrationStatus(ADC1)==SET);
}
void AD_GetValue(void)
{
DMA_Cmd(DMA1_Channel1,DISABLE);//DMA使能
DMA_SetCurrDataCounter(DMA1_Channel1,4);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//开始进行转换
DMA_Cmd(DMA1_Channel1,ENABLE);//DMA使能
while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);//通过标志位知道是否转运成功
DMA_ClearFlag(DMA1_FLAG_TC1);//需要手动清除标志位
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交