stm32f407之ADC(操作暫存器)

2021-06-09 05:34:51 字數 3995 閱讀 3168

adc

12位adc是一種逐次逼近型模擬數字轉換器。它有多達19個通道,可測量16個外部和2個內部訊號源和vbat通道。各通道的a/d轉換可以單次、連續、掃瞄或間斷模式執行。adc的結果可以左對齊或右對齊方式儲存在16位資料暫存器中。

模擬看門狗特性允許應用程式檢測輸入電壓是否超出使用者定義的高/低閥值。

有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]位中。如果adc_sqrx或adc_jsqr暫存器在轉換期間被更改,當前的轉換被清除,乙個新的啟動脈衝將傳送到adc以轉換新選擇的組。

單次轉換模式:

單次轉換模式下,adc只執行一次轉換。該模式既可通過設定adc_cr2暫存器的adon位(只適用於規則通道)啟動也可通過外部觸發啟動(適用於規則通道或注入通道),這時cont位為0。

一旦選擇通道的轉換完成:

如果乙個規則通道被轉換:

─ 轉換資料被儲存在16位adc_dr暫存器中

─ eoc(轉換結束)標誌被設定 ─ 如果設定了eocie,則產生中斷。

如果乙個注入通道被轉換:

─ 轉換資料被儲存在16位的adc_drj1暫存器中

─ jeoc(注入轉換結束)標誌被設定 ─ 如果設定了jeocie位,則產生中斷。

然後adc停止

連續轉換模式:

在連續轉換模式中,當前面adc轉換一結束馬上就啟動另一次轉換。此模式可通過外部觸發啟動或通過設定adc_cr2暫存器上的adon位啟動,此時cont位是1。

每個轉換後:

如果乙個規則通道被轉換:

─ 轉換資料被儲存在16位的adc_dr暫存器中

─ eoc(轉換結束)標誌被設定

─ 如果設定了eocie,則產生中斷。

注入通道不能被用於連續轉換模式,唯一的例外是當規則通道配置為連續轉換後,注入通道配置為自動轉換。

掃瞄模式:

此模式用來掃瞄一組模擬通道。

掃瞄模式可通過設定adc_cr1暫存器的scan位來選擇。一旦這個位被設定,adc掃瞄所有被adc_sqrx暫存器(對規則通道)或adc_jsqr(對注入通道)選中的所有通道。在每個組的每個通道上執行單次轉換。在每個轉換結束時,同一組的下乙個通道被自動轉換。如果設定了cont位,轉換不會在選擇組的最後乙個通道上停止,而是再次從選擇組的第乙個通道繼續轉換。

如果設定了dma位,在每次eoc後,dma控制器把規則組通道的轉換資料傳輸到sram中。而注入通道轉換的資料總是儲存在adc_jdrx暫存器中。

在以下情況中,adc_sr暫存器的eoc位將被設定:

在每個規則組序列結束後,如果eocs位被清0

在每個規則通道轉換結束,如果eocs位設定為1

注入通道轉換結束資料總是存放在adc_jdrx暫存器中

注入通道管理:

觸發注入

清除adc_cr1暫存器的jauto位,並且設定scan位,即可使用觸發注入功能。

1. 利用外部觸發或通過設定adc_cr2暫存器的adon位,啟動一組規則通道的轉換。

2. 如果在規則通道轉換期間產生一外部注入觸發或者jswstart位被設定,當前轉換被復位,注入通道序列被以單次掃瞄方式進行轉換。

3. 然後,恢復上次被中斷的規則組通道轉換。如果在注入轉換期間產生一規則事件,注入轉換不會被中斷,但是規則序列將在注入序列結束後被執行。

注:當使用觸發的注入轉換時,必須保證觸發事件的間隔長於注入序列。例如:序列長度為30個adc時鐘週期(即2個具有3個時鐘間隔取樣時間的轉換),觸發之間最小的間隔必須是31個adc時鐘週期。

自動注入

如果設定了jauto位,在規則組通道之後,注入組通道被自動轉換。這可以用來轉換在adc_sqrx和adc_jsqr暫存器中設定的多至20個轉換序列。

在此模式裡,必須禁止注入通道的外部觸發。

如果除jauto位外還設定了cont位,規則通道至注入通道的轉換序列被連續執行。

間斷模式:

規則組

此模式通過設定adc_cr1暫存器上的discen位啟用。它可以用來執行乙個短序列的n次轉換(n<=8),此轉換是adc_sqrx暫存器所選擇的轉換序列的一部分。數值n由adc_cr1暫存器的discnum[2:0]位給出。

乙個外部觸發訊號可以啟動adc_sqrx暫存器中描述的下一輪n次轉換,直到此序列所有的轉換完成為止。總的序列長度由adc_sqr1暫存器的l[3:0]定義。

例如:

n=3,被轉換的通道 = 0、1、2、3、6、7、9、10

第一次觸發:轉換的序列為 0、1、2

第二次觸發:轉換的序列為 3、6、7

第三次觸發:轉換的序列為 9、10,並產生eoc事件

第四次觸發:轉換的序列 0、1、2

注: 當以間斷模式轉換乙個規則組時,轉換序列結束後不自動從頭開始。 當所有子組被轉換完成,下一次觸發啟動第乙個子組的轉換。在上面的例子中,第四次觸發重新轉換第一子組的通道0、1和2

注入組

此模式通過設定adc_cr1暫存器的jdiscen位啟用。在乙個外部觸發事件後,該模式按通道順序逐個轉換adc_jsqr暫存器中選擇的序列。

乙個外部觸發訊號可以啟動adc_jsqr暫存器選擇的下乙個通道序列的轉換,直到序列中所有的轉換完成為止。總的序列長度由adc_jsqr暫存器的jl[1:0]位定義。

例如: n=1,被轉換的通道 = 1、2、3

第一次觸發:通道1被轉換

第二次觸發:通道2被轉換

第三次觸發:通道3被轉換,並且產生eoc和jeoc事件

第四次觸發:通道1被轉換

設定步驟:

1. 配置相關輸入通道的io口。

2. 設定dma

3. 如果雙重adc或三重取樣,設定adc的公共暫存器

4. 配置要使用到的adc

程式:

/************************************

軟體平台:iar for arm6.21

硬體平台:stm32f4-discovery

主頻:168m

author:小船

data:2012-02-14

*************************************/

#include #include "mydebugger.h"

__io uint16_t adc3convertedvault[10000];

char txbuffer = "pc1輸入電壓為:x.***v\n\r";

void adc3_in11_config(void);

void main ();}

void adc3_in11_config(void)

void dma2_stream0_irqhandler (void)

}

執行結果:

生容易,活容易,工程師的生活不容易啊,路過歡迎光臨**店,只賺人氣

STM32F407 單通道ADC取樣,DMA傳輸

dma initstructure.dma peripheralbaseaddr uint32 t adc1 dr adc位址在教程中是這樣寫的 define adc1 dr address uint32 t 0x4001204c dma initstructure.dma peripheralba...

STM32F407 單通道ADC取樣,DMA傳輸

objc view plain copy dma initstructure dma peripheralbaseaddr uint32 t adc 1 dr adc位址 在教程中是這樣寫的 objc view plain copy define adc1 dr address uint32 t 0...

STM32F407之了解程式設計環境

前文再續,書接上一回,前面我們建立了乙個資料夾,用來存放我們的工程,有建了三個資料夾,現在,分別解析一下這三個資料夾裡放的是什麼東西。inc資料夾裡放的是標頭檔案,一共六個,以後我們自己的標頭檔案也可以放到這裡來。stm32f4xx.h 包含了stm32f4的暫存器結構體的定義 類似於c51的reg...