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

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

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

測試代碼中使用DMA傳輸,定時器觸發(fā)ADC

茶話MCU ? 來源:ST MCU 信息交流 ? 2020-08-10 16:22 ? 次閱讀

有人在使用STM32G0芯片ADC模塊時,往往因為掃描模式的理解不到位或選擇不當(dāng)導(dǎo)致些問題。這里就該話題做點簡單分享介紹,不妨以一個實例展開。

現(xiàn)在共用到ADC1模塊的4個ADC通道,即1個片內(nèi)Vrefint通道和其它三個外部通道CH8,CH10,CH17。下面測試代碼中使用DMA傳輸,定時器觸發(fā)ADC.

它們的硬件連接情況如下,其中VRefint為內(nèi)部參考電壓,其電壓值大概1.2V樣子。

對于STM32G0系列,ADC掃描模式可以有兩種,分別是不完全配置序列模式和完全配置序列模式。我們先看看不完全配置序列模式。

不完全配置序列模式

在該模式下,ADC_CFGR1寄存器中的CHESELRMOD位必須被清零。

被轉(zhuǎn)換通道的掃描順序按照ADC通道固有序號的大小順序依次進行,掃描方向可以軟件配置為向前【forward】或后退【backward】。任何ADC通道都可以配置進該序列中,總的序列長度由寄存器ADC_CHSELR中被置位的CHSELx個數(shù)決定,最多可配置18個通道。

我們以上面提到的CH8、CH10、CH17和VRefint通道【它對應(yīng)ADC通道CH13】為例,若將上述4個通道配置為不完全序列模式,只需將ADC_CHSELR寄存器中的CHSELx相應(yīng)位進行置1即可。如下圖所示:

若選擇forward掃描模式,則按通道號從小到大的順序依次實施轉(zhuǎn)換,生成對應(yīng)于CH8、CH10、CH13、CH17的結(jié)果。使用STM32CubeMx的配置如下:

既然掃描按默認通道號大小順序進行,自然就無須RANK順序的配置了。

編譯運行后可以看到結(jié)果,我在內(nèi)存里放了兩組數(shù)據(jù)以便比較觀察。

從結(jié)果來看跟實際情況是一致的,轉(zhuǎn)換結(jié)果依次來自CH8/CH10/CH13/CH17。其中那個149x數(shù)值來自對內(nèi)部Vrefint的轉(zhuǎn)換結(jié)果。

那么,對于同樣的ADC通道及硬件連接,若采用完全配置序列模式會怎么樣呢?

完全配置序列模式

在該模式下,ADC_CFGR1寄存器中的CHESELRMOD位必須被置1。

全序列可支持的通道數(shù)最多8個,掃描順序不是依照硬件約定的通道號來安排,而是依據(jù)ADC_CHSELR寄存器中的從SQ1[3:0]到SQ8[3:0]所選擇的通道順序進行,即按照我們在CubeMX或代碼中配置的RANK順序進行,不再涉及掃描方向forward/backward的配置,并且只有通道0 到 通道14可以被選擇!

還有,當(dāng)SQn[3:0]里的賦值等于0b1111,即0x0f時則該通道選擇域以及后續(xù)SQn的通道選擇無效。比方說,假設(shè)SQ3[3:0]的數(shù)據(jù)為0b1111,則表示從SQ3[3:0]開始直到SQ8[3:0]的通道選擇無效。由于SQn[3:0]才4位,所有它也沒法選擇高于14的有效通道號?!菊?zhí)貏e注意這些特性!】

看到這里,我們不禁想到前面預(yù)先安排的4個通道中的有個CH17,顯然不適合這種模式。如果被錯誤地強行使用該模式,基于CubeMx配置和現(xiàn)有Cube庫所產(chǎn)生的代碼運行結(jié)果會怎么樣呢?

先用CubeMX進行配置:

4個通道的掃描順序配置如下,相比前面多了RANK順序配置。

先撇開CH17合法性不談,不難看出這里跟前面的掃描順序配置有點不一樣,這里的配置為我們提供了更多的自主性及便利性,轉(zhuǎn)換掃描并不固定于通道號的順序,具體由SQn[3:0]的配置選擇決定。我這里讓SQ1選擇CH8,SQ2選擇CH10,SQ3選擇CH17,SQ4選擇CH13,分別對應(yīng)配置中的RANK1、RANK2、RANK3、RANK4順序。

編譯運行查看結(jié)果:

前面說過,CH17硬件上是接地的,顯然此時對應(yīng)于CH17的轉(zhuǎn)換值【綠色箭頭所指】跟實際情況完全不符,其它三個倒是跟實際情況吻合。409x對應(yīng)CH8接VDD,0對應(yīng)CH10接GND,149x對應(yīng)內(nèi)部vrefint。

我嘗試將CH17接到VDD,轉(zhuǎn)換結(jié)果還是跟實際情況還是完全不相符。

結(jié)合上面的介紹,我們知道對于完全配置序列模式不能選用高于通道14的通道號。我們不妨通過寄存器進一步看看,當(dāng)我們錯誤地強行使用CH17時在現(xiàn)有庫代碼的情況下,對應(yīng)的SQ3[3:0]真正的值是多少?到底選擇了什么通道?還是CH17嗎?

在調(diào)試環(huán)境下,打開通道選擇寄存器,可以看到下面結(jié)果:

從上面通道選擇寄存器不難看出,除了SQ3外,其它三個配置都是正確的,跟我們預(yù)設(shè)的通道是一致的。但是,SQ3被錯誤地配置為CH1了,也就是說上面看到的所謂CH17的轉(zhuǎn)換結(jié)果都是來自CH1.難怪不論怎么改變CH17的外部連接時,SQ3選擇通道所對應(yīng)的轉(zhuǎn)換結(jié)果沒有相應(yīng)變化,跟CH17的管腳電壓也沒啥關(guān)系。

看到這里有人可能會想,如果我們在前面規(guī)劃ADC通道時把CH1同時規(guī)劃進來、硬件上恰好也接地,這時就可能發(fā)生誤判!這種巧合性的誤判,有時可能給我們的調(diào)試帶來極大隱患而一會半會又找不到原因。當(dāng)然,具體會發(fā)生些什么要因具體應(yīng)用而定。這里只是簡單提醒下,就此打住。

總之,這點在STM32G0 ADC應(yīng)用中是個很容易出錯的地方,將本不該用在完全配置序列模式的通道被錯誤地強行使用,雖有轉(zhuǎn)換結(jié)果,而轉(zhuǎn)換結(jié)果卻來自別的通道,往往為此覺得問題詭異、不可思議而備受折騰。

最后,稍微小結(jié)下。對于STM32G0系列的ADC模塊來說,其ADC通道在被轉(zhuǎn)換時涉及到轉(zhuǎn)換序列配置問題,這里有兩種轉(zhuǎn)換序列配置模式,即不完全配置序列模式和完全配置序列模式。

所謂不完全配置序列模式,在進行多個通道AD轉(zhuǎn)換時,轉(zhuǎn)換順序由各通道自身的硬件序列號和掃描方向決定,其中硬件序列號即CHn在數(shù)據(jù)手冊里已經(jīng)明確定義,掃描方向通過寄存器配置。整個轉(zhuǎn)換序列可支持的通道數(shù)多達18個,沒有被排除在外的通道。

而完全配置序列模式呢,在進行多個通道AD轉(zhuǎn)換時,轉(zhuǎn)換順序由通道選擇寄存器中通道選擇域SQn[3:0]來決定,即按照SQ1,SQ2.。。。。SQ7,SQ8的順序,而且SQn[3:0]只能選擇CH0到CH14的通道,整個序列最多支持8個通道。顯然,CH15~CH18不能使用該模式。

說到這里,或許有人會問,如果只使用1個ADC通道,還有這個轉(zhuǎn)換序列模式的選擇問題嗎?你把1個通道看成一個特殊的轉(zhuǎn)換序列來理解就知道有沒有這個模式選擇問題了。

芯片設(shè)計人員在此提供了兩種轉(zhuǎn)換序列模式,本意旨在讓我們能在實際應(yīng)用中可以根據(jù)實際需求靈活選擇,然而,往往由于開發(fā)人員的慣性思維和無視手冊導(dǎo)致在這個地方遇上點麻煩或困惑。在此分享之,祝君好運!

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

    關(guān)注

    97

    文章

    6300

    瀏覽量

    542460
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113693
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    552

    瀏覽量

    99941

原文標題:STM32G0系列ADC掃描序列模式解讀

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    tc397如何使用定時器的更新事件來觸發(fā)dma搬運數(shù)據(jù)?

    請問有沒有人使用過定時器的更新事件來觸發(fā)dma搬運數(shù)據(jù),或者哪里有相關(guān)的示例代碼,我不知道應(yīng)該使用gtm模塊的哪個子模塊來做這件事情,有經(jīng)驗的大佬可否指教下。
    發(fā)表于 07-05 06:36

    關(guān)于定時器觸發(fā)ADC連續(xù)采樣dma傳輸的疑問求解?

    實現(xiàn)該功能,但我未找到相關(guān)的API,沒找到關(guān)于adc這方面的函數(shù)。所以想問一下是否有定時器觸發(fā)ADC連續(xù)采樣并通過dma
    發(fā)表于 06-14 07:25

    CW32使用DMA單通道、定時器觸發(fā)ADC實現(xiàn)了多路AD采集

    測試樣例基于CW32F030C8T6MCU,使用DMA單通道、定時器觸發(fā)ADC實現(xiàn)了12路AD采集。
    的頭像 發(fā)表于 05-24 09:29 ?629次閱讀
    CW32使用<b class='flag-5'>DMA</b>單通道、<b class='flag-5'>定時器</b><b class='flag-5'>觸發(fā)</b><b class='flag-5'>ADC</b>實現(xiàn)了多路AD采集

    STM32L151定時器上升沿觸發(fā)ADC采樣,為什么每個PWM周期內(nèi)會觸發(fā)第二次采樣?

    使用定時器觸發(fā)ADC采樣PWM正脈沖時刻的負載電壓電流,觸發(fā)ADC定時器用的就是產(chǎn)生PWM的
    發(fā)表于 05-24 07:37

    使用dma的方式來傳輸定時器輸入捕獲的數(shù)據(jù),是不是每隔100ms會觸發(fā)dma傳輸完成中斷?

    目前使用dma的方式來傳輸定時器輸入捕獲的數(shù)據(jù),內(nèi)存數(shù)據(jù)大小為2,使用normal模式,100ms打開dma模式,請問,這種情況下,是不是每隔100ms會觸發(fā)
    發(fā)表于 04-18 07:47

    STM32通過DMA方式傳輸TIM3定時器計數(shù)值,數(shù)值重復(fù)是為什么?

    AD值防止數(shù)據(jù)錯亂,故DMA配置必須放在ADC之前。) 因此為了排除相同原因?qū)е碌臄?shù)據(jù)重復(fù),所以將DMA配置放在TIM3定時器初始化之前。 結(jié)果反饋,TIM3計數(shù)
    發(fā)表于 04-10 06:50

    信號通過ADC DMA DAC進行轉(zhuǎn)換,非空狀態(tài)下觸發(fā)定時器中斷進行延時,中斷結(jié)束還會繼續(xù)DMA轉(zhuǎn)換嗎?

    信號通過ADC DMA DAC進行轉(zhuǎn)換,其中需要延時 我的想法是 把ADC數(shù)據(jù)存入FIFO,然后根據(jù)DMA_GetFIFOStatus()函數(shù)判斷FIFO狀態(tài),非空狀態(tài)下
    發(fā)表于 04-03 08:06

    STM8L151如何配置定時器2觸發(fā)ADC,DMA傳輸?

    (REMAP_DMA1Channel_ADC1ToChannel0); DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,//緩沖區(qū)地址 ADC1_D
    發(fā)表于 04-02 06:23

    請問如何使用定時器的更新事件觸發(fā)DMA讀取6字節(jié)SPI數(shù)據(jù)?

    想用定時器的更新事件觸發(fā)DMA讀取SPI數(shù)據(jù),現(xiàn)在有個問題是一次更新事件只能觸發(fā)一次DMA傳輸
    發(fā)表于 03-29 06:16

    HAL_ADC_Start_DMA函數(shù)為什么無法進行第二次觸發(fā)?

    我使用定時器觸發(fā)adc采集 使用dma傳輸dma傳輸
    發(fā)表于 03-26 07:31

    定時器觸發(fā)ADC+DMA采集數(shù)據(jù)將信號發(fā)生給的正玄波通過串口打印出來,有的波形為0為什么?

    目前是想先利用定時器觸發(fā)ADC+DMA采集數(shù)據(jù)將信號發(fā)生給的正玄波通過串口打印出來,但是波形有一部分為0,是為啥呢,代碼如下: MX_GP
    發(fā)表于 03-19 06:50

    STM32U575定時器PWM觸發(fā)DMA搬運內(nèi)存時,為什么程序在DMA中斷里出不來?

    STM32U575 定時器PWM觸發(fā)DMA搬運內(nèi)存,為什么程序在DMA中斷里出不來?
    發(fā)表于 03-12 08:33

    STM32H7做的項目,使用HAL_DMA_Start_IT,但是DMA是以最快的速度傳輸,并不受定時器周期控制?

    使用STM32H7做的項目,想要用定時器的溢出事件,觸發(fā)DMA將GPIO的狀態(tài)傳輸到內(nèi)存上。 使用HAL_DMA_Start_IT,但是
    發(fā)表于 03-11 07:23

    如何使用定時器觸發(fā)器進行SPI DMA傳輸?

    我正在做一個項目,在這個項目中,我必須在 DMA 模式下通過 SPI 定期傳輸數(shù)據(jù)。 為了避免 CPU 干預(yù),我想使用計時觸發(fā)器觸發(fā) SP
    發(fā)表于 01-30 08:08

    使用MM32F0270 定時器DMA方式輸出PWM

    使用MM32F0270 定時器DMA方式輸出PWM
    的頭像 發(fā)表于 10-17 14:47 ?730次閱讀
    使用MM32F0270 <b class='flag-5'>定時器</b><b class='flag-5'>DMA</b>方式輸出PWM