stm32的DMA ADC多通道資料採集

2021-09-29 16:21:11 字數 2379 閱讀 6708

硬體:stm32f103rct6,輸入大容量產品。

軟體:keil mdk5.0

韌體庫:stm32f1標準外設庫。

除錯軟體:友善串列埠助手

stm32有多達16個通道,常用的取樣方法有兩種,一是分時採集每個通道的資料,用查詢或者中斷的方式採集完乙個通道的資料,將通道設定為下乙個,依次採集,這種方法思路簡單,但是效率不高,適合初學者。二是利用dma功能採集多個規則通道的資料,注意是規則通道,因為規則通道是多通道共用乙個資料暫存器adcx->dr存放結果,而注入通道有多個暫存器,注入取樣以後再講。下面進入正題。

我們用到adc和dma外設,首先要對其使能,下面是幾個重要的使能函式,因為有些使能函式使能一次即可,有些使能函式轉換完後自動清零,要重新使能一次,這裡是個大坑,如果你不再次使能,取樣根本不行。

adc_cmd(adc1, enable),設定adc_cr2的adon位,讓adc上電,這個函式使能一次即可。

adc_dmacmd(adc1, enable)設定adc_cr2的dma位,使能adc的dma請求,使能一次即可。

dma_cmd(dma1_channel1, disable)設定dma1對應的adc通道,通道1使能,使能一次即可,但需要注意的是這個函式與dma_setcurrdatacounter(dma1_channel1, 2)相關,要設定dma的傳輸量,這個函式的第二個引數必須為disable。

adc_softwarestartconvcmd(adc1, enable)使能adc_cr1的swstart位,當adc完成一次轉換後,這個位自動變為0,要重新開啟adc,切記,這函式每完成一次adc取樣後都要再呼叫一次,表示用軟體觸發的方式開始adc取樣。

1 因為是多通道,要開啟adc的掃瞄模式(連續模式是否開始視自己的需求而定)。

2 adc有自己的分頻控制器,不要忘記開啟。可以呼叫rcc_adcclkconfig函式。

3 因為是多通道,要設定每個通道的取樣先後順序,呼叫adc_regularchannelconfig(adc1, adc_channel_0, 1, adc_sampletime_239cycles5)函式。

4 因為adc的dr是16位的,所以dma的外設資料寬度為halfword。

5 如果開啟了dma的中斷一定不要忘記中斷使能。

6 如果dma不採用回環模式,每次傳送完資料後,dma_***trx暫存器清零,要重灌這個暫存器的值,在重灌前確保dmade通道是關閉的,否則重灌無效。

void adc1_init(void)

通道的總數量用adc_initstruct.adc_nbrofchannel = x設定,同時下面要呼叫幾次adc_regularchannelconfig()函式,設定通道的取樣次序。

void adc1_dma_config(dma_channel_typedef* dmay_channelx,u32 memaddr,u32 periphaddr,u8 bufsize)

#endif

}以上**完成了dma結構體配置,巨集adc1_dma_int_en為1,表示使用dma中斷,下面配置了nvic結構體,並開啟dma傳輸完成中斷。因為adc的dr是16位的所以設定外設資料寬度為halfword,傳輸資料量為2,

這裡一定要注意,傳輸的資料量表示傳送的次數,而傳送次數由源位址資料寬度決定,因為有兩個通道所以配置傳輸資料量為2,表示傳送兩次,實際傳送了4個位元組。這裡一定要注意,如果配置為4則進不了dma中斷。這是新手很容易犯的錯誤。

因為沒有開始dma回環模式,每次傳送完後,dma_***trx暫存器清零,這時不管dma使能與否dma都會停止,因此要重新設定傳送的資料量,再此之前一定要先關閉dma通道,切記。

void dma1_channel1_irqhandler(void)

}

沒啥好說的,在中斷裡置位在main裡面查詢,查詢到置1就處理資料。

nt main()

,0,0,0};

u32 temp = 0;

u8 i;

//float fval;

systick_init(72);

nvic_prioritygroupconfig(2);

led_init();

usart1_config(9600);

adc1_init();

adc1_dma_config(dma1_channel1,(u32)rxbuf.buf,(u32)&adc1->dr,2);

while(1)

}}

要注意adc1_dma_config傳引數時,外設位址是(u32)&adc1->dr,不要忘記&。

STM32多通道ADC操作

自 今天嘗試了下stm32的adc取樣,並利用dma實現取樣資料的直接搬運儲存,這樣就不用cpu去參與操作了。找了不少例子參考,adc和dma的設定了解了個大概,並直接利用開發板來做一些實驗來驗證相關的操作,保證自己對各部分設定的理解。我這裡用了3路的adc通道,1路外部變阻器輸入,另外兩路是內部的...

STM32的ADC多通道取樣

用hal庫寫的好處就是可以不用進行配置io口發步驟.有良好的相容性,更換晶元的時候改 也簡單.rcc我在左側的 裡不用勾選,因為我用的是內部時鐘,不用選.下面是我配置的時鐘 之所以是48m,還要分頻呢.下面直接上 其他的都預設.然後按alt p,設定下工程,格式如下 這個可以把 格式更模組化。建議選...

STM32 多通道掃瞄 ADC資料錯亂 HAL

問題 多通道adc掃瞄 單次 dma,發現工作一段時間後,dma資料錯位。按我的理解當前是單次模式,轉換完成後應該自動停止,實際過程不太對。解決辦法 在dma搬運結束中斷中關閉adc void hal adc convcpltcallback adc handletypedef hadc 多通道單次...