在学习STM32的时候,发现无论是STM32F103RC还是STM32F407ZG都只有ADC转换的例程和UART DMA的例程。所以写了一份DMA传输ADC的程序,希望对大家有帮助。
程序:使用了STM32F407ZG(STM32F4探索者)的开发板,通过ADC去采集PA5,PA6,PA7引脚的电平。然后由DMA传输,在串口上显示出采集的值。
PS:程序在STM32F1mini上也通用自己对照着改一下IO口和一些通道配置就好。
首先当然是配置我们的IO口:
void My_DAC_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//初始化ADC1通道5.6.7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //PA5 通道5 PA6 通道6 PA7 通道7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
查阅手册可以看到PA5对应的是ADC的IN5,PA6对应的是ADC的IN6,PA7对应的是ADC的IN7。
这样就配置好了通道。通道也选择的是相近的这方便与DMA传输过程中的地址增加。
接下来配置ADC:
void My_Adc_Init(void)
{
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //禁止DMA直接访问
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //ADC独立模式
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //4分频
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles; //采样时间间隔
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换使能,因为这里是转换三个通道
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC的对齐模式
ADC_InitStructure.