第三章AD 转换 本章的内容分两部分,第一是AD 的单通道转换,第二是AD 的多通道转换。首先先将单通道转换。 STM32 中自带的AD 最大的转换频率是14MHZ,共有 16 个转换通道,每个转换通道对应的管脚如下表所示。 管脚名 默认复用功能 PF6 ADC3_IN4 PF7 ADC3_IN5 PF8 ADC3_IN6 PF9 ADC3_IN7 PF10 ADC3_IN8 PC0 ADC123_IN10 PC1 ADC123_IN11 PC2 ADC123_IN12 PC3 ADC123_IN13 PA3 ADC123_IN3 PA6 ADC12_IN6 PA7 ADC12_IN7 PC4 ADC12_IN14 PC5 ADC12_IN15 PB0 ADC12_IN8 PB1 ADC12_IN9 注:ADC123_IN10 表明 PC0 管脚可以作为 AD1,AD2,AD3 的第10 通道。 下面我们将 PC0 配置成 AD1 的通道10 为例进行讲解。 3.1首先我们应将 PC0 设置成模拟输入: #include "adc.h" /*为何定义 ADC1_DR_Address 为((u32)0x40012400+0x4c) ,因为存放 AD 转换结果的寄存器的地址就是0x4001244c*/ #define ADC1_DR_Address ((u32)0x40012400+0x4c) /*定义变量 ADC_ConvertedValue,放 AD1 通道10 转换的数据*/ __IO uint16_t ADC_ConvertedValue; static void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable ADC1 and GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); } 3.2设置完端口后下一步当然是对 AD 进行初始化: 这里需要补充一个知识点 DMA,DMA 就相当与 CPU 的一个秘书,他的作用就是帮 CPU 减轻负担的。说的再具体点就是帮 CPU 来转移数据的。我们都知道,AD 每次转换结束后会将转换的结果放到一个固定的寄存器里,以往我们如果想将该寄存器中的值赋给某一变量时会用到赋值语句,如果不用 DMA,则赋值语句便要 CPU 来完成,CPU 本来就要忙着处理其他事情,现在还要来解决赋值语句这么简单的问题,肯到会蛋疼。所以需要 DMA 这个秘书来帮他解决这个问题。由于 DMA 只是个秘书,所以比较笨,你只有把任务交代清楚了她才能很好的完成任务。那么怎样来给 DMA 吩咐任务呢,聪明的人肯定想到了,那当然是“DMA_Init(DMA1_Channel1, &DMA_InitStru ctu re)”这个函数啦。下面就来一步步的来给DMA 交代任务。 /*...