一、認(rèn)識(shí)ADC兼進(jìn)一步看懂STM的庫
ADC是多少位的?
12位
ADC有多少個(gè)?
1個(gè)、2個(gè)或多至3個(gè),視不同的器件而不同;每個(gè)又有多個(gè)通道。
關(guān)于通道的名堂:
10.3.3 通道選擇
有16個(gè)多路通道??梢园艳D(zhuǎn)換分成兩組:規(guī)則的和注入的。在任意多個(gè)通道上以任意順序進(jìn)行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。
● 規(guī)則組由多達(dá)16個(gè)轉(zhuǎn)換組成。規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇。規(guī)則組中轉(zhuǎn)換的總數(shù)寫入ADC_SQR1寄存器的L[3:0]位中。
● 注入組由多達(dá)4個(gè)轉(zhuǎn)換組成。注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里的轉(zhuǎn)換總數(shù)目必須寫入ADC_JSQR寄存器的L[1:0]位中。
它們有什么區(qū)別:
l 不同的組轉(zhuǎn)換后保存數(shù)據(jù)的地方不一樣,產(chǎn)生的中斷標(biāo)志不一樣。
l 在掃描模式下,規(guī)則組會(huì)有能力把各通道數(shù)據(jù)通過DMA傳給SRAM,而注入組的數(shù)據(jù)總是存在在ADC_JDRx中。
還有其他的一些區(qū)別,這里暫不一一羅列。
ST為什么這么樣來設(shè)計(jì)AD轉(zhuǎn)換,肯定是有理由的,但是我不知道,因此,我也就難以深入地理解AD轉(zhuǎn)換的各種模式。這也就是說,對(duì)于知識(shí)的理解,要把它放在其應(yīng)用背景中去學(xué)習(xí)才能學(xué)得好。因此,其他知識(shí)積累得越多,學(xué)起來也就越快,這也就是所謂的“功底”問題。某人功底深厚,意味著他見多識(shí)廣,遇到的事情多,能夠很快找到處理某件事情的“原型”。當(dāng)然,也有一些人抽象學(xué)習(xí)能力極強(qiáng),就算找不到“原型”,他也能學(xué)得很好?;旧?,這類人的科學(xué)素養(yǎng)更高一些,在工程師、工科類學(xué)生中并不多見。
閑話少說,下面來看怎么樣來使用AD轉(zhuǎn)換器?
以一段源程序?yàn)槔謩e來解讀,同時(shí)進(jìn)一步理解STM32中有關(guān)符號(hào)的含義,相信以后再讀庫源程序,定能更上一層樓。
為看得清楚一些,以下代碼用一種顏色表示。
/* ADC1 開始準(zhǔn)備配置*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
/*設(shè)置ADC-》CR1的19:16,確定ADC工作模式,一共有10種工作模式
#define ADC_Mode_Independent ((uint32_t)0x00000000) 0000:獨(dú)立模式
#define ADC_Mode_RegInjecSimult ((uint32_t)0x00010000) 0001:混合的同步規(guī)則+注入同步模式
#define ADC_Mode_RegSimult_AlterTrig ((uint32_t)0x00020000) 0010:混合的同步規(guī)則+交替觸發(fā)模式
#define ADC_Mode_InjecSimult_FastInterl ((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:規(guī)則同步模式
#define ADC_Mode_FastInterl ((uint32_t)0x00070000) 0111:快速交替模式
#define ADC_Mode_SlowInterl ((uint32_t)0x00080000) 1000:慢速交替模式
#define ADC_Mode_AlterTrig ((uint32_t)0x00090000) 1001:交替觸發(fā)模式
*/
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
/* ADC_ScanConvMode在stm32f10x_adc.h中定義如下:
alState ADC_ScanConvMode;
這個(gè)參數(shù)用來指定轉(zhuǎn)換是掃描(多通道模式)還是單個(gè)轉(zhuǎn)換(單通道模式),該參數(shù)可以被設(shè)置為DISABLE或者ENABLE。
在數(shù)據(jù)手冊(cè)中,SCAN位是這樣描述的:掃描模式
該位由軟件設(shè)置和清除,用于開啟或關(guān)閉掃描模式。在掃描模式中,由ADC_SQRx或ADC_JSQRx寄存器選中的通道被轉(zhuǎn)換。
0:關(guān)閉掃描模式
1:使用掃描模式
注:如果分別設(shè)置了EOCIE或JEOCIE位,只在最后一個(gè)通道轉(zhuǎn)換完畢才會(huì)產(chǎn)生EOC或JEOC中斷。
這樣,如果一次需要對(duì)多個(gè)通道進(jìn)行轉(zhuǎn)換,這位就必須設(shè)置為ENABLE。
*/
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
/* alState ADC_ContinuousConvMode;
這個(gè)參數(shù)用來指定轉(zhuǎn)換是連續(xù)進(jìn)行還是單次進(jìn)行,它可以設(shè)置為ENABLE或者DISABLE。
這兩個(gè)參數(shù)中出現(xiàn)了alState數(shù)據(jù)類型,那么它是什么呢,順滕摸瓜,可以看到它的的定義如下:
typedef enum {DISABLE = 0, ENABLE = !DISABLE} alState;
因此,它相當(dāng)于是一個(gè)位變量,我的理解,DISPABLE=0這個(gè)沒有問題,ENABLE=!DISABLE是否應(yīng)該確切的是1??否則下面的設(shè)置就會(huì)有問題。
用這兩個(gè)符號(hào)來對(duì)寄存器中的位進(jìn)行設(shè)置的話,還需要提供位置信息,如下面的代碼所示:
tmpreg1 |= (uint32_t)(ADC_InitStruct-》ADC_DataAlign | ADC_InitStruct-》ADC_ExternalTrigConv |
((uint32_t)ADC_InitStruct-》ADC_ContinuousConvMode 《《 1));
這個(gè)《《1就是位置信息,CONT是CON2寄存器的位1
這樣,我們看STM32的庫又能多看懂一點(diǎn)了。
用于設(shè)定CON2的CONT位(位1):是否連續(xù)轉(zhuǎn)換
該位由軟件設(shè)置和清除。如果設(shè)置了此位,則轉(zhuǎn)換將連續(xù)進(jìn)行直到該位被清除。
評(píng)論
查看更多