第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

工業檢測系統和日常生活中有許多物理量都是模擬量,比如溫度、長度、壓力、速度等等,這些物理模擬量可以通過傳感器變成與之對應的電壓、電流等電模擬量。由於單片機系統是一個典型的數字系統,為了實現數字系統對這些電模擬量的檢測、運算和控制,就需要模數轉換模塊ADC。

10.1 模數轉換器件—ADC

10.1.1 ADC的基本概念

模數轉換器(Analog To Digital Converter)簡稱ADC(也可以寫成A/D),是指將連續變化的模擬信號轉換為離散的數字信號的器件。ADC分為積分型、逐次逼近型、並行/串行比較型、Σ-Δ型等多種類型,STM32F103自帶的ADC屬於逐次逼近型。

逐次逼近型ADC與天平稱物重非常相似,從高位到低位逐位比較。首先從最重的砝碼開始試放,與被稱物體行進比較,若物體重於砝碼,則該砝碼保留,否則移去,然後用次重砝碼繼續比較,照此一直到最小一個砝碼為止,將所有留下的砝碼重量相加,就得此物體的重量。逐次逼近型A/D轉換器,就是將輸入模擬信號與不同的參考電壓作多次比較,使轉換所得的數字量在數值上逐次逼近輸入模擬量對應值。

10.1.2 ADC的功能描述

STM32F103ZE系列擁有3路12位ADC,每一路ADC都有18個輸入通道,為了方便理解,將ADC功能框圖進行分塊,然後針對每個功能塊進行講解,如圖10-1所示。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-1 ADC結構圖

1、電源和基準源

模擬電源VDDA和VSSA是ADC的供電引腳,輸入範圍為2.4V到3.6V,通常情況是和數字電源的電壓一致。為了防止電源噪聲影響,將3.3V數字電源通過簡易濾波處理接到模擬電源VDDA,比如加一個磁珠;VSSA在不同應用場景和數字VSS連接方法也不完全一致,簡易處理方式是直接接數字VSS,ST官方的DEMO板採用的是單點接地方式。

基準源,也叫基準電壓或參考電壓,是ADC的一個重要指標,基準源的偏差會直接影響轉換結果的準確度。STM32F103系列只有100及以上引腳的型號才具備外部參考電壓引腳VREF+和VREF-,其他型號參考電壓引腳在內部默認連接到ADC的電源引腳VDDA和VSSA。

Kingst-32F1開發板直接將VREF+與VDDA相連,VREF-與VSSA相連,這兩個引腳決定了ADC的電壓輸入範圍,即:VREF-≤VIN ≤VREF+,ADC的電源和基準源電路如圖10-2所示。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-2 ADC電源和基準源電路

2、ADC時鐘和轉換時間

ADC外設掛載在APB2總線上,其輸入時鐘由掛載在APB2時鐘(PCLK2)上的ADC預分頻器經分頻後產生,最高不超過14MHz。由於APB2總線上通常有多個外設同時工作時,為了保證運行速率,設置APB2為最大速率72Mhz,此時只能通過ADC預分頻器設置ADC的輸入時鐘頻率,並且還要保證其不超過最大14Mhz,ADC時鐘結構如圖10-3所示。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-3 ADC時鐘結構示意圖

ADC的預分頻器位於RCC時鐘配置寄存器中的[15:14] 2個寄存器位。ADC預分頻器控制位為00時表示最低2分頻,最高可設置8分頻,具體配置庫函數如下,設置參數如表10-1所示。

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

ADC總轉換時間如下計算:轉換時間 Tconv =採樣時間+ 12.5週期

通過配置ADC採樣時間寄存器ADC_SMPR1和ADC_SMPR2中的SMPx[2:0]位(x為0到17,管理ADC的18個通道)可以獨立選擇每個通道的採樣時間,分別是1.5週期、7.5週期、13.5週期、28.5週期、41.5週期、55.5週期、71.5週期和239.5週期,所以總轉換時間最短14個週期,最長252個週期。

如何選擇合適的採樣時間?這是一個特別重要,並且容易被初學者忽略的問題。如果選取的採樣時間不合理,就有可能出現較大的採樣誤差。

ADC採樣的過程要對內部一個容值很小的電容進行充電,當外部阻抗(輸入到ADC引腳的信號調理電路的輸出阻抗)較大時,電流比較小,充電時間就比較長。在這種情況下,如果採樣時間較短,可能電容還沒被充滿,這樣便會出現採樣誤差,轉換後的數據也會有誤差。因此採樣時間需要與輸入阻抗相匹配,通常ADC輸入阻抗越大,採樣時間越長。

ADC最大輸入阻抗與採樣時間計算公式如下所示:(公式僅供瞭解,重點是後面結論)

第10章 模數轉換ADC與直接內存存取技術DMA

RAIN:最大輸入阻抗;

TS:採樣週期;

fADC:ADC時鐘頻率;

CADC:內部採樣並保持電容器,最大為8pF;

In(2N+2):Log以e為底數的對數,N表示ADC位數(N=12),其值約為9.704;

RADC:內部採樣開關電阻,最大為1K;

假設外部輸入阻抗為10K,ADC時鐘頻率為14Mhz,由公式(1)得:

第10章 模數轉換ADC與直接內存存取技術DMA

經過計算可得Ts > 11.96,因此當外部輸入阻抗為10K時,ADC時鐘頻率為14Mhz時,採樣時間應該為11.96個週期,但是ADC採樣週期中並無該值,因此可以選擇相近的13.5個週期,注意:採樣時間寧長勿短。

當fADC =14Mhz時,理論上最大輸入阻抗與採樣時間關係如表10-2所示。

第10章 模數轉換ADC與直接內存存取技術DMA

在實際應用中,大多數模擬信號是通過運算放大器再進入ADC通道,運算放大器的阻抗通常是幾十歐,在這種情況下根據表10-2,採樣週期就可以用到最短1.5個週期。在一些輸入阻抗比較大的場合,可以在線路中加入一個較大的電容(達到內部採樣保持電容的千倍以上),可以實現用這個大電容快速給內部採樣保持電容充電的效果,大幅降低採樣所需時間,Kingst-32F1開發板的電壓採集電路中的C89電容就是這樣一個作用,10.3小節會講到。

3、ADC輸入通道

STM32F103ZE的3個ADC模塊,其中ADC1提供給用戶可用通道16個,其餘2個通道一個接STM32內部溫度傳感器,另外一個接內部參考電壓VREFINT;ADC2提供給用戶可用通道16個,其餘兩個通道接VSS;ADC3提供給用戶可用通道13個,其餘5個通道接VSS。3個ADC模塊共用了部分通道,不同ADC應用不同通道時,可以同時進行採樣和轉換,但不可以對相同通道同時採樣,ADC輸入通道引腳如表10-3所示。

第10章 模數轉換ADC與直接內存存取技術DMA

在使用ADC外部通道時,可以設定為規則組和注入組。規則組就是設定好轉換順序後,按照規則正常轉換;注入組類似於中斷,可以插隊,當觸發信號觸發注入組通道時,優先轉換注入組,轉換完後再繼續轉換規則組;如果正在轉換規則通道期間,注入通道被觸發,當前規則組轉換被複位,注入通道序列被以單次掃描方式轉換,完成轉換後恢復上次被中斷的規則通道轉換。規則組最多可以使用16個通道,注入組最多可以使用4個通道,其工作模式如圖10-4所示。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-4 規則組與注入組工作方式示意圖

4、ADC通道轉換順序

規則通道的轉換順序由ADC的規則序列ADC_SQR3、ADC_SQR2、ADC_SQR1這三個寄存器控制,使用規則組轉換時,將要轉換的通道序號寫入到對應寄存器相應的位,並設置規則通道轉換序列的通道數目。對應關係如表10-4所示。

第10章 模數轉換ADC與直接內存存取技術DMA

注入通道的轉換順序由序列寄存器ADC_JSQR這個寄存器控制,特別注意的是,如果設置了4個注入通道並且轉換的通道數目是4,則轉換順序是:JSQR1→JSQR2→JSQR3

→JSQR4;如果設置轉換通道數目為3,但是實際配置的轉換通道數目為4,則轉換順序是JSQR2→JSQR3→JSQR4,而不是從JSQR1→JSQR2→JSQR3,注入序列寄存器JSQR與通道的對應關係如表10-5所示。

第10章 模數轉換ADC與直接內存存取技術DMA

當“轉換組”只有一個通道轉換時稱之為單通道模式,當有多個通道按順序轉換時稱之為多通道模式或者掃描模式。當規則組或注入組的通道按照設定順序執行一次採轉換後即停止工作,這種模式稱之為單次轉換模式;如果執行完一次轉換後,ADC沒有停止,而是立即啟動新一輪轉換,這種模式稱之為連續轉換模式。

5、觸發源

觸發啟動轉換:觸發啟動轉換分為兩種方式,分別是軟件觸發和外部事件觸發(外部是相對於ADC外設來講),其中外部事件觸發又分為定時器觸發和外部觸發(這裡的外部指的是芯片外部信號)。是否啟用觸發轉換,由寄存器ADC_CR2的EXTTRIG位(規則組)和JEXTTRIG位(注入組)決定。選用何種觸發方式,是由寄存器ADC_CR2的EXTSEL[2:0]位(規則組)和 JEXTSEL[2:0]位(注入組)來控制。具體的觸發方式可以通過查閱手冊的ADC_CR2寄存器詳細瞭解。

6、數據寄存器

(1)規則組數據寄存器:

在獨立ADC模式下,規則組通道轉換完成後,轉換後的數據被存儲在對應的ADC規則數據寄存器ADC_DR的低16位。

雙ADC模式是ADC1和ADC2同時採集某些參數,比如要獲取瞬時功率需要同時採集電壓和電流參數才能準確計算結果,這種場合就必須使用雙ADC模式。這種模式下ADC1所對應的ADC_DR的高16位存儲ADC2的規則數據,低16位存儲ADC1的規則數據。

由於ADC的精度是12位,因此在將ADC的12位數據存入16位的數據寄存器中時,可以通過ADC_CR2寄存器的ALIGN位來選擇數據是左對齊還是右對齊。

規則通道最多有16個通道,但規則數據寄存器只有一個,因此當使用多通道轉換時,前一個轉換的通道數據,會被後一個通道轉換的數據覆蓋掉,因此理論上必須在後一個通道轉換完畢之前就把數據取走。為了確保不產生丟失數據的情況,開啟DMA傳輸模式,將數據傳輸到內存中是一個好辦法,這部分相關內容後續介紹。

(2)注入組數據寄存器:

ADC注入組最多有4個通道,每個通道都有對應的數據寄存器ADC_JDRx(x=1..4),ADC_JDRx是32位的,高16位保留,低16位用來保存數據,選擇數據是左對齊還是右對齊都由ALIGN決定。

6、中斷處理

如果打開相應的中斷,有三種情況可以進入中斷。

(1)規則通道轉換完成中斷

1. 轉換數據被存儲在16位的ADC_DR寄存器中。

2. EOC(轉換結束)標誌被置位。

3. 如果設置了EOCIE位,則產生中斷。

(2)注入通道轉換完成中斷

1. 轉換數據被存儲在16位的ADC_DRJx寄存器中。

2. JEOC(注入轉換結束)標誌被置位。

3. 如果設置了JEOCIE位,則產生中斷。

(3)模擬看門狗中斷

如果開啟了模擬看門狗中斷,並且設置ADC低閾值ADC_LTR和高閾值ADC_HTR,當採集到的電壓高於高閾值或者低於低閾值時,就會產生模擬看門狗中斷。

10.2 ADC 配置流程

10.2.1 初始化結構體

初始化結構體中包含了ADC模塊的主要配置內容,分別是ADC模式、通道模式、轉換模式、觸發條件、通道數目,下面通過代碼對結構體每個成員介紹:

第10章 模數轉換ADC與直接內存存取技術DMA

1、ADC_Mode——ADC模式

ADC分為ADC獨立模式和雙ADC模式,獨立模式只有一種情況,而雙ADC模式有多種情況,本小節先介紹獨立ADC模式,因此直接選擇ADC_Mode_Independent,如表10-6所示。

第10章 模數轉換ADC與直接內存存取技術DMA

2、ADC_ScanConvMode——通道模式

ADC_ScanConvMode 設置了ADC通道工作在多通道模式還是單通道模式,如表10-7所示。

第10章 模數轉換ADC與直接內存存取技術DMA

3、ADC_ContinuousConvMode——轉換模式

ADC_ContinuousConvMode 設置了ADC採用連續轉換還是單次轉換模式,如表10-8所示。

第10章 模數轉換ADC與直接內存存取技術DMA

4、ADC_ExternalTrigConv——觸發轉換方式

ADC_ExternalTrigConv定義了規則組使用何種觸發方式如表10-9所示。

第10章 模數轉換ADC與直接內存存取技術DMA

注入組需要通過專門的ADCx 外部觸發啟動注入組轉換函數來設置注入組觸發方式,該函數如下:

第10章 模數轉換ADC與直接內存存取技術DMA

其中ADCx外設,ADC_ExternalTrigConv為注入組觸發方式,注意注入組觸發方式與規則組有所不同,具體如表10-10所示。

第10章 模數轉換ADC與直接內存存取技術DMA

5、ADC_DataAlign——數據格式

ADC_DataAlign規定了ADC數據向左邊對齊還是向右邊對齊,存儲格式如圖10-5所示。圖中SEXT位是擴展的符號位,因為注入組通道轉換的數據值已經減去了在“注入通道數據偏移寄存器”中定義的偏移量,所以結果可以是一個負值。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-5數據對齊方式

第10章 模數轉換ADC與直接內存存取技術DMA

6、ADC_NbrOfChannel——通道數目

ADC_NbreOfChannel 規定了規則轉換的 ADC 通道的數目,取值範圍是1到16。而注入組是通過專門的函數實現的,如下所示。

第10章 模數轉換ADC與直接內存存取技術DMA

ADCx表示ADC外設,Length表示注入組通道數目,取值範圍為1~4。

10.2.2 設置轉換組的通道順序及採樣時間

1、規則組通道配置函數:

第10章 模數轉換ADC與直接內存存取技術DMA

2、注入組通道配置函數:

第10章 模數轉換ADC與直接內存存取技術DMA

其中ADCx表示選擇使用哪個ADC,x可以是1,2或3;ADC_Channel表示配置的通道號,詳情參考表10-8中ADC_Channel的值;Rank表示規則組採樣順序,規則組取值範圍 1 到 16,注入組範圍是1到4;ADC_SampleTime表示ADC通道的採樣時間,詳情參考表10-12中ADC_SampleTime的值。

第10章 模數轉換ADC與直接內存存取技術DMA

10.2.3 使能ADC外設

ADC_CR2寄存器的第0位ADON負責控制ADC的喚醒、掉電以及軟件啟動轉換功能。ADON位上電默認為‘0’,即默認ADC模塊是不工作的,當ADON為從‘0’寫入‘1’以後,ADC從斷電模式下喚醒工作,這個喚醒需要1個穩定時間tSTAB,如圖所示10-6所示。除了前邊講的通過觸發源啟動ADC外,當ADON從‘1’再次寫入‘1’時,也可以啟動ADC轉換,這種方式大多情況下不使用。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-6 ADC時序圖

通過清除ADON位可以停止轉換,並將ADC置於斷電模式,在這個模式下,ADC幾乎不耗電(僅幾個uA)。

第10章 模數轉換ADC與直接內存存取技術DMA

ADCx標誌ADC外設,x為1、2、3;NewState 可以為ENABLE或DISABLE,分別對應使能和失能。

10.2.4 ADC校準

ADC有一個內置自校準模式,可以大幅減小由於內部電容的變化而造成的精準度誤差。通過設置ADC_CR2寄存器的CAL位啟動校準,一旦校準結束,CAL位被硬件復位。建議在每次上電時執行一次ADC校準,啟動校準前,ADC必須處於上電狀態(ADON=‘1’)至少超過兩個ADC時鐘週期,校準代碼如下所示:

第10章 模數轉換ADC與直接內存存取技術DMA

10.2.5 使能通道觸發轉換

規則組和注入組觸發方式方式分為軟件觸發和外部觸發,其中外部觸發包括定時器觸發和外部信號觸發。如果設置了規則組或注入組觸發方式,還需要使能相應觸發,保證在觸發到來時啟動轉換。規則組和注入組通道觸發方式使能函數如下所示;

1、規則組通道觸發使能

軟件觸發使能:

第10章 模數轉換ADC與直接內存存取技術DMA

外部觸發使能:

第10章 模數轉換ADC與直接內存存取技術DMA

2、注入組通道觸發使能

軟件觸發使能:

第10章 模數轉換ADC與直接內存存取技術DMA

外部觸發使能:

第10章 模數轉換ADC與直接內存存取技術DMA

其中ADCx標誌ADC外設,x為1、2、3;NewState 可以為ENABLE或DISABLE,分別對應使能和失能。

10.3 ADC獨立模式單通道軟件觸發轉換

本小節通過ADC1規則組單通道模式測量KST-32開發板的USB電源輸入電壓,測量電路如圖10-7所示。已知該電路的輸入阻抗為10K,根據輸入阻抗與採樣時間關係,應該選擇採樣時間最短為13.5個週期,再短就會產生較大誤差。但是如果在電路上加入了C89這個0.1uF的電容後,就可以起到快速給ADC內部採樣保持電容充電的效果,因此即使使用最短採樣時間1.5個週期,也可以保證測量精度。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-7 電壓測量電路

該實驗通過軟件啟動ADC轉換,主循環中並不是實時顯示ADC的轉換結果,為了降低ADC的功耗,只有在讀取測量結果時再啟動一次轉換,轉換完畢後停止轉換。具體配置流程如下:

1、初始化ADC1通道引腳(內部溫度傳感器和參照電壓通道不需要進行引腳初始化)

2、配置ADC1中斷優先級(如果使用ADC中斷,本節未使用)

3、使能 ADC1外設時鐘

4、設置ADC1預分頻係數

5、復位ADC1

6、配置ADC1初始化結構體

7、設置規則組轉換順序和採樣時間

8、使能ADC1中斷(本節未使用)

9、使能ADC1外設

10、校準ADC1

11、使能ADC1軟件觸發或外部觸發轉換

12、編寫中斷服務函數(如果使用ADC中斷,本節未使用)

具體代碼如下:

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

10.4 ADC獨立模式規則組單通道外部觸發轉換

本節依舊是通過ADC1規則組單通道模式測量KST-32開發板的USB電源輸入電壓,但是觸發方式由軟件觸發,改為定時器觸發,這裡選擇使用ADC_ExternalTrigConv_T2_CC2(定時器2輸出比較觸發),通過設置定時器每隔20ms觸發一次ADC採樣及轉換,此時ADC的採樣頻率為50Hz。實驗中對十次轉換數據求平均,以此減少參考電源不穩定帶來的影響。

由於ADC間隔20ms保存一次數據,為了防止數據被覆蓋,為此開闢一個緩衝區用於存儲轉換後的數據,每轉換一次就保存一次數據到緩衝區,當轉換完十次後就讀取前十次的數據進行處理;此時ADC繼續轉換,數據繼續向後存儲,當轉換完二十次後,再讀取後十次的數據處理,然後下一次轉換後的數據從緩衝區起始位置存儲,以此循環,這樣可以有效的解決數據丟失以及覆蓋的問題,具體代碼如下:

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

10.5 直接內存存取技術——DMA

10.5.1 什麼是DMA

當處理單片機外設數據時,通常的流程是CPU先將外設產生的大量數據加載到存儲器中,然後CPU再從存儲器中讀取並處理數據。按照這種處理方式,外設和存儲器之間的數據傳輸是通過CPU執行一段程序來實現的,但是當外設產生的數據量比較大的時候,就會大幅降低CPU的執行效率。為了解決這個問題,工程師們設計出一項不需要CPU執行,便可以直接控制數據在外設和存儲器之間或者存儲器和存儲器之間傳輸的技術,稱之為直接存儲器存取技術(Direct Memory Access,簡稱DMA)。

DMA用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。無須CPU干預,數據可以通過DMA快速地移動,這就節省CPU的資源可以做其他操作。DMA傳輸的本質是地址到地址的操作,可以把DMA理解為CPU的“秘書”。之所以稱之為“秘書”是因為它只聽從CPU的支配,並且它的能力也是有限的,只能幫助CPU傳遞數據,並不能發號施令。

10.5.2 DMA工作流程

STM32F103ZE系列具有2個DMA控制器,其中DMA1擁有7個通道,DMA2擁有5個通道。DMA的每個通道都直接連接專用的硬件DMA請求,每個通道也都支持軟件觸發,並且也可以設置優先權。每個通道都有3個事件標誌(DMA半傳輸、DAM傳輸完成、DMA傳輸出錯)可以請求中斷。通道傳輸的數據量是可編程的,最大65535個字節,DMA功能框圖如圖10-8所示。

第10章 模數轉換ADC與直接內存存取技術DMA

圖10-8 DMA結構圖

1、DMA請求

當外設需要傳輸數據時,外設向DMA發送DMA請求,DMA控制器會先回應一個應答信號。當獲取到DMA的應答信號時,外設立即釋放它的請求,如果有更多請求時,外設可以啟動下一個週期。

DMA傳輸通常作用在數據量較大的外設到存儲器、存儲器到外設以及存儲器到存儲器中,比如ADC、SPI、外部SRAM、定時器等設備,每個外設都有對應的DMA傳輸通道,具體DMA請求映像如表10-13和10-14所示,這兩張表的內容即用即查。

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

2、DMA仲裁

多個DMA通道出現請求時,就要有處理先後的順序問題,這和中斷優先級處理是類似的。DMA請求可以通過軟件編程設置優先級(很高、高、中等和低),高優先級的優先執行;如果多個DMA請求的優先級一樣,則通道號小的優先執行,比如通道0優先於通道1,注意DMA通道不存在嵌套問題,只有當前通道傳輸執行完畢,才會執行下一個優先級較高的通道。

3、DMA數據傳輸

每個通道都可以在有固定地址的外設寄存器和存儲器地址之間執行DMA傳輸。在啟動DMA數據傳輸之前需要設定數據源地址和目標地址,以及傳輸的數據寬度和數據對齊方式,這樣才能保證數據傳輸的可靠性。

當傳輸一半的數據後,半傳輸標誌位(HTIF)被置1,如果設置了允許半傳輸中斷位(HTIE),將產生一箇中斷請求;當數據傳輸結束後,傳輸完成標誌位(TCIF)被置1,如果設置了允許傳輸完成中斷位(TCIE),將產生一箇中斷請求。

4、DMA傳輸模式

DMA擁有兩種工作模式,一種是非循環模式,一種是循環模式。

非循環模式下,結束傳輸後將不再產生DMA操作。要重新開始新的DMA傳輸,需要在關閉DMA通道的情況下,重新在傳輸數量寄存器DMA_CNDTRx中寫入傳輸數目。

在循環模式下,數據傳輸的數目DMA_CNDTRx寄存器變0以後,會自動被重新加載為初始值。

由於循環模式會自動重新開啟傳輸,就有可能造成剛剛存入的數據還未被取走,新的數據進入。在實際工程中如何解決這類問題呢?這個時候過半傳輸標誌位就要發揮作用了。

假如要傳輸的字節數是10個,那麼可以將數目寄存器設定為20,然後開闢20個字節的緩衝空間。當傳輸完10個字節的後,過半傳輸標誌位置1,進入中斷,將數據取出;同時在這個過程中,如果有新的數據進入,會直接繼續往緩衝區後半段送,當數目寄存器變0,緩衝區存滿,傳輸完成標誌位置1,進入中斷,將後半段取出。此時由於在循環模式下,DMA數目寄存器被複位成為20,進入下一輪循環。

10.5.3 配置DMA

1、初始化DMA

DMA初始化結構體的相關內容如下所示:

第10章 模數轉換ADC與直接內存存取技術DMA

(1)DMA_PeripheralBaseAddr——DMA傳輸的外設基地址,一般該地址為外設的數據寄存器地址,如果使用存儲器到存儲器傳輸,則為其中一個存儲器的基地址。

(2)DMA_MemoryBaseAddr——DMA傳輸的存儲器基地址,通常是程序開闢的一段內存的起始地址。

(3)DMA_DIR——DMA傳輸方向,可以設定外設到存儲器,存儲器到外設,配置參數如表10-15所示。

第10章 模數轉換ADC與直接內存存取技術DMA

(4)DMA_BufferSize——DMA數據傳輸的數量,其數據單位與結構體中的外設數據寬度和存儲器數據寬度單位一致,有三種類型:Byte(8位)、HalfWord(16位)、word(32位)。DMA_BufferSize設置的是DMA_CNDTRx寄存器的值,範圍為0至65535。

(5)DMA_PeripheralInc——外設地址寄存器是否遞增,配置參數如表10-16所示。

第10章 模數轉換ADC與直接內存存取技術DMA

(6)DMA_MemoryInc——內存地址是否遞增,配置參數如表10-17所示。

第10章 模數轉換ADC與直接內存存取技術DMA

(7)DMA_PeripheralDataSize——外設數據寬度,根據外設數據寄存器的寬度可以選擇8位、16位、32位數據長度,配置參數如表10-18所示。

第10章 模數轉換ADC與直接內存存取技術DMA

(8)DMA_MemoryDataSize——存儲器數據寬度,可以選擇8位、16位、32位數據長度,如果沒有特殊要求,應與外設數據寬度保持一致,配置參數如表10-19所示。

第10章 模數轉換ADC與直接內存存取技術DMA

(9)DMA_Mode ——DMA工作模式,可以設置為循環模式和非循環模式,配置參數如表10-20所示。

第10章 模數轉換ADC與直接內存存取技術DMA

(10)DMA_Priority——DMA通道的優先級,配置參數如表10-21所示。

第10章 模數轉換ADC與直接內存存取技術DMA

(11)DMA_M2M——使能DMA通道的存儲器到存儲器傳輸,配置參數如表10-22所示。

第10章 模數轉換ADC與直接內存存取技術DMA

2、使能DMA通道

根據所使用的外設,選擇使能對應的DMA通道,代碼如下:

第10章 模數轉換ADC與直接內存存取技術DMA

DMAy_Channelx:表示DMAx的通道號;NewState:表示使能或使能,ENABLE-使能,DISABLE-失能。比如使能DMA1通道1,代碼如下:

第10章 模數轉換ADC與直接內存存取技術DMA

3、DMA中斷初始化

DMA的每個通道都有3個事件標誌分別為DMA半傳輸、 DMA傳輸完成和DMA傳輸出錯,通過檢測這三個標誌位可以判斷當前DMA的傳輸狀態。

DMA通道中斷初始化函數如下,對應中斷標誌位參數如表10-23。

第10章 模數轉換ADC與直接內存存取技術DMA

DMAy_Channelx:表示DMAx的通道號;DMA_IT:表示使能的中斷類型;NewState:表示使能或使能,ENABLE-使能,DISABLE-失能。比如使能DMA1通道1的傳輸完成中斷和傳輸錯誤中斷,代碼如下:

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

4、中斷服務函數

DMA控制器的每個通道都有一箇中斷服務函數,以STM32F103ZE系列為例,一共有12通道,對應著12個DMA通道服務函數。DMA通道服務函數名稱如下:

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

進入中斷函數後需要檢測中斷類型,DMA通道中斷標誌位如表10-24所示。如果檢測到DMA傳輸完成後邊可以處理數據,如果檢測到傳輸錯誤標誌位,則需要捨棄數據或者重新開始傳輸。中斷標誌位檢測函數如下:

第10章 模數轉換ADC與直接內存存取技術DMA

對應清除中斷標誌位函數如下:

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

10.6 ADC獨立模式規則組多通道轉換—DMA模式

由於ADC規則組多通道轉換時,只能讀取到最後一個通道的數據,因此ADC的多通道轉換天生適合DMA模式,當每個通達轉換完畢後,發送DMA請求,通過DMA直接傳輸到設定的內存緩存區中,從而解決了ADC多通道轉換數據被覆蓋的問題,同時CPU不需要頻繁讀取ADC的數據,大幅提高執行效率。

單ADC模式下,只有ADC1和ADC3擁有DMA功能。而雙ADC模式下ADC2轉換的數據通過ADC1的DMA功能傳輸。

STM32F103內部溫度傳感器可以檢測芯片周圍的溫度,支持的溫度範圍為:-40~125度,精度為±1.5℃左右。計算公式為:T(℃) ={(V25-Vsense)/ Avg_Slope}+25,式中:V25表示:Vsense 在25度時的數值(典型值為1.43),Vsense為測得的通道16的電壓值;Avg_Slope表示:溫度與 Vsense 曲線的平均斜率(單位: mv/℃或 uv/℃)(典型值: 4.3mv/℃)。

STM32F103內部還有一個標準電壓測量點VREFINT,這個電壓不隨外部供電電壓的波動而變化,因此有相對較高的精度。因此在外部參考電壓VREF+精確度不高時,可以用內部參考電壓來校正。

校準方式如下:

首先讀出ADC1通道1轉換結果,記為ADch1;然後讀取內部參照電壓VREFINT所在通道17的轉換結果,記為ADch17;記通道1被測量的模擬信號電壓為Uch1,則有:

第10章 模數轉換ADC與直接內存存取技術DMA

注:VREFINT的典型值是1.20V,最小值是1.16V,最大值是1.24V。一般取VREFINT = 1.2V。

通過公式(2)和(3)得出

第10章 模數轉換ADC與直接內存存取技術DMA

VREF+由於容易受外界干擾,並不是標準的3.3V,而VREFINT是相對準確的,因此通過內部參考電壓校準後,既可以測量通道電壓,又可以提高測量精度。

如果使用ADC1的內部溫度傳感器(通道16)和參照電壓功能(通道17)需要使能這兩個功能。具體函數如下:

第10章 模數轉換ADC與直接內存存取技術DMA

本節通過TIM3更新事件觸發ADC規則組3路通道轉換,分別用來測量板載電壓、內部溫度傳感器、以及參照電壓的值,同時通過參照電壓計算板載電壓值,以此減少由於參考電壓VREF+不準確導致的測量誤差。

首先ADC轉換時要避免因循環工作造成資源浪費,本節依舊採用外部觸發ADC規則組轉換,採用定時器3更新事件作為觸發源,間隔500ms觸發一次轉換。

其次,由於DMA工作在循環模式,如果讀取數據不及時,容易出現數據讀取時被覆蓋。為此,將DMA緩衝區設置為被測數據的2倍大小,當第一次規則組3通道依次轉換完畢後,DMA將數據依次傳輸到緩衝區的前半區,同時設置DMA傳輸過半標誌位,此時可以讀取當前3通道轉換的數據。同時規則組繼續轉換,當第二次3個通道依次轉換完畢時,轉換數據被存儲到緩衝區的後半區,同時設置DMA傳輸完成標誌位,此時可以讀取第二次轉換的數據。

具體代碼如下:

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

第10章 模數轉換ADC與直接內存存取技術DMA

10.7 練習

熟悉規則組與注入組混合轉換,通過TIM3_TRGO觸發規則組測量板載電壓和內部溫度傳感器,通過TIM2_CCR1觸發注入組測量參照電壓值,並且通過內部參照電壓的測量值,校準板載電壓和內部溫度傳感器。


分享到:


相關文章: