#技术资源# 本帖以APM32F103为例讲解如何实现多路ADC采集通过DMA传输的应用,APM32F103系列ADC和DMA基础知识的详细介绍请参见我司《APM32F103xDxE数据手册》和《APM32F103xCxDxE用户手册》。本例使用4路ADC采集数据,通过DMA将每路数据传输至16位的数组中,数组长度为4。
下面进入具体配置的细节说明:1. 基本定义
<font face="Times New Roman">#define ADC1_DR_Address ((uint32_t)0x40012400+0x4c) /* ADC1数据寄存器地址(ADC1基地址+偏移) */
uint16_t dma_buffer[4] = {0}; /* 存储DMA传输ADC数据的buffer */
uint8_t dma_data_done_flag = 0; /* DMA传输完成中断标志 */
uint8_t adc_int_eoc_flag = 0; /* ADC转换完成中断标志 */
</font>
宏定义ADC1_DR_Address为DMA传输的起始地址,也就是ADC1的数据寄存器地址,通过查看手册可知,ADC1的基地址为0x40012400,而ADC规则数据寄存器(ADC_REGDATA)的偏移地址为0x4C。这里定义uint16_t dma_buffer[4]为DMA传输的目的地址,也就是用于存放ADC采样数据的内存地址。
2. 时钟配置
<font face="Times New Roman">void RCM_Configuration(void)
{
RCM_ConfigADCCLK(RCM_PCLK2_DIV_6); /* 6分频 72/6=12MHZ ADCCLK不能超过14MHZ*/
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_GPIOC); /* 使能GPIO时钟 */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1); /* 使能USART1时钟 */
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA1); /* 使能DMA1时钟 */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1); /* 使能ADC1时钟 */
}</font>
本例所用的外设有GPIO,USART,ADC,DMA,对应的时钟均需要使能,通过查看手册可知,DMA的时钟来源为AHB总线,ADC的时钟来源为APB2总线,注意ADCCLK不要超过14MHz。
3. GPIO初始化
void GPIO_Init(void)
{
GPIO_Config_T GPIO_ConfigStruct;
/* USART_GPIO初始化 */
GPIO_ConfigStruct.pin = GPIO_PIN_9;
GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOA, &GPIO_ConfigStruct);
/* ADC_GPIO初始化 */
GPIO_ConfigStruct.pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3; /* 选择端口 分别对应ADC通道10 11 12 13*/
GPIO_ConfigStruct.mode = GPIO_MODE_ANALOG; /* IO工作方式 模拟输入*/
GPIO_Config(GPIOC, &GPIO_ConfigStruct);
}
以ADC1的通道10,11,12,13为例,初始化对应的GPIO端口,通过查阅数据手册可知,GPIO的PC0~PC3可复用为ADC1的通道10,11,12,13。 |