国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32CubeMX配置ADC采樣(輪詢、中斷、DMA)

這篇具有很好參考價(jià)值的文章主要介紹了STM32CubeMX配置ADC采樣(輪詢、中斷、DMA)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

STM32CubeMX能夠極大減小STM32外設(shè)配置的工作量,因此作者也借助空閑時(shí)間對(duì)STM32CubeMX相關(guān)配置進(jìn)行了學(xué)習(xí),本文介紹如何利用STM32CubeMX配置ADC采樣,記錄了作者學(xué)習(xí)過程中遇到的問題及解決辦法,使大家少走彎路,并方便以后復(fù)習(xí)

1、單通道輪詢

hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
先選擇所使用的MCU,這里我使用的是STM32F407ZGT系列
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
修改一下DEBUG功能,否則后續(xù)無法調(diào)試
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
修改時(shí)鐘,采用外部晶振
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
配置一串口,用于打印采集的ADC值
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
這里我采用ADC1的通道0,并開啟連續(xù)采樣模式,否則每次開啟ADC采樣后只進(jìn)行一次采樣
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
開啟ADC全局中斷(如果只采用輪詢采樣就不用開啟,這里開啟是為了方便后面演示中斷采樣
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
修改一下ADC全局中斷的優(yōu)先級(jí)
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
在HCLK處輸入其時(shí)鐘最高頻率168,按回車,其余時(shí)鐘會(huì)自動(dòng)配置好,一般情況下無需改動(dòng)
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
勾選上后,每個(gè)外設(shè)會(huì)單獨(dú)保存至一個(gè).c文件,便于查看
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
生成并打開文件
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
在main.h中包含頭文件stdio.h
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
在usart.c文件中加入fputc函數(shù),加入后才能使用printf函數(shù)進(jìn)行打印數(shù)據(jù)
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)

在while循環(huán)中添加以上代碼,由于開啟了連續(xù)轉(zhuǎn)換模式,即hadc1.Init.ContinuousConvMode = ENABLE;因此每次轉(zhuǎn)換完成后都要調(diào)用HAL_ADC_Stop來關(guān)閉ADC;如果不想每次都調(diào)用該函數(shù)來關(guān)閉ADC,可以關(guān)閉連續(xù)轉(zhuǎn)換模式,即hadc1.Init.ContinuousConvMode = DISABLE,這樣每次開啟ADC轉(zhuǎn)換以后只會(huì)進(jìn)行一次采樣,這樣就不需要每次都關(guān)閉ADC了
實(shí)驗(yàn)現(xiàn)象如下圖:
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)

2、單通道中斷

單通道中斷采樣配置過程與單通道輪詢采樣相同,利用cubemx配置完成后有兩種開始ADC采樣的方法
方法一
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
在主函數(shù)中加入上述代碼,__HAL_ADC_ENABLE_IT(&hadc1,ADC_IT_EOC);用于打開ADC轉(zhuǎn)換完成中斷,HAL_ADC_Start(&hadc1);用于開啟ADC采樣,這兩個(gè)函數(shù)一定要放到外設(shè)初始化函數(shù)的后面,否則串口函數(shù)初始化未完成,在ADC中斷中使用printf函數(shù)可能會(huì)卡死
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
在adc.c文件中加入上面代碼,HAL_ADC_ConvCpltCallback是ADC中斷的回調(diào)函數(shù),其原型是個(gè)弱函數(shù),重新定義后原來的函數(shù)就失去作用了
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
最后將adc.c文件中的通道轉(zhuǎn)換結(jié)束標(biāo)準(zhǔn)修改為ADC_EOC_SEQ_CONV,否則只會(huì)進(jìn)入一次中斷
ADC_EOC_SEQ_CONV:在所有通道轉(zhuǎn)換完成后進(jìn)入中斷
ADC_EOC_SINGLE_CONV:單個(gè)通道轉(zhuǎn)換完成后進(jìn)入中斷
多個(gè)通道時(shí),兩種均可采用,單通道采樣時(shí)需使用ADC_EOC_SEQ_CONV才能連續(xù)進(jìn)入中斷(經(jīng)測(cè)試)

最后將程序下載到單片機(jī)中,現(xiàn)象如下:
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
方法二
我們利用HAL_ADC_Start_IT開啟adc中斷,該函數(shù)比較特殊,調(diào)用一次該函數(shù)就打開了ADC轉(zhuǎn)換完成中斷開啟ADC采樣
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
在主函數(shù)中直接調(diào)用HAL_ADC_Start_IT即可

3、單通道DMA

dma有兩種模式,分別為circular和normal
circular模式:dma的circular模式只需要調(diào)用一次dma開啟函數(shù),dma就會(huì)持續(xù)的搬運(yùn)數(shù)據(jù),提高了數(shù)據(jù)的刷新速度,但是在circular模式下,不管adc新的一輪數(shù)據(jù)采集是否完成,有可能直接將舊數(shù)據(jù)搬運(yùn)走
normal模式:該模式下,dma啟動(dòng)函數(shù)調(diào)用一次,dma通道只會(huì)搬運(yùn)一次數(shù)據(jù),這樣每調(diào)一次dma啟動(dòng)函數(shù),dma只會(huì)搬運(yùn)一次數(shù)據(jù),等待數(shù)據(jù)傳輸完成后再次開啟dma啟動(dòng)函數(shù),這樣更能保證adc數(shù)據(jù)采集的可靠性
circular模式:
cubemux配置步驟如下(時(shí)鐘配置等已略去):
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
這里我們同樣用ADC1的通道IN0來測(cè)試,開啟adc連續(xù)采集模式
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
修改ADC采樣時(shí)間,通常采樣時(shí)間越長,adc采樣精度越高
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
選用dma的circular模式
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
返回開啟dma連續(xù)請(qǐng)求(若不開啟,只能進(jìn)入一次dma采集完成中斷函數(shù)

 uint16_t AD_value=0;
 float f_AD_value;

打開工程文件,在文件中添加上面代碼,AD_value用于保存測(cè)量的adc原值,f_AD_value保存計(jì)算得到的電壓值

 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&AD_value,sizeof(AD_value));

在主函數(shù)中調(diào)用HAL_ADC_Start_DMA開啟adc采樣,同時(shí)開啟dma傳輸數(shù)據(jù)(調(diào)用一次即可
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
最后在dma中斷函數(shù)中添加上述代碼,將adc采集完成的數(shù)據(jù)打印出來
normal模式:
normal模式下,我們的想法是調(diào)用一次HAL_ADC_Start_DMA函數(shù),adc進(jìn)行一次數(shù)據(jù)采集,dma搬運(yùn)一次數(shù)據(jù),我們?cè)谏厦媾渲猛瓿傻拇a中做簡單修改就能實(shí)現(xiàn)
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
關(guān)閉adc連續(xù)采集模式,這樣開啟一次adc,只會(huì)進(jìn)行一次數(shù)據(jù)采集
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)

將dma模式修改為normal
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
修改dma中斷函數(shù)

 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&AD_value,sizeof(AD_value));

最后在主函數(shù)中調(diào)用HAL_ADC_Start_DMA開啟adc采樣,同時(shí)開啟dma傳輸數(shù)據(jù)(每調(diào)用一次只會(huì)采集一次數(shù)據(jù)

4、多通道輪詢

hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
這里用ADC1的通道IN0、IN1、IN2、IN3四個(gè)通道作演示,多個(gè)通道時(shí)必須開啟間斷模式,并且每個(gè)間斷組中只有一個(gè)通道,否則每次只能讀取到每組最后一個(gè)通道的值
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
設(shè)置通道轉(zhuǎn)換順序

uint16_t AD_value[4]={0};

打開工程文件,創(chuàng)建一數(shù)組用于存儲(chǔ)四個(gè)通道的ADC值

for(i=0;i<4;i++){
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,10);
AD_value[i]=HAL_ADC_GetValue(&hadc1);
printf("PA%d:%d\r\n",i,AD_value[i]);
printf("PA%d:%.3f v\r\n",i,AD_value[i]*3.3/4096);
}
HAL_Delay(500);

在主循環(huán)中添加上述代碼,HAL_ADC_Start必須放在for循環(huán)中,否則只能采集第一個(gè)通道的ADC值;HAL_ADC_PollForConversion用于輪詢轉(zhuǎn)換,是一個(gè)阻塞函數(shù),等待轉(zhuǎn)換完成,參數(shù)10是阻塞時(shí)間

5、多通道中斷

多通道情況下使用中斷來讀取數(shù)據(jù)理論上是可行的,但是讀取的數(shù)據(jù)會(huì)混淆,即無法確定讀取的數(shù)據(jù)是屬于哪一個(gè)通道的,因此我們不使用

6、多通道DMA

hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)

hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)

hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
開啟DMA并采用circular模式

uint16_t AD_value[4]={0};

定義一數(shù)組用于保存ADC采樣值
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
在外設(shè)初始化函數(shù)下面調(diào)用 HAL_ADC_Start_DMA(&hadc1,(uint32_t*)AD_value,sizeof(AD_value));啟動(dòng)ADC轉(zhuǎn)換和DMA數(shù)據(jù)傳輸
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
最后在DMA接收完成中斷中將采集到的ADC數(shù)據(jù)打印出來
經(jīng)測(cè)試:DMA接收中斷在數(shù)據(jù)接收緩沖區(qū)滿了后觸發(fā),這里的緩沖區(qū)是數(shù)據(jù)AD_value[4]

注意:
通常為了方便使用一些濾波算法,我們可以將緩沖區(qū)數(shù)據(jù)創(chuàng)建的更大一些(為通道數(shù)的整數(shù)倍),這里我們采用了4個(gè)通道,我們可以將緩沖數(shù)組創(chuàng)建為AD_value[40]
則AD_value[0]、AD_value[4]、AD_value[8]…AD_value[36]均為通道IN0的值
AD_value[1]、AD_value[5]、AD_value[9]…AD_value[37]均為通道IN1的值,
AD_value[2]、AD_value[6]、AD_value[10]…AD_value[38]均為通道IN2的值,
AD_value[3]、AD_value[7]、AD_value[11]…AD_value[39]均為通道IN3的值,

hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
我們同樣在dma接收完成中斷中將數(shù)據(jù)打印出來
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
實(shí)驗(yàn)現(xiàn)象如上,只打印了一次數(shù)據(jù),表示只進(jìn)入了一次DMA中斷中,并且主循環(huán)中的程序也不再繼續(xù)執(zhí)行,程序卡死了
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
可以在進(jìn)入DMA中斷函數(shù)時(shí)調(diào)用HAL_ADC_Stop_DMA來關(guān)閉ADC采集,當(dāng)需要采集ADC的時(shí)候再調(diào)用 HAL_ADC_Start_DMA即可,這里為了演示在中斷函數(shù)結(jié)束時(shí)又重新開啟了ADC
hal_adc_start_dma,STM32,單片機(jī),嵌入式,stm32,單片機(jī)
這樣就能連續(xù)采集打印數(shù)據(jù)了文章來源地址http://www.zghlxwxcb.cn/news/detail-780285.html

到了這里,關(guān)于STM32CubeMX配置ADC采樣(輪詢、中斷、DMA)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【STM32+HAL庫+CubeMX】UART輪詢收發(fā)、中斷收發(fā)、DMA收發(fā)方法及空閑中斷詳解

    【STM32+HAL庫+CubeMX】UART輪詢收發(fā)、中斷收發(fā)、DMA收發(fā)方法及空閑中斷詳解

    Author: DrinkCat(szt@drinkcat.com) Copyright ? 2023 DrinkCat Original link: DrinkCat’s Blog UART是一種異步串行通信接口,常用于通過串口與外部設(shè)備進(jìn)行通信。它通過發(fā)送和接收數(shù)據(jù)幀來實(shí)現(xiàn)數(shù)據(jù)傳輸,使用起來相對(duì)簡單。UART通常包含發(fā)送器(Transmitter)和接收器(Receiver),通過兩根信號(hào)線

    2024年02月10日
    瀏覽(22)
  • 【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長數(shù)據(jù)接收

    【STM32】CUBEMX之串口:串口三種模式(輪詢模式、中斷模式、DMA模式)的配置與使用示例 + 串口重定向 + 使用HAL擴(kuò)展函數(shù)實(shí)現(xiàn)不定長數(shù)據(jù)接收

    目錄 ? 總覽 使用CUBEMX創(chuàng)建工程的基本配置 CUBEMX中的配置 Keil中的配置 實(shí)物連接 串口輪詢模式 輪詢模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗(yàn)一:發(fā)送數(shù)據(jù)給單片機(jī)并讓其返回相同值 串口重定向 串口中斷模式 在CUBEMX中打開串口中斷 中斷模式HAL庫函數(shù) 特點(diǎn) 實(shí)驗(yàn)二:使用中斷回調(diào)完成實(shí)驗(yàn)一

    2024年04月10日
    瀏覽(44)
  • 搭建stm32電機(jī)控制代碼框架(三)——Stm32CubeMx配置ADC采樣

    搭建stm32電機(jī)控制代碼框架(三)——Stm32CubeMx配置ADC采樣

    電機(jī)控制另一個(gè)關(guān)鍵的模塊就是ADC采樣,這個(gè)模塊配置的好壞決定了采樣電流和電壓的精準(zhǔn)度,因此有必要對(duì)其進(jìn)行深入學(xué)習(xí)。 簡介: STM32 在片上集成的ADC 外設(shè)非常強(qiáng)大。STM32F103xC、STM32F103xD 和STM32F103xE增強(qiáng)型產(chǎn)品內(nèi)嵌3個(gè)12位的ADC,每個(gè)ADC 共用多達(dá) 21 個(gè)外部通道,可以實(shí)現(xiàn)

    2024年02月13日
    瀏覽(32)
  • 電機(jī)FOC控制(三)STM32 CUBEMX 配置ADC采樣

    電機(jī)FOC控制(三)STM32 CUBEMX 配置ADC采樣

    本文在電機(jī)FOC控制(二)STM32 CUBEMX 配置三相PWM互補(bǔ)輸出基礎(chǔ)上,繼續(xù)講述如何STM32 CUBEMX 配置ADC寄存器,使TIMER1 PWM互補(bǔ)輸出CC4觸發(fā)ADC注入采樣的過程。 打開Clock Configuration界面,將ADC設(shè)置為42.5MHz。 設(shè)定ADC1通道7和通道8為單端輸入: 設(shè)定ADC2通道6和通道7為單端輸入: ADCs_Comm

    2024年04月23日
    瀏覽(77)
  • STM32CubeMX配置-ADC多通道配置(DMA) (STM32G070)

    STM32CubeMX配置-ADC多通道配置(DMA) (STM32G070)

    一、寫在前面 ????????ADC通道采集數(shù)據(jù)的兩種方式: ? ? ? ? 1)ADC輪詢采集數(shù)據(jù)直接放到數(shù)組中; ? ? ? ? 2)采用中斷方式,ADC采集完成進(jìn)入中斷,中斷關(guān)閉ADC采集,取數(shù)據(jù)之后再打開ADC采集。 以下按第一種方式實(shí)現(xiàn): 二、ADC多通道配置 1)配置通道及參數(shù) ? ? 如果要控

    2024年02月05日
    瀏覽(24)
  • STM32 cubemx配置DMA+空閑中斷接收不定長數(shù)據(jù)

    STM32 cubemx配置DMA+空閑中斷接收不定長數(shù)據(jù)

    本篇文章給大家講解一下DMA+串口空閑中斷接收串口不定長數(shù)據(jù),之前我們也是講解過串口接收不定長數(shù)據(jù)的,那么本篇文章的話將使用DMA來接收不定長數(shù)據(jù)。 串口空閑中斷是指在串口接收到數(shù)據(jù)后,在數(shù)據(jù)的傳輸結(jié)束之后,在一段連續(xù)的空閑時(shí)間內(nèi)沒有接收到新數(shù)據(jù)時(shí)觸發(fā)

    2024年02月19日
    瀏覽(27)
  • STM32初學(xué)入門筆記(3):STM32CubeMX配置STM32實(shí)現(xiàn)多通道ADC+DMA讀取模擬量

    STM32初學(xué)入門筆記(3):STM32CubeMX配置STM32實(shí)現(xiàn)多通道ADC+DMA讀取模擬量

    模擬信號(hào)的讀取是我們?cè)谧龊芏囗?xiàng)目是都要用到的,而模擬量的讀取就要依賴于ADC數(shù)模轉(zhuǎn)換器。對(duì)于初學(xué)者,學(xué)習(xí)使用ADC可以很大的幫助以后的STM32學(xué)習(xí)。 目錄 ADC簡介 : DMA簡介:? 工程開始: STM32CubeMX配置區(qū): 配置外部時(shí)鐘: 配置調(diào)試: 配置ADC: 配置DMA: 配置串口: 配

    2024年02月09日
    瀏覽(31)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL庫開發(fā))

    STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL庫開發(fā))

    ?時(shí)鐘配置HSI主頻配置64M ?勾選打開8個(gè)通道的ADC ?使能連續(xù)轉(zhuǎn)換模式 ?添加DMA ?DMA模式選擇循環(huán)模式 ?使能DMA連續(xù)請(qǐng)求 采樣時(shí)間配置160.5 轉(zhuǎn)換次數(shù)為8 ?配置好8次轉(zhuǎn)換的順序 ?配置好串口,選擇異步模式 配置好需要的開發(fā)環(huán)境并獲取代碼 ?修改main.c 串口重定向 ?串口重定向

    2024年02月08日
    瀏覽(40)
  • STM32CubeMx配置ADC(多通道采集+DMA讀取數(shù)據(jù))(HAL庫開發(fā))

    STM32CubeMx配置ADC(多通道采集+DMA讀取數(shù)據(jù))(HAL庫開發(fā))

    目錄 1、函數(shù)配置過程(這是標(biāo)準(zhǔn)庫配置過程): 2、STM32CubeMx配置過程 ?3、main函數(shù)源文件 采集5路ADC數(shù)據(jù),并用串口printf()函數(shù)打印出來。 實(shí)驗(yàn)現(xiàn)象:? ADC轉(zhuǎn)換的初始條件: 1、使能 2、觸發(fā)源條件完成(這個(gè)需要自己配置)利用:HAL_ADC_Start_DMA()函數(shù); ADC中HAL開發(fā)優(yōu)勢(shì)就是,

    2023年04月08日
    瀏覽(27)
  • STM32 ADC單/多通道采樣+DMA搬運(yùn)

    STM32 ADC單/多通道采樣+DMA搬運(yùn)

    通過介紹我們可以了解到,ADC是12位的轉(zhuǎn)換器,所以采樣值范圍是0~4095。18個(gè)通道可同時(shí)進(jìn)行轉(zhuǎn)換,也可以單獨(dú)轉(zhuǎn)換某個(gè)通道。 使用ADC的流程應(yīng)為: 初始化IO口。 我這里使用的是PA1進(jìn)行采樣,也就是ADC1的通道1 初始化ADC。 轉(zhuǎn)換、獲取采樣值。 多通道的時(shí)候我們一般用DMA來搬

    2024年02月14日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包