經(jīng)典STM32 ADC多通道轉(zhuǎn)換
-
STM32ADC多通道轉(zhuǎn)換
-
描述:用ADC連續(xù)采集11路模擬信號,并由DMA傳輸?shù)絻?nèi)存。ADC配置為掃描并且連續(xù)轉(zhuǎn)換模式,ADC的時(shí)鐘配置為12MHZ。在每次轉(zhuǎn)換結(jié)束后,由DMA循環(huán)將轉(zhuǎn)換的數(shù)據(jù)傳輸?shù)絻?nèi)存中。ADC可以連續(xù)采集N次求平均值。最后通過串口傳輸出最后轉(zhuǎn)換的結(jié)果。
-
程序如下:
-
#include"stm32f10x.h"//這個(gè)頭文件包括STM32F10x所有外圍寄存器、位、內(nèi)存映射的定義
-
#include"eval.h"//頭文件(包括串口、按鍵、LED的函數(shù)聲明)
-
#include"SysTickDelay.h"
-
#include"UART_INTERFACE.h"
-
#include
-
-
#defineN50//每通道采50次
-
#defineM12//為12個(gè)通道
-
-
vu16AD_Value[N][M];//用來存放ADC轉(zhuǎn)換結(jié)果,也是DMA的目標(biāo)地址
-
vu16After_filter[M];//用來存放求平均值之后的結(jié)果
-
inti;
-
voidGPIO_Configuration(void)
-
{
-
GPIO_InitTypeDefGPIO_InitStructure;
-
-
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
-
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//因?yàn)閁SART1管腳是以復(fù)用的形式接到GPIO口上的,所以使用復(fù)用推挽式輸出
-
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
-
GPIO_Init(GPIOA,&GPIO_InitStructure);
-
-
-
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
-
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
-
GPIO_Init(GPIOA,&GPIO_InitStructure);
-
-
-
-
//PA0/1/2作為模擬通道輸入引腳
-
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
-
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳
-
GPIO_Init(GPIOA,&GPIO_InitStructure);
-
-
//PB0/1作為模擬通道輸入引腳
-
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
-
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳
-
GPIO_Init(GPIOB,&GPIO_InitStructure);
-
-
//PC0/1/2/3/4/5作為模擬通道輸入引腳
-
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
-
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入引腳
-
GPIO_Init(GPIOC,&GPIO_InitStructure);
-
}
-
-
}
-
-
-
voidRCC_Configuration(void)
-
{
-
ErrorStatusHSEStartUpStatus;
-
-
RCC_DeInit();//RCC系統(tǒng)復(fù)位
-
RCC_HSEConfig(RCC_HSE_ON);//開啟HSE
-
HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待HSE準(zhǔn)備好
-
if(HSEStartUpStatus==SUCCESS)
-
{
-
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//EnablePrefetchBuffer
-
FLASH_SetLatency(FLASH_Latency_2);//Set2Latencycycles
-
RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHBclock=SYSCLK
-
RCC_PCLK2Config(RCC_HCLK_Div1);//APB2clock=HCLK
-
RCC_PCLK1Config(RCC_HCLK_Div2);//APB1clock=HCLK/2
-
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);//PLLCLK=12MHz*6=72MHz
-
RCC_PLLCmd(ENABLE);//EnablePLL
-
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//WaittillPLLisready
-
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//SelectPLLassystemclocksource
-
while(RCC_GetSYSCLKSource()!=0x08);//WaittillPLLisusedassystemclocksource
-
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
-
|RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);//使能ADC1通道時(shí)鐘,各個(gè)管腳時(shí)鐘
-
-
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72M/6=12,ADC最大時(shí)間不能超過14M
-
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA傳輸
-
-
}
-
}
-
-
-
voidADC1_Configuration(void)
-
{
-
ADC_InitTypeDefADC_InitStructure;
-
-
ADC_DeInit(ADC1);//將外設(shè)ADC1的全部寄存器重設(shè)為缺省值
-
-
-
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:ADC1和ADC2工作在獨(dú)立模式
-
ADC_InitStructure.ADC_ScanConvMode=ENABLE;//模數(shù)轉(zhuǎn)換工作在掃描模式
-
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//模數(shù)轉(zhuǎn)換工作在連續(xù)轉(zhuǎn)換模式
-
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//外部觸發(fā)轉(zhuǎn)換關(guān)閉
-
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC數(shù)據(jù)右對齊
-
ADC_InitStructure.ADC_NbrOfChannel=M;//順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目
-
ADC_Init(ADC1,&ADC_InitStructure);//根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器
-
-
-
//設(shè)置指定ADC的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時(shí)間
-
//ADC1,ADC通道x,規(guī)則采樣順序值為y,采樣時(shí)間為239.5周期
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,5,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_9,6,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,7,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,8,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_12,9,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,10,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_14,11,ADC_SampleTime_239Cycles5);
-
ADC_RegularChannelConfig(ADC1,ADC_Channel_15,12,ADC_SampleTime_239Cycles5);
-
-
//開啟ADC的DMA支持(要實(shí)現(xiàn)DMA功能,還需獨(dú)立配置DMA通道等參數(shù))
-
ADC_DMACmd(ADC1,ENABLE);
-
-
-
ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1
-
-
ADC_ResetCalibration(ADC1);//復(fù)位指定的ADC1的校準(zhǔn)寄存器
-
-
while(ADC_GetResetCalibrationStatus(ADC1));//獲取ADC1復(fù)位校準(zhǔn)寄存器的狀態(tài),設(shè)置狀態(tài)則等待
-
-
-
ADC_StartCalibration(ADC1);//開始指定ADC1的校準(zhǔn)狀態(tài)
-
-
while(ADC_GetCalibrationStatus(ADC1));//獲取指定ADC1的校準(zhǔn)程序,設(shè)置狀態(tài)則等待
-
-
-
}
-
-
-
voidDMA_Configuration(void)
-
{
-
-
DMA_InitTypeDefDMA_InitStructure;
-
DMA_DeInit(DMA1_Channel1);//將DMA的通道1寄存器重設(shè)為缺省值
-
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;//DMA外設(shè)ADC基地址
-
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&AD_Value;//DMA內(nèi)存基地址
-
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//內(nèi)存作為數(shù)據(jù)傳輸?shù)哪康牡?/p>
-
DMA_InitStructure.DMA_BufferSize=N*M;//DMA通道的DMA緩存的大小
-
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外設(shè)地址寄存器不變
-
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//內(nèi)存地址寄存器遞增
-
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//數(shù)據(jù)寬度為16位
-
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//數(shù)據(jù)寬度為16位
-
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//工作在循環(huán)緩存模式
-
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA通道x擁有高優(yōu)先級
-
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA通道x沒有設(shè)置為內(nèi)存到內(nèi)存?zhèn)鬏?/p>
-
DMA_Init(DMA1_Channel1,&DMA_InitStructure);//根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道
-
-
}
-
-
-
//配置所有外設(shè)
-
voidInit_All_Periph(void)
-
{