一、认识ADC兼进一步看懂STM的库
ADC是多少位的?
12位
ADC有多少个?
1个、2个或多至3个,视不同的器件而不同;每个又有多个通道。
关于通道的名堂:
10.3.3 通道选择
有16个多路通道。可以把转换分成两组:规则的和注入的。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。
● 规则组由多达16个转换组成。规则通道和它们的转换顺序在ADC_SQRx寄存器中选择。规则组中转换的总数写入ADC_SQR1寄存器的L[3:0]位中。
● 注入组由多达4个转换组成。注入通道和它们的转换顺序在ADC_JSQR寄存器中选择。注入组里的转换总数目必须写入ADC_JSQR寄存器的L[1:0]位中。
它们有什么区别:
l 不同的组转换后保存数据的地方不一样,产生的中断标志不一样。
l 在扫描模式下,规则组会有能力把各通道数据通过DMA传给SRAM,而注入组的数据总是存在在ADC_JDRx中。
还有其他的一些区别,这里暂不一一罗列。
ST为什么这么样来设计AD转换,肯定是有理由的,但是我不知道,因此,我也就难以深入地理解AD转换的各种模式。这也就是说,对于知识的理解,要把它放在其应用背景中去学习才能学得好。因此,其他知识积累得越多,学起来也就越快,这也就是所谓的“功底”问题。某人功底深厚,意味着他见多识广,遇到的事情多,能够很快找到处理某件事情的“原型”。当然,也有一些人抽象学习能力极强,就算找不到“原型”,他也能学得很好。基本上,这类人的科学素养更高一些,在工程师、工科类学生中并不多见。
闲话少说,下面来看怎么样来使用AD转换器?
以一段源程序为例分别来解读,同时进一步理解STM32中有关符号的含义,相信以后再读库源程序,定能更上一层楼。
为看得清楚一些,以下代码用一种颜色表示。
/* ADC1 开始准备配置*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
/*设置ADC-》CR1的19:16,确定ADC工作模式,一共有10种工作模式
#define ADC_Mode_Independent ((uint32_t)0x00000000) 0000:独立模式
#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) 0001:混合的同步规则+注入同步模式
#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) 0010:混合的同步规则+交替触发模式
#define ADC_Mode_InjecSimult_Fas TI nterl ((uint32_t)0x00030000) 0011:混合同步注入+快速交替模式
#define ADC_Mode_InjecSimult_SlowInterl ((uint32_t)0x00040000) 0100:混合同步注入+慢速交替模式
#define ADC_Mode_InjecSimult ((uint32_t)0x00050000) 0101:注入同步模式
#define ADC_Mode_RegSimult ((uint32_t)0x00060000) 0110:规则同步模式
#define ADC_Mode_Fas TI nterl ((uint32_t)0x00070000) 0111:快速交替模式
#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) 1000:慢速交替模式
#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) 1001:交替触发模式
*/
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
/* ADC_ScanConvMode在stm32f10x_adc.h中定义如下:
alState ADC_ScanConvMode;
这个参数用来指定转换是扫描(多通道模式)还是单个转换(单通道模式),该参数可以被设置为DISABLE或者ENABLE。
在数据手册中,SCAN位是这样描述的:扫描模式
该位由软件设置和清除,用于开启或关闭扫描模式。在扫描模式中,由ADC_SQRx或ADC_JSQRx寄存器选中的通道被转换。
0:关闭扫描模式
1:使用扫描模式
注:如果分别设置了EOCIE或JEOCIE位,只在最后一个通道转换完毕才会产生EOC或JEOC中断。
这样,如果一次需要对多个通道进行转换,这位就必须设置为ENABLE。
*/
ADC_InitStructure.ADC_Con TI nuousConvMode = ENABLE;
/* alState ADC_Con TI nuousConvMode;
这个参数用来指定转换是连续进行还是单次进行,它可以设置为ENABLE或者DISABLE。
这两个参数中出现了alState数据类型,那么它是什么呢,顺滕摸瓜,可以看到它的的定义如下:
typedef enum {DISABLE = 0, ENABLE = !DISABLE} alState;
因此,它相当于是一个位变量,我的理解,DISPABLE=0这个没有问题,ENABLE=!DISABLE是否应该确切的是1??否则下面的设置就会有问题。
用这两个符号来对寄存器中的位进行设置的话,还需要提供位置信息,如下面的代码所示:
tmpreg1 |= (uint32_t)(ADC_InitStruct-》ADC_DataAlign | ADC_InitStruct-》ADC_ExternalTrigConv |
((uint32_t)ADC_InitStruct-》ADC_ContinuousConvMode 《《 1));
这个《《1就是位置信息,CONT是CON2寄存器的位1
这样,我们看STM32的库又能多看懂一点了。
用于设定CON2的CONT位(位1):是否连续转换
该位由软件设置和清除。如果设置了此位,则转换将连续进行直到该位被清除。