chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)篇) 第12章 ADC

嵌入式大雜燴 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-05-16 09:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

開發(fā)環(huán)境:

MDK:Keil 5.30

開發(fā)板:GD32F207I-EVAL

MCU:GD32F207IK

1 ADC工作原理

GD32F2系列有 3 個逐次逼近型的ADC,精度為 12 位,有18個多路復(fù)用通道,可以轉(zhuǎn)換來自16個外部通道和2個內(nèi)部通道的模擬信號。其中ADC0 和 ADC1都有 16 個外部通道, ADC2 根據(jù) CPU 引腳的不同通道數(shù)也不同,一般都有8 個外部通道。各通道的A/D轉(zhuǎn)換可以__單次、連續(xù)、掃描或間斷模式__執(zhí)行。ADC的結(jié)果可以__左對齊或右對齊方式__存儲在16位數(shù)據(jù)寄存器中。模擬看門狗特性允許應(yīng)用程序檢測輸入電壓是否超出用戶定義的高/低閥值。ADC 的輸入時鐘不得超過28MHz,它是由PCLK2經(jīng)分頻產(chǎn)生。

1.1 ADC架構(gòu)

ADC架構(gòu)如下圖所示。

C:\\Users\\BruceOu\\Desktop\\555.png

1.電壓輸入范圍

ADC 輸入范圍為:VREFN ≤ VIN ≤ VREFP。由VREFN、VREFP、VDDA、VSSA這四個外部引腳決定。

我們在設(shè)計原理圖的時候一般把 VSSA 和 VREFN接地,把VREFP和 VDDA 接 3V3,得到ADC 的輸入電壓范圍為: 0~3.3V。在 64 腳以下的 CPU 中,沒有VREFN和 VREFP這兩個引腳,

ADC 電壓輸入范圍直接由 VDDA和 VSSA決定。如果我們想讓輸入的電壓范圍變寬,去到可以測試負(fù)電壓或者更高的正電壓,我們可以在外部加一個電壓調(diào)理電路,把需要轉(zhuǎn)換的電壓抬升或者降壓到 0~3.3V,這樣 ADC 就可以測量。

16841590353932t6gh8ctyx

【注】VDDA和VSSA必須分別連接到VDD和VSS。

2.輸入通道

我們確定好ADC輸入電壓之后,那么電壓怎么輸入到 ADC?這里我們引入通道的概念,GD32 的ADC多達(dá)18個通道,其中外部的16個通道就是框圖中的 ADCx_IN0、ADCx_IN1...ADCx_IN5。這16個通道對應(yīng)著不同的 IO 口,具體是哪一個 IO 口可以從手冊查詢到。其中 ADC0/1/2還有內(nèi)部通道: ADC0 的通道 16 連接到了芯片內(nèi)部的溫度傳感器, Vrefint 連接到了通道 17。 ADC1 的模擬通道 16 和 17 連接到了內(nèi)部的 VSS。ADC2 的模擬通道 9、 14、 15、 16 和 17 連接到了內(nèi)部的 VSS。

外部的 16 個通道在轉(zhuǎn)換的時候又分為規(guī)則通道和注入通道,其中規(guī)則通道最多有 16路,注入通道最多有 4 路。那這兩個通道有什么區(qū)別?在什么時候使用?

規(guī)則通道

規(guī)則通道:規(guī)則通道就是很規(guī)矩的意思,我們平時一般使用的就是這個通道,或者應(yīng)該說我們用到的都是這個通道,沒有什么特別要注意的可講。

注入通道

注入,可以理解為插入,插隊(duì)的意思,是一種不安分的通道。它是一種在規(guī)則通道轉(zhuǎn)換的時候強(qiáng)行插入要轉(zhuǎn)換的一種。如果在規(guī)則通道轉(zhuǎn)換過程中,有注入通道插隊(duì),那么就要先轉(zhuǎn)換完注入通道,等注入通道轉(zhuǎn)換完成后,再回到規(guī)則通道的轉(zhuǎn)換流程。這點(diǎn)跟中斷程序很像,都是不安分的主。所以,注入通道只有在規(guī)則通道存在時才會出現(xiàn)。

3.轉(zhuǎn)換順序

ADC支持18個多路通道,可以把轉(zhuǎn)換組織成兩組:一個規(guī)則組通道和一個注入組通道。

規(guī)則組,可以按照特定的序列組織成多達(dá)16個轉(zhuǎn)換的序列。ADC_RSQ0~ADC_RSQ2寄存器規(guī)定了規(guī)則組的通道選擇。ADC_RSQ0寄存器的RL[3:0]位規(guī)定了整個規(guī)則組轉(zhuǎn)換序列的長度。

注入組,可以按照特定的序列組織成多達(dá)4個轉(zhuǎn)換的序列。ADC_ISQ寄存器規(guī)定了注入組的通道選擇。ADC_ISQ寄存器的IL[1:0]位規(guī)定了整個注入組轉(zhuǎn)換序列的長度。

4.觸發(fā)源

通道選好了,轉(zhuǎn)換的順序也設(shè)置好了,那接下來就該開始轉(zhuǎn)換了。 ADC 轉(zhuǎn)換可以由ADC_CTL1的 ADON 這個位來控制,寫 1 的時候開始轉(zhuǎn)換,寫 0 的時候停止轉(zhuǎn)換,這個是最簡單也是最好理解的開啟 ADC 轉(zhuǎn)換的控制方式,理解起來沒啥技術(shù)含量。

除了這種庶民式的控制方法, ADC 還支持觸發(fā)轉(zhuǎn)換,這個觸發(fā)包括內(nèi)部定時器觸發(fā)和外部 IO 觸發(fā)。觸發(fā)源有很多,具體選擇哪一種觸發(fā)源,由 ADC_CTL1的ETSRC[2:0]和ETSIC[2:0]位來控制。ETSRC[2:0]用于選擇規(guī)則通道的觸發(fā)源,ETSIC[2:0]用于選擇注入通道的觸發(fā)源。選定好觸發(fā)源之后,觸發(fā)源是否要激活,則由ADC_CTL1的 ETERC和 ETEIC這兩位來激活。

5.數(shù)據(jù)寄存器

一切準(zhǔn)備就緒后,ADC 轉(zhuǎn)換后的數(shù)據(jù)根據(jù)轉(zhuǎn)換組的不同,規(guī)則組的數(shù)據(jù)放在ADC_RDATA寄存器,注入組的數(shù)據(jù)放在ADC_IDATAx。

6.中斷

轉(zhuǎn)換結(jié)束中斷

數(shù)據(jù)轉(zhuǎn)換結(jié)束后,可以產(chǎn)生中斷,中斷分為三種:規(guī)則通道轉(zhuǎn)換結(jié)束中斷,注入轉(zhuǎn)換通道轉(zhuǎn)換結(jié)束中斷,模擬看門狗中斷。其中轉(zhuǎn)換結(jié)束中斷很好理解,跟我們平時接觸的中斷一樣,有相應(yīng)的中斷標(biāo)志位和中斷使能位,我們還可以根據(jù)中斷類型寫相應(yīng)配套的中斷服務(wù)程序。

模擬看門狗中斷

當(dāng)被 ADC 轉(zhuǎn)換的模擬電壓低于低閾值或者高于高閾值時,就會產(chǎn)生中斷,前提是我們開啟了模擬看門狗中斷,其中低閾值和高閾值由 ADC_WDHT 和 ADC_WDLT置。例如我們設(shè)置高閾值是 2.5V,那么模擬電壓超過 2.5V 的時候,就會產(chǎn)生模擬看門狗中斷,反之低閾值也一樣。

DMA 請求

DMA 請求可以通過設(shè)置 ADC_CTL1 寄存器的 DMA 位來使能,它用于傳輸規(guī)則組多個通道的轉(zhuǎn)換結(jié)果。 ADC 在規(guī)則組一個通道轉(zhuǎn)換結(jié)束后產(chǎn)生一個 DMA 請求, DMA 接受到請求后可以將轉(zhuǎn)換的數(shù)據(jù)從 ADC_RDATA 寄存器傳輸?shù)接脩糁付ǖ哪康牡刂贰?/p>

注意: 只有 ADC0 和 ADC2 有 DMA 功能, ADC1 轉(zhuǎn)換的數(shù)據(jù)可以在 ADC 同步模式下傳輸。

7.轉(zhuǎn)換時間

ADC 時鐘

ADC 輸入時鐘 ADCCLK由 PCLK2 經(jīng)過分頻產(chǎn)生,最大是28M,分頻因子由 RCC 時鐘配置寄存器RCU_CFG0的位 15:14 ADCPSC[1:0]設(shè)置,可以是 2/4/6/8/12/16 分頻,注意這里沒有 1 分頻。一般我們設(shè)置 PCLK2=HCLK=120M。

采樣時間

ADC 使用若干個 ADCCLK 周期對輸入的電壓進(jìn)行采樣,采樣的周期數(shù)可通過 ADC采樣時間寄存器ADC_SAMPT0 和 ADC_SAMPT1中的 SMP[2:0]位設(shè)置,ADC_SAMPT1控制的是通道 09, ADC_SAMPT0 控制的是通道 1017。每個通道可以分別用不同的時間采樣。其中采樣周期最小是 1.5 個,即如果我們要達(dá)到最快的采樣,那么應(yīng)該設(shè)置采樣周期為 1.5個周期,這里說的周期就是 1/ADCCLK。

ADC 的轉(zhuǎn)換時間跟 ADC 的輸入時鐘和采樣時間有關(guān),公式為:

Tconv = 采樣時間 +12.5 個周期。

例如,當(dāng) ADCLK = 14MHz,采樣時間設(shè)置為 1.5 周期(最快),那么總的轉(zhuǎn)換時間:

Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us。

8.電壓轉(zhuǎn)換

模擬電壓經(jīng)過 ADC 轉(zhuǎn)換后,是一個 12 位的數(shù)字值,如果通過串口以 16 進(jìn)制打印出來的話,可讀性比較差,那么有時候我們就需要把數(shù)字電壓轉(zhuǎn)換成模擬電壓,也可以跟實(shí)際的模擬電壓(用萬用表測)對比,看看轉(zhuǎn)換是否準(zhǔn)確。

我們一般在設(shè)計原理圖的時候會把ADC 的輸入電壓范圍設(shè)定在: 0~3.3v,因?yàn)?ADC是 12 位的,那么 12 位滿量程對應(yīng)的就是3.3V,12 位滿量程對應(yīng)的數(shù)字值是: 2^12。數(shù)值0 對應(yīng)的就是 0V。如果轉(zhuǎn)換后的數(shù)值為X, X對應(yīng)的模擬電壓為 Y,那么會有這么一個等式成立: 2^12 / 3.3 = X / Y, => Y = (3.3 * X ) / 2^12。

1.2 ADC通道選擇

GD32 將 ADC 的轉(zhuǎn)換分為 2 個通道組: 規(guī)則通道組和注入通道組

規(guī)則通道相當(dāng)于你正常運(yùn)行的程序,而注入通道呢,就相當(dāng)于中斷。在你程序正常執(zhí)行的時候,中斷是可以打斷你的執(zhí)行的。同這個類似,注入通道的轉(zhuǎn)換可以打斷規(guī)則通道的轉(zhuǎn)換, 在注入通道被轉(zhuǎn)換完成之后,規(guī)則通道才得以繼續(xù)轉(zhuǎn)換。

GD32 ADC IO通道分配
ADC0 IO ADC1 IO ADC2 IO
通道0 PA0 通道0 PA0 通道0 PA0
通道1 PA1 通道1 PA1 通道1 PA1
通道2 PA2 通道2 PA2 通道2 PA2
通道3 PA3 通道3 PA3 通道3 PA3
通道4 PA4 通道4 PA4 通道4 PF6
通道5 PA5 通道5 PA5 通道5 PF7
通道6 PA6 通道6 PA6 通道6 PF8
通道7 PA7 通道7 PA7 通道7 PF9
通道8 PB0 通道8 PB0 通道8 PF10
通道9 PB1 通道9 PB1 通道9 內(nèi)部VSS
通道10 PC0 通道10 PC0 通道10 PC0
通道11 PC1 通道11 PC1 通道11 PC1
通道12 PC2 通道12 PC2 通道12 PC2
通道13 PC3 通道13 PC3 通道13 PC3
通道14 PC4 通道14 PC4 通道14 內(nèi)部VSS
通道15 PC5 通道15 PC5 通道15 內(nèi)部VSS
通道16 內(nèi)部溫度傳感器 通道16 內(nèi)部VSS 通道16 內(nèi)部VSS
通道17 內(nèi)部Vrefint 通道17 內(nèi)部VSS 通道17 內(nèi)部VSS

上面的例子因?yàn)樗俣容^慢,不能完全體現(xiàn)這樣區(qū)分(規(guī)則通道組和注入通道組)的好處,但在工業(yè)應(yīng)用領(lǐng)域中有很多檢測和監(jiān)視探頭需要較快地處理,這樣對 AD 轉(zhuǎn)換的分組將簡化事件處理的程序并提高事件處理的速度。

GD32 其 ADC 的規(guī)則通道組最多包含 16 個轉(zhuǎn)換,而注入通道組最多包含 4 個通道。關(guān)于這兩個通道組的詳細(xì)介紹,請參考《GD32參考手冊》,我們這里就不在一一列舉了。

溫度傳感器和通道ADC0_IN16相連接,內(nèi)部參照電壓VREFINT和ADC0_IN17相連接??梢园醋⑷牖蛞?guī)則通道對這兩個內(nèi)部通道進(jìn)行轉(zhuǎn)換。

【注意】溫度傳感器和VREFINT只能出現(xiàn)在主ADC0 中。

1.3 ADC轉(zhuǎn)換模式

  • 單次轉(zhuǎn)換模式

該模式能夠運(yùn)行在規(guī)則組和注入組。單次轉(zhuǎn)換模式下, ADC_RSQ2寄存器的RSQ0[4:0]位或者ADC_ISQ寄存器的ISQ3[4:0]位規(guī)定了ADC的轉(zhuǎn)換通道。當(dāng)ADCON位被置1,一旦相應(yīng)軟件觸發(fā)或者外部觸發(fā)發(fā)生, ADC就會采樣和轉(zhuǎn)換一個通道。

規(guī)則通道單次轉(zhuǎn)換結(jié)束后,轉(zhuǎn)換數(shù)據(jù)將被存放于ADC_RDATA寄存器中, EOC將會置1。如果EOCIE位被置1,將產(chǎn)生一個中斷。

注入通道單次轉(zhuǎn)換結(jié)束后,轉(zhuǎn)換數(shù)據(jù)將被存放于ADC_IDATA0寄存器中, EOC和EOIC位將會置1。如果EOCIE或EOICIE位被置1,將產(chǎn)生一個中斷。

1684159035737ajzroxl41s

  • 連續(xù)轉(zhuǎn)換模式

在該模式可以運(yùn)行在規(guī)則組通道上。對ADC_CTL1寄存器的CTN位置1可以使能連續(xù)轉(zhuǎn)換模式。在此模式下, ADC執(zhí)行由RSQ0[4:0]規(guī)定的轉(zhuǎn)換通道。當(dāng)ADCON位被置1,一旦相應(yīng)軟件觸發(fā)或者外部觸發(fā)產(chǎn)生, ADC就會采樣和轉(zhuǎn)換規(guī)定的通道。轉(zhuǎn)換數(shù)據(jù)保存在ADC_RDATA寄存器中。

1684159036052j2fbsdxi07

  • 掃描模式

掃描轉(zhuǎn)換模式可以通過將ADC_CTL0寄存器的SM位置1來使能。在此模式下, ADC掃描轉(zhuǎn)換所有被ADC_RSQ0~ADC_RSQ2寄存器或ADC_ISQ寄存器選中的所有通道。一旦ADCON位被置1,當(dāng)相應(yīng)軟件觸發(fā)或者外部觸發(fā)產(chǎn)生, ADC就會一個接一個的采樣和轉(zhuǎn)換規(guī)則組或注入組通道。轉(zhuǎn)換數(shù)據(jù)存儲在ADC_RDATA或ADC_IDATAx寄存器中。規(guī)則組或注入組轉(zhuǎn)換結(jié)束后,EOC或者EOIC位將被置1。如果EOCIE或EOICIE位被置1,將產(chǎn)生中斷。當(dāng)規(guī)則組通道工作在掃描模式下時, ADC_CTL1寄存器的DMA位必須設(shè)置為1。

如果ADC_CTL1寄存器的CTN位也被置1,則在規(guī)則通道轉(zhuǎn)換完之后,這個轉(zhuǎn)換自動重新開始。

1684159036772ec3o3v8zjl

  • 間斷模式

規(guī)則組

對于規(guī)則組, ADC_CTL0 寄存器的 DISRC 位置 1 使能間斷轉(zhuǎn)換模式。該模式下可以執(zhí)行一次n 個通道的短序列轉(zhuǎn)換(n<=8),此轉(zhuǎn)換是 ADC_RSQ0RSQ2 寄存器所選擇的轉(zhuǎn)換序列的一部分。數(shù)值 n 由 ADC_CTL0 寄存器的 DISCNUM[2:0]位給出。當(dāng)相應(yīng)的軟件觸發(fā)或外部觸發(fā)發(fā)生, ADC 就會采樣和轉(zhuǎn)換在 ADC_RSQ0RSQ2 寄存器所選擇通道中接下來的 n 個通道,直到規(guī)則序列中所有的通道轉(zhuǎn)換完成。每個規(guī)則組轉(zhuǎn)換周期結(jié)束后, EOC位將被置1。如果EOCIE位被置 1 將產(chǎn)生一個中斷。

1684159037077odq0vilw2h

舉例: n=3,被轉(zhuǎn)換的通道 = 0 、1、2、3、6、7、9、10

第一次觸發(fā):轉(zhuǎn)換的序列為 0 、1、2

第二次觸發(fā):轉(zhuǎn)換的序列為 3 、6、7

第三次觸發(fā):轉(zhuǎn)換的序列為 9 、10,并產(chǎn)生EOC事件

第四次觸發(fā):轉(zhuǎn)換的序列 0 、1、2

注意:

1.當(dāng)以間斷模式轉(zhuǎn)換一個規(guī)則組時,轉(zhuǎn)換序列結(jié)束后不自動從頭開始。

2.當(dāng)所有子組被轉(zhuǎn)換完成,下一次觸發(fā)啟動第一個子組的轉(zhuǎn)換。在上面的例子中,第四次觸發(fā)重新轉(zhuǎn)換第一子組的通道 0 、1和2。

__注入組 __

對于注入組,ADC_CTL0 寄存器的 DISIC 位置 1 使能間斷轉(zhuǎn)換模式。該模式下可以執(zhí)行ADC_ISQ 寄存器所選擇的轉(zhuǎn)換序列的一個通道進(jìn)行轉(zhuǎn)換。當(dāng)相應(yīng)的軟件觸發(fā)或外部觸發(fā)發(fā)生,ADC 就會采樣和轉(zhuǎn)換 ADC_ISQ 寄存器中所選擇通道的下一個通道,直到注入組序列中所有通道轉(zhuǎn)換完成。每個注入組通道轉(zhuǎn)換周期結(jié)束后, EOIC 位將被置 1。如果 EOICIE 位被置 1 將產(chǎn)生一個中斷。

16841590373553ltfvje8fs

例子: n=1,被轉(zhuǎn)換的通道 = 1 、2、3

第一次觸發(fā):通道1被轉(zhuǎn)換

第二次觸發(fā):通道2被轉(zhuǎn)換

第三次觸發(fā):通道3被轉(zhuǎn)換,并且產(chǎn)生EOC和JEOC事件

第四次觸發(fā):通道1被轉(zhuǎn)換

【注意】

1.當(dāng)完成所有注入通道轉(zhuǎn)換,下個觸發(fā)啟動第1個注入通道的轉(zhuǎn)換。在上述例子中,第四個觸發(fā)重新轉(zhuǎn)換第1個注入通道1。

2.不能同時使用自動注入和間斷模式。

3.必須避免同時為規(guī)則和注入組設(shè)置間斷模式。間斷模式只能作用于一組轉(zhuǎn)換。

規(guī)則組和注入組不能同時工作在間斷模式,同一時刻只能有一組被設(shè)置成間斷模式

2 ADC寄存器描述

我們介紹一下我們執(zhí)行規(guī)則通道的單次轉(zhuǎn)換,需要用到的 ADC 寄存器。第一個要介紹的是 ADC 控制寄存器(ADC_CTL0和 ADC_CTL1)。ADC_CTL0的各位描述如下圖所示。

16841590376575ejqnl21sh

這里我們不再詳細(xì)介紹每個位,而是抽出幾個我們本章要用到的位進(jìn)行針對性的介紹,詳細(xì)的說明及介紹,請參考《GD32 參考手冊》。

ADC_CTL0的 SM位,該位用于設(shè)置掃描模式,由軟件設(shè)置和清除,如果設(shè)置為 1,則使用掃描模式,如果為 0,則關(guān)閉掃描模式。在掃描模式下,由ADC_RSQx或ADC_ISQ寄存器選中的通道被轉(zhuǎn)換。如果設(shè)置了 EOCIE 或 EOICIE,只在最后一個通道轉(zhuǎn)換完畢后才會產(chǎn)生 EOC 或 EOIC中斷。

ADC_CTL0 [19: 16]用于設(shè)置 ADC 的操作模式,詳細(xì)的對應(yīng)關(guān)系如下圖所示。

1684159038060rndw8y1kg2

1684159038501heaxvn0yp5

本章我們要使用的是獨(dú)立模式,所以設(shè)置這幾位為 0 就可以了。接著我們介紹 ADC_CTL1,該寄存器的各位描述如下圖所示。

1684159038845ignvgq4ko0

該寄存器我們也只針對性的介紹一些位: ADCON 位用于開關(guān) AD 轉(zhuǎn)換器。而 CTN位用于設(shè)置是否進(jìn)行連續(xù)轉(zhuǎn)換,我們使用單次轉(zhuǎn)換,所以 CTN位必須為 0。 CLB和 RSTCLB用于ADC 校準(zhǔn)。

ADC_CTL1寄存器中的DAL位選擇轉(zhuǎn)換后數(shù)據(jù)儲存的對齊方式。數(shù)據(jù)可以左對齊或右對齊,如下圖所示。

16841590391851x48rz79s2

注入組通道轉(zhuǎn)換的數(shù)據(jù)值已經(jīng)減去了在 ADC_IOFFx 寄存器中定義的偏移量,因此結(jié)果可能是一個負(fù)值。符號值是一個擴(kuò)展值。對于規(guī)則組通道,不需減去偏移值,因此只有12個位有效。

ETSRC [2: 0]用于選擇啟動規(guī)則轉(zhuǎn)換組轉(zhuǎn)換的外部事件,詳細(xì)的設(shè)置關(guān)系如下圖所示。

16841590395486wtit2t1oi

我們這里使用的是軟件觸發(fā),所以設(shè)置這 3 個位為 111。 ADC_CTL1的SWRCST位用于開始規(guī)則通道的轉(zhuǎn)換,我們每次轉(zhuǎn)換(單次轉(zhuǎn)換模式下)都需要向該位寫 1。TSVREN為用于使能溫度傳感器和 Vrefint。GD32內(nèi)部的溫度傳感器我們將在后文介紹。

第二個要介紹的是 ADC 采樣事件寄存器(ADC_SAMPT0和 ADC_SAMPT1),這兩個寄存器用于設(shè)置通道 0~17 的采樣時間,每個通道占用 3 個位。 ADC_SAMPT0的各位描述如下圖。

16841590399173bbd9w0mrc

ADC_SAMPT1和ADC_SAMPT0差不多,只是該寄存器用于配置通道0 ~ 通道9。

對于每個要轉(zhuǎn)換的通道,采樣時間建議盡量長一點(diǎn),以獲得較高的準(zhǔn)確度,但是這樣會降低 ADC 的轉(zhuǎn)換速率。ADC的轉(zhuǎn)換時間可以由以下公式計算:

Tcovn=采樣時間+12.5 個周期

其中: Tcovn 為總轉(zhuǎn)換時間,采樣時間是根據(jù)每個通道的SPT 位的設(shè)置來決定的。例如,當(dāng) ADCCLK=14Mhz 的時候,并設(shè)置 1.5 個周期的采樣時間,則得到: Tcovn=1.5+12.5=14 個周期=1us。

常見的周期有:1.5周期、7.5周期、13.5周期、28.5周期、41.5周期、55.5周期、71.5周期、239.5周期。

1684159040252g20vcan5iw

第三個要介紹的是 ADC 規(guī)則序列寄存器(ADC_RSQ0~2) ,該寄存器總共有 3 個,這幾個寄存器的功能都差不多,這里我們僅介紹一下ADC_RSQ0,該寄存器的各位描述如下圖所示。

1684159040586k3h8qi33du

16841590408610l6623orbg

RL[3:0]用于存儲規(guī)則序列的長度,我們這里只用了 1 個,所以設(shè)置這幾個位的值為 0。其他的 RSQ12~ 15則存儲了規(guī)則序列中第 12~ 15 個通道的編號(0~17)。另外兩個規(guī)則序列寄存器同 ADC_RSQ0大同小異,我們這里就不再介紹了,要說明一點(diǎn)的是:我們選擇的是單次轉(zhuǎn)換,所以只有一個通道在規(guī)則序列里面,這個序列就是 RSQ0,通過 ADC_RSQ2的最低 5 位(也就是 RSQ0)設(shè)置。

第四個要介紹的是 ADC 規(guī)則數(shù)據(jù)寄存器(ADC_RDATA)。規(guī)則序列中的 ADC 轉(zhuǎn)化結(jié)果都將被存在這個寄存器里面,而注入通道的轉(zhuǎn)換結(jié)果被保存在ADC_IOFFx 里面。ADC_RDATA的各位描述如下圖。

16841590411709l9v6bcbmf

1684159041480en1grj6zt7

這里要提醒一點(diǎn)的是,該寄存器的數(shù)據(jù)可以通過ADC_CTL1的DAL位設(shè)置左對齊還是右對齊。在讀取數(shù)據(jù)的時候要注意。

最后一個要介紹的 ADC 寄存器為 ADC 狀態(tài)寄存器(ADC_STAT),該寄存器保存了 ADC 轉(zhuǎn)換時的各種狀態(tài)。該寄存器的各位描述如下圖。

1684159041840ihas77fwbt

這里我們要用到的是 EOC 位,我們通過判斷該位來決定是否此次規(guī)則通道的 ADC 轉(zhuǎn)換已經(jīng)完成,如果完成我們就從 ADC_RDATA 中讀取轉(zhuǎn)換結(jié)果,否則等待轉(zhuǎn)換完成。

3 ADC具體代碼實(shí)現(xiàn)

接下來筆者將通過三種方式實(shí)現(xiàn)ADC單通道電壓數(shù)據(jù)采集,先看看筆者使用的開發(fā)板的硬件電路,其中PC3外接了一個滑動電阻

1684159042173jky6ojvna4

3.1 ADC單通道電壓采集查詢方式實(shí)現(xiàn)

ADC參數(shù)設(shè)置的詳細(xì)步驟:

1)開啟 PC 口時鐘和 ADC0 時鐘,設(shè)置 PC3為模擬輸入。

GD32F207的ADC 通道 13在 PC3上,所以,我們先要使能 PC 的時鐘和 ADC0時鐘,然后設(shè)置PC0為模擬輸入。 使能 GPIOC 和 ADC 時鐘,設(shè)置 PC3的輸入方式。

2)復(fù)位 ADC0,同時設(shè)置 ADC0分頻因子。

開啟 ADC0 時鐘之后,我們要復(fù)位 ADC0, 將 ADC1 的全部寄存器重設(shè)為缺省值之后我們就可以通過RCU_CFG0設(shè)置 ADC的分頻因子。分頻因子要確保 ADC的時鐘(ADCCLK)不要超過 28Mhz。這個我們設(shè)置分頻因子位 8, 時鐘為 120/8=15MHz,庫函數(shù)的實(shí)現(xiàn)方法是:

void rcu_adc_clock_config(uint32_t adc_psc);

輸入?yún)?shù)范圍:

/* ADC prescaler selection */
#define RCU_CKADC_CKAPB2_DIV2           ((uint32_t)0x00000000U)             /*!< ADC prescaler select CK_APB2/2 */
#define RCU_CKADC_CKAPB2_DIV4           ((uint32_t)0x00000001U)             /*!< ADC prescaler select CK_APB2/4 */
#define RCU_CKADC_CKAPB2_DIV6           ((uint32_t)0x00000002U)             /*!< ADC prescaler select CK_APB2/6 */
#define RCU_CKADC_CKAPB2_DIV8           ((uint32_t)0x00000003U)             /*!< ADC prescaler select CK_APB2/8 */
#define RCU_CKADC_CKAPB2_DIV12          ((uint32_t)0x00000005U)             /*!< ADC prescaler select CK_APB2/12 */
#define RCU_CKADC_CKAPB2_DIV16          ((uint32_t)0x00000007U)             /*!< ADC prescaler select CK_APB2/16 */

GD32F2的ADC最大的轉(zhuǎn)換速率為2Mhz,也就是轉(zhuǎn)換時間為0.5us(在ADCCLK=28M,采樣周期為1.5個ADC時鐘下得到),不要讓ADC的時鐘超過28M,否則將導(dǎo)致結(jié)果準(zhǔn)確度下降。

3) 初始化 ADC0參數(shù),設(shè)置 ADC0 的工作模式以及規(guī)則序列的相關(guān)信息。

在設(shè)置完分頻因子之后,我們就可以開始 ADC0的模式配置了,設(shè)置單次轉(zhuǎn)換模式、觸發(fā)方式選擇、數(shù)據(jù)對齊方式等都在這一步實(shí)現(xiàn)。 同時,我們還要設(shè)置 ADC0規(guī)則序列的相關(guān)信息,我們這里只有一個通道,并且是單次轉(zhuǎn)換的,所以設(shè)置規(guī)則序列中通道數(shù)為 1。

/* ADC mode config */
adc_mode_config(ADC_MODE_FREE);

/* ADC data alignment config */
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

/* ADC channel length config */
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);

/* ADC regular channel config */
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_13, ADC_SAMPLETIME_1POINT5);

/* ADC trigger config */
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);

/* ADC external trigger enable */
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

adc_mode_config()用來設(shè)置ADC模式,這里只使用一個ADC,因此設(shè)置為獨(dú)立模式。

adc_data_alignment_config()用來設(shè)置 ADC 數(shù)據(jù)對齊方式是左對齊還是右對齊,這里我們選擇右對齊方式。

adc_channel_length_config()用來設(shè)置規(guī)則序列的長度,這里我們是單次轉(zhuǎn)換,所以值為 1 即可。

adc_regular_channel_config()用來設(shè)置ADC通道轉(zhuǎn)換順序,這里設(shè)置采樣時間為1.5個時鐘周期。

adc_special_function_config()函數(shù)用來設(shè)置是否開啟連續(xù)轉(zhuǎn)換模式,因?yàn)槭菃未无D(zhuǎn)換模式,所以我們選擇不開啟連續(xù)轉(zhuǎn)換模式,DISABLE 即可。

adc_external_trigger_source_config()用來設(shè)置啟動規(guī)則轉(zhuǎn)換組轉(zhuǎn)換的外部事件,這里我們選擇軟件觸發(fā),選擇值為ADC0_1_2_EXTTRIG_REGULAR_NONE即可。

adc_external_trigger_config()用于使能外部觸發(fā)。

4)使能 ADC 并校準(zhǔn)。

在設(shè)置完了以上信息后, 我們就使能 ADC 轉(zhuǎn)換器,執(zhí)行復(fù)位校準(zhǔn)和 ADC校準(zhǔn),注意這兩步是必須的!不校準(zhǔn)將導(dǎo)致結(jié)果很不準(zhǔn)確。

使能指定的 ADC 的方法是:

adc_enable(ADC0);

執(zhí)行 ADC 校準(zhǔn)的方法是:

adc_calibration_enable(ADC0);

ADC有一個內(nèi)置自校準(zhǔn)模式。校準(zhǔn)可大幅減小因內(nèi)部電容器組的變化而造成的準(zhǔn)精度誤差。在校準(zhǔn)期間,在每個電容器上都會計算出一個誤差修正碼(數(shù)字值),這個碼用于消除在隨后的轉(zhuǎn)換中每個電容器上產(chǎn)生的誤差。

通過設(shè)置ADC_CTL1寄存器的CLB位啟動校準(zhǔn)。一旦校準(zhǔn)結(jié)束,CLB位被硬件復(fù)位,可以開始正常轉(zhuǎn)換。建議在上電時執(zhí)行一次ADC校準(zhǔn)。

【注意】

1.建議在每次上電后執(zhí)行一次校準(zhǔn)。

2.啟動校準(zhǔn)前,ADC必須處于關(guān)電狀態(tài)(ADON=’0’)超過至少兩個ADC時鐘周期。

5)讀取 ADC 值。

在上面的校準(zhǔn)完成之后, ADC 就算準(zhǔn)備好了。接下來啟動 ADC 轉(zhuǎn)換。在轉(zhuǎn)換結(jié)束后,讀取 ADC 轉(zhuǎn)換結(jié)果值就是了。

軟件開啟 ADC 轉(zhuǎn)換的方法是:

adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

開啟轉(zhuǎn)換之后,就可以獲取轉(zhuǎn)換 ADC 轉(zhuǎn)換結(jié)果數(shù)據(jù), 方法是:

adc_regular_data_read(ADC0);//ADC轉(zhuǎn)換結(jié)果

同時在 AD 轉(zhuǎn)換中,我們還要根據(jù)狀態(tài)寄存器的標(biāo)志位來獲取 AD 轉(zhuǎn)換的各個狀態(tài)信息。 庫函數(shù)獲取 AD 轉(zhuǎn)換的狀態(tài)信息的函數(shù)是:

FlagStatus adc_flag_get(uint32_t adc_periph, uint32_t adc_flag)

比如我們要判斷 ADC的轉(zhuǎn)換是否結(jié)束,方法是:

while(!adc_flag_get(ADC0,ADC_FLAG_EOC));//檢查轉(zhuǎn)換標(biāo)志

接下來看看ADC完整的配置。

/*
    brief      Configure the ADC peripheral
    param[in]  adc_typedef_enum adc_id
    param[out] none
    retval     none
*/
void adc_init(adc_typedef_enum adc_id)
{
    /* enable GPIOC clock */
    rcu_periph_clock_enable(ADC_GPIO_CLK[adc_id]);

    /* enable ADC0 clock */
    rcu_periph_clock_enable(ADC_CLK[adc_id]);

    /* config ADC clock */
    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);

    /* config the GPIO as analog mode */
    gpio_init(ADC_GPIO_PORT[adc_id], GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, ADC_GPIO_PIN[adc_id]);

    /* ADC mode config */
    adc_mode_config(ADC_MODE_FREE);
	
    /* ADC continuous mode function disable */
    adc_special_function_config(ADC_PERIPH[adc_id], ADC_CONTINUOUS_MODE, DISABLE);

    /* ADC data alignment config */
    adc_data_alignment_config(ADC_PERIPH[adc_id], ADC_DATAALIGN_RIGHT);

    /* ADC channel length config */
    adc_channel_length_config(ADC_PERIPH[adc_id], ADC_REGULAR_CHANNEL, 1);

    /* ADC regular channel config */
    adc_regular_channel_config(ADC_PERIPH[adc_id], 0, ADC_CHANNEL[adc_id], ADC_SAMPLETIME_1POINT5);

    /* ADC trigger config */
    adc_external_trigger_source_config(ADC_PERIPH[adc_id], ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);

    /* ADC external trigger enable */
    adc_external_trigger_config(ADC_PERIPH[adc_id], ADC_REGULAR_CHANNEL, ENABLE);

    /* enable ADC interface */
    adc_enable(ADC_PERIPH[adc_id]);
    delay_ms(1);

    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC_PERIPH[adc_id]);
}

主函數(shù)如下所示。

/*
    brief      main function
    param[in]  none
    param[out] none
    retval     none
*/
int main(void)
{
    float adc_convertedValueLocal;   
    uint32_t adc_convertedValue;

    //systick init
    sysTick_init();

    //usart init 115200 8-N-1
    com_init(COM1, 115200, 0, 1);

    //adc init
    adc_init(A0);

    while(1)
    {
        adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

        while(!adc_flag_get(ADC0,ADC_FLAG_EOC));//檢查轉(zhuǎn)換標(biāo)志
        adc_flag_clear(ADC0, ADC_FLAG_EOC); // 清除結(jié)束標(biāo)志
			
        adc_convertedValue=adc_regular_data_read(ADC0);//ADC轉(zhuǎn)換結(jié)果

        adc_convertedValueLocal =(float) adc_convertedValue/4096*3.3; // 讀取轉(zhuǎn)換的AD值
        printf("The current AD value = 0x%04X \\r\\n", adc_convertedValue); 
        printf("The current AD value = %f V \\r\\n\\r\\n",adc_convertedValueLocal); //實(shí)際電壓值

        delay_ms(1000);
    }
}

如果想開啟連續(xù)轉(zhuǎn)換,只需將ADC_CONTINUOUS_MODE配置為ENABLE即可。

adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);

然后只需打開啟動一次ADC轉(zhuǎn)換。

adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

最后看看ADC采樣時間的計算。

ADCCLK(ADC的時鐘頻率 ) = 120MHZ(系統(tǒng)時鐘頻率) / 8 (ADC分頻因子) = 15MHZ。

一個ADC周期占用的時間 = 1 / 時鐘頻率 = 1 / 15MHz = 0.066666 uS

一次采樣總的時間 = 采樣時間 + 12.5個周期 = 1.5周期 + 12.5周期 = 14 * 0.066666 = 0.933333 us

3.2 ADC單通道電壓采集中斷方式實(shí)現(xiàn)

中斷方式和查詢方式不同的地方在于需要開啟ADC中斷服務(wù),配置中斷優(yōu)先級和中斷服務(wù)函數(shù)。筆者接下來之講與查詢方式不同的地方。

1.需要在ADC配置函數(shù)中開啟ADC中斷

adc_interrupt_enable(ADC0, ADC_INT_EOC);

2. NVIC配置

因?yàn)槲覀兪窃谵D(zhuǎn)換完成后利用中斷,在中斷函數(shù)中讀取數(shù)據(jù),所以要首先配置中斷函數(shù)的優(yōu)先級。

nvic_irq_enable(ADC0_1_IRQn, 0, 0);

3.中斷服務(wù)函數(shù)

在中斷函數(shù)中進(jìn)行讀取數(shù)據(jù),將數(shù)據(jù)存放在變量adc_convertedValue中。需要注意的是,此處使用關(guān)鍵字extern聲明,代表變量adc_convertedValue已經(jīng)在其他文件中定義。

/*!
    \\brief      this function handles ADC0 and ADC1 interrupt
    \\param[in]  none
    \\param[out] none
    \\retval     none
*/
void ADC0_1_IRQHandler(void)
{
    if(adc_interrupt_flag_get(ADC0, ADC_INT_FLAG_EOC))
    {
        adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);  // 清除ADC規(guī)則組轉(zhuǎn)換結(jié)束中斷標(biāo)志
        adc_convertedValue = adc_regular_data_read(ADC0);   // 讀取ADC數(shù)據(jù)
    }
}

4.主函數(shù)

主函數(shù)負(fù)責(zé)接收轉(zhuǎn)換的值,并將其轉(zhuǎn)換為電壓值,然后通過串口打印出來,便于查看ADC轉(zhuǎn)換值。

/*
    brief      main function
    param[in]  none
    param[out] none
    retval     none
*/
int main(void)
{
    float adc_convertedValueLocal;   


    //systick init
    sysTick_init();

    //usart init 115200 8-N-1
    com_init(COM1, 115200, 0, 1);

    //adc init
    adc_init(A0, 1, 0);

    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

    while(1)
    {
        adc_convertedValueLocal =(float) adc_convertedValue/4096*3.3; // 讀取轉(zhuǎn)換的AD值
        printf("The current AD value = 0x%04X \\r\\n", adc_convertedValue); 
        printf("The current AD value = %f V \\r\\n\\r\\n",adc_convertedValueLocal); //實(shí)際電壓值
    
        delay_ms(1000);
    }
}

我們還可以通過定時器方式來實(shí)現(xiàn),關(guān)于定時器參看前面的章節(jié)。如果開啟定時器1,定時時間為1s,則可將以下函數(shù)的內(nèi)容替換main()函數(shù)的循環(huán)體的內(nèi)容。這樣可空出主循環(huán)干其他事情了。

3.3 ADC單通道電壓采集DMA方式實(shí)現(xiàn)

DMA方式實(shí)現(xiàn)的代碼結(jié)構(gòu)和查詢方式差不多,主要新增DMA配置不同。

/*
    brief      configure the DMA peripheral
    param[in]  none
    param[out] none
    retval     none
*/
void dma_config(void)
{
    /* ADC_DMA_channel configuration */
    dma_parameter_struct dma_data_parameter;

    /* enable DMA clock */
    rcu_periph_clock_enable(RCU_DMA0);

    /* ADC_DMA_channel deinit */
    dma_deinit(DMA0, DMA_CH0);

    /* initialize DMA single data mode */
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_data_parameter.memory_addr  = (uint32_t)(&adc_convertedValue);
    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_DISABLE;
    dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_32BIT;
    dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_32BIT;
    dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;
    dma_data_parameter.number       = 1;
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;
    dma_init(DMA0, DMA_CH0, &dma_data_parameter);

    dma_circulation_enable(DMA0, DMA_CH0);

    /* enable DMA channel */
    dma_channel_enable(DMA0, DMA_CH0);
}

然后使能ADC的DMA。

adc_dma_mode_enable(ADC0);

代碼的注釋已經(jīng)很詳細(xì)了,我不再贅述了。

這里還需要說明一下 ADC 的參考電壓,我的開發(fā)板使用的是 GD32F207,

該芯片有外部參考電壓: Vref-和 Vref+,其中 Vref-必須和 VSSA 連接在一起, 而 Vref+的輸入范圍為: 2.4~VDDA。需要設(shè)置 Vref-和 Vref+設(shè)置參考電壓,默認(rèn)的我們是通過跳線帽將 Vref-接到 GND, Vref+接到 VDDA,參考電壓就是 3.3V。如果大家想自己設(shè)置其他參考電壓,將你的參考電壓接在 Vref-和 Vref+上就 OK 了。本章我們的參考電壓設(shè)置的是 3.3V。一般的開發(fā)板已經(jīng)設(shè)置好了,不在需要單獨(dú)去設(shè)置。

通過以上幾個步驟的設(shè)置,我們就能正常的使用 GD32 的 ADC0來執(zhí)行 AD 轉(zhuǎn)換操作了。

4 實(shí)驗(yàn)現(xiàn)象

將程序編譯好后下載到板子中,打開串口助手可以看到如下現(xiàn)象,當(dāng)然了,普通方式、中斷方式和DMA方式都是一樣的現(xiàn)象。

1684159042478wr2ypduy1z

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    7481

    瀏覽量

    554396
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1614

    瀏覽量

    82296
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    26

    文章

    6209

    瀏覽量

    115841
  • Cortex-M
    +關(guān)注

    關(guān)注

    2

    文章

    234

    瀏覽量

    31015
  • GD32
    +關(guān)注

    關(guān)注

    7

    文章

    430

    瀏覽量

    27138
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 1 開發(fā)環(huán)境搭建

    開發(fā)環(huán)境: MDK:Keil 5.30 開發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 GD32F207I-EVAL
    的頭像 發(fā)表于 05-07 23:35 ?1.3w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>1<b class='flag-5'>章</b> <b class='flag-5'>開發(fā)</b>環(huán)境搭建

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 4 GD32啟動流程詳解(Keil版)

    ,所有的一切都需要由開發(fā)者來設(shè)置,這里處理器是沒有堆棧,沒有中斷,更沒有外圍設(shè)備,這些工作是需要軟件來指定的,而且不同的CPU類型、不同大小的內(nèi)存和不同種類的外設(shè),其初始化工作都是不同的。本文將以GD32F207IK (基于Cortex-M3)為例進(jìn)行講解。
    的頭像 發(fā)表于 05-10 09:00 ?2w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>4<b class='flag-5'>章</b> <b class='flag-5'>GD32</b>啟動流程詳解(Keil版)

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 7 定時器

    系統(tǒng)滴答定時器一般用來提供“心跳”作用,而GD32定時器最基本功能也是定時,可以設(shè)置不同時間長度的定時。定時器除了最基本的定時功能外,定時器與GPIO有掛鉤使得它可以發(fā)揮強(qiáng)大的作用,比如可以輸出
    的頭像 發(fā)表于 05-11 09:00 ?1.5w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>7<b class='flag-5'>章</b> 定時器

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 8 定時器

    開發(fā)環(huán)境: MDK:Keil 5.30 開發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 PWM輸出的工作原理 脈沖寬度調(diào)制(PWM) ,是英文“Pulse Wi
    的頭像 發(fā)表于 05-12 22:14 ?1w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>8<b class='flag-5'>章</b> 定時器

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 11 CPU的高級代理-DMA

    或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸,因而被廣泛地使用。早在 8086 的應(yīng)用中就已經(jīng)有 Intel 的 8237 這種典型的 DMA 控制器,而 GD32的 DMA 則是以類似外設(shè)的形式添加到 Cortex 內(nèi)核之外的??梢哉f,DMA就是CPU的高級代理,DMA大大減輕了CPU的負(fù)擔(dān)。
    的頭像 發(fā)表于 05-16 08:59 ?4607次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>11<b class='flag-5'>章</b> CPU的高級代理-DMA

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 13 DAC

    數(shù)字/模擬轉(zhuǎn)換模塊(DAC)是12位數(shù)字輸入,電壓輸出的數(shù)字/模擬轉(zhuǎn)換器。DAC可以配置為8位或12位模式,也可以與DMA控制器配合使用。DAC工作在12位模式時,數(shù)據(jù)可以設(shè)置成左對齊或右對齊
    的頭像 發(fā)表于 05-17 08:57 ?7505次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>13<b class='flag-5'>章</b> DAC

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 14 內(nèi)部溫度傳感器

    GD32 有一個內(nèi)部的溫度傳感器,可以用來測量 CPU 及周圍的溫度(TA)。該溫度傳感器在內(nèi)部和 ADCx_IN16 輸入通道相連接,此通道把傳感器輸出的電壓轉(zhuǎn)換成數(shù)字值。溫度傳感器模擬輸入
    的頭像 發(fā)表于 05-17 08:58 ?7544次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>14<b class='flag-5'>章</b> 內(nèi)部溫度傳感器

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 15 低功耗

    GD32的工作電壓(VDD)為2.0~3.6V。通過內(nèi)置的電壓調(diào)節(jié)器提供所需的1.8V電源。當(dāng)主電源VDD掉電后,通過VBAT腳為實(shí)時時鐘(RTC)和備份寄存器提供電源。
    的頭像 發(fā)表于 05-17 08:59 ?9965次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>15<b class='flag-5'>章</b> 低功耗

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 16 RTC

    開發(fā)環(huán)境: MDK:Keil 5.30 開發(fā)板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RTC簡介
    的頭像 發(fā)表于 05-18 22:14 ?9158次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>16<b class='flag-5'>章</b> RTC

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 17 看門狗

    開發(fā)環(huán)境: MDK:Keil 5.30 開發(fā)板:GD32F207I-EVAL MCU:GD32F207IK GD32 有兩個看門狗, 一個是
    的頭像 發(fā)表于 06-03 16:00 ?1.4w次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>17<b class='flag-5'>章</b> 看門狗

    【圖書分享】《STM32庫開發(fā)實(shí)戰(zhàn)指南

    庫函數(shù)開發(fā)小結(jié) 10 DMA——為CPU減負(fù) 11 ADC實(shí)驗(yàn)(DMA方式) 
    發(fā)表于 03-13 17:01

    GD32 MCU原理及固件庫開發(fā)指南》 + 初讀感悟

    GD32 MCU原理固件庫開發(fā)指南這本書內(nèi)容豐富,囊括了GD32中的所有外設(shè),書中首先介紹了如何使用MDK或IAR軟件搭建GD32工程環(huán)境,讓初學(xué)者能快速基于工程上手編程。書中主要對
    發(fā)表于 03-31 22:11

    GD32 MCU原理及固件庫開發(fā)指南》+讀后感

    。 2介紹GD32 MCU快速入門與開發(fā)平臺搭建的方法,包括對軟硬件開發(fā)平臺、調(diào)試工具、GD32
    發(fā)表于 06-06 21:52

    GD32開發(fā)實(shí)戰(zhàn)指南(基礎(chǔ)) 19 程序加密

    GD32通過讀取芯片唯一ID號來實(shí)現(xiàn)程序的保護(hù),防止被抄襲。96位的產(chǎn)品唯一身份標(biāo)識所提供的參考號碼對任意一個GD32微控制器
    的頭像 發(fā)表于 05-20 09:10 ?5464次閱讀
    <b class='flag-5'>GD32</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)戰(zhàn)</b><b class='flag-5'>指南</b>(基礎(chǔ)<b class='flag-5'>篇</b>) <b class='flag-5'>第</b>19<b class='flag-5'>章</b> 程序加密

    GD32 ADC轉(zhuǎn)換時間如何計算?

    GD32 MCU當(dāng)前產(chǎn)品的ADC都是SAR ADC,它有著轉(zhuǎn)換速度快,精度高的優(yōu)點(diǎn),剛好適合在一些需要快速ADC轉(zhuǎn)換的場合使用,比如電機(jī)應(yīng)用。那么小伙伴們知道如何計算
    的頭像 發(fā)表于 03-04 09:33 ?3505次閱讀
    <b class='flag-5'>GD32</b> <b class='flag-5'>ADC</b>轉(zhuǎn)換時間如何計算?