日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

STM32CubeMX教程14 ADC - 多通道DMA转换

發(fā)布時(shí)間:2024/1/16 windows 39 coder
生活随笔 收集整理的這篇文章主要介紹了 STM32CubeMX教程14 ADC - 多通道DMA转换 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、準(zhǔn)備材料

開發(fā)板(正點(diǎn)原子stm32f407探索者開發(fā)板V2.4)
ST-LINK/V2驅(qū)動(dòng)
STM32CubeMX軟件(Version 6.10.0)
keil μVision5 IDE(MDK-Arm)
CH340G Windows系統(tǒng)驅(qū)動(dòng)程序(CH341SER.EXE)
XCOM V2.6串口助手
3個(gè)滑動(dòng)變阻器

2、實(shí)驗(yàn)?zāi)繕?biāo)

使用STM32CubeMX軟件配置STM32F407開發(fā)板的ADC實(shí)現(xiàn)ADC多通道DMA采集,具體為使用ADC_IN5/6/7三個(gè)通道進(jìn)行DMA連續(xù)ADC轉(zhuǎn)換

3、實(shí)驗(yàn)流程

3.0、前提知識(shí)

“STM32CubeMX教程13 ADC - 單通道轉(zhuǎn)換”實(shí)驗(yàn)中提到過,規(guī)則通道只有一個(gè)16位的數(shù)據(jù)寄存器,因此規(guī)則通道同時(shí)只能轉(zhuǎn)換一個(gè)ADC通道,而且每次轉(zhuǎn)化完一個(gè)ADC通道就需要及時(shí)從數(shù)據(jù)寄存器中取出轉(zhuǎn)化的數(shù)據(jù),否則會(huì)被后面轉(zhuǎn)化完畢的通道數(shù)據(jù)覆蓋

這個(gè)時(shí)間非常短,一般不采用像單通道轉(zhuǎn)化中使用中斷提取處理每個(gè)單通道數(shù)據(jù)的方法,而是采用DMA連續(xù)轉(zhuǎn)化的方法,將多通道轉(zhuǎn)化完畢之后,在DMA的數(shù)據(jù)存儲(chǔ)中將采集到的所有通道的數(shù)據(jù)一起處理

ADC是利用片上的模數(shù)轉(zhuǎn)換器將外部的模擬量轉(zhuǎn)化為數(shù)字量存儲(chǔ)到內(nèi)存中,數(shù)據(jù)傳輸方向應(yīng)該只有從外設(shè)到內(nèi)存這一種方向,因此可知ADC的DMA方向也只有外設(shè)到內(nèi)存一種

從“STM32CubeMX DMA 直接內(nèi)存讀取”實(shí)驗(yàn)中可知ADC1的DMA通道有DMA2_Stream0 CH0 和 DMA2_Stream4 CH0 兩個(gè)通道

ADC的DMA請求模式一般選擇循環(huán)模式,在多通道ADC采集時(shí),配合使能掃描轉(zhuǎn)化模式,這樣就可以連續(xù)轉(zhuǎn)化多通道而不停止

由于ADC采集后的數(shù)據(jù)一般需要存儲(chǔ)在內(nèi)存中,因此在選擇地址遞增時(shí),ADC外設(shè)地址不增加,內(nèi)存地址選擇遞增

使用HAL_ADC_Start_DMA()以DMA方式啟動(dòng)ADC采集時(shí)需要指定存儲(chǔ)的內(nèi)存首地址,從函數(shù)的定義可知其為uint32_t*類型,因此在DMA配置時(shí)我們需要選擇的數(shù)據(jù)寬度為字Word

3.1、CubeMX相關(guān)配置

3.1.0、工程基本配置

打開STM32CubeMX軟件,單擊ACCESS TO MCU SELECTOR選擇開發(fā)板MCU(選擇你使用開發(fā)板的主控MCU型號(hào)),選中MCU型號(hào)后單擊頁面右上角Start Project開始工程,具體如下圖所示

開始工程之后在配置主頁面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具體如下圖所示

詳細(xì)工程建立內(nèi)容讀者可以閱讀STM32CubeMX教程1 工程建立

3.1.1、時(shí)鐘樹配置

系統(tǒng)時(shí)鐘使用8MHz外部高速時(shí)鐘HSE,HCLK、PCLK1和PCLK2均設(shè)置為STM32F407能達(dá)到的最高時(shí)鐘頻率,具體如下圖所示

3.1.2、外設(shè)參數(shù)配置

本實(shí)驗(yàn)需要需要初始化USART1作為輸出信息渠道,具體配置步驟請閱讀“STM32CubeMX教程9 USART/UART 異步通信”

設(shè)置TIM3通用定時(shí)器溢出時(shí)間100ms,外部觸發(fā)事件選擇更新事件,參數(shù)詳解請閱讀“STM32CubeMX教程6 TIM 通用定時(shí)器 - 生成PWM波”實(shí)驗(yàn),具體配置如下圖所示

在Pinout & Configuration頁面左邊功能分類欄目Analog中單擊其中ADC1,勾選IN5/6/7三個(gè)通道,在下方的參數(shù)設(shè)置中以ADC - 單通道轉(zhuǎn)換實(shí)驗(yàn)為模板修改部分參數(shù)

Scan Conversion Mode 使能掃描轉(zhuǎn)換模式,因此現(xiàn)在需要轉(zhuǎn)換5/6/7三個(gè)通道,因此使能該模式之后,在規(guī)則通道轉(zhuǎn)換為其中一個(gè)通道后就會(huì)接收轉(zhuǎn)換下一個(gè)通道

DMA Continuous Requests 使能DMA連續(xù)轉(zhuǎn)換請求,該參數(shù)的使能需要在配置完DMA請求之后才可選,配合參數(shù) Scan Conversion Mode 可以實(shí)現(xiàn)連續(xù)不間斷的對三個(gè)通道數(shù)據(jù)進(jìn)行采集

End Of Conversion Selection 選擇EOC flag at the end of all conversions,該參數(shù)表示當(dāng)轉(zhuǎn)換完畢一組ADC中的所有通道之后再產(chǎn)生EOC標(biāo)志,進(jìn)入中斷

Number Of Conversion 規(guī)則通道轉(zhuǎn)換數(shù)量現(xiàn)在為3,對應(yīng)三個(gè)不同的通道,通道轉(zhuǎn)換順序及每個(gè)通道的采樣時(shí)間由Rank及其下參數(shù)決定

具體參數(shù)配置如下圖所示

單擊Configuration中的DMA Settings選項(xiàng)卡對ADC1的DMA請求進(jìn)行設(shè)置,單擊ADD按鍵增加DMA請求,這里可選的只有一個(gè)ADC1

選擇想要使用的DMA Stream,并設(shè)置優(yōu)先級,將DMA請求模式設(shè)置為循環(huán)模式,外設(shè)地址不增加,內(nèi)存地址遞增,數(shù)據(jù)寬度選擇字Word

為何如此配置?

請閱讀本實(shí)驗(yàn)“3.0、前提知識(shí)”

如下圖所示為ADC1的DMA請求具體設(shè)置

3.1.3、外設(shè)中斷配置

在Pinout & Configuration頁面左邊System Core/NVIC中勾選DMA2 Stream0 全局中斷,然后選擇合適的中斷優(yōu)先級即可

注意這里沒有勾選ADC1/2/3的全局中斷,因?yàn)橥庠O(shè)DMA中斷使用的回調(diào)函數(shù)和外設(shè)本身中斷的回調(diào)函數(shù)一般是同一個(gè)回調(diào)函數(shù)(為什么?請閱讀本實(shí)驗(yàn)3.2.2小節(jié)),如果同時(shí)開始兩者中斷可能會(huì)導(dǎo)致重復(fù)進(jìn)入中斷函數(shù)

但是有些外設(shè)使用DMA時(shí)必須開啟自身的中斷,不同外設(shè)情況不一樣

建議在外設(shè)使用DMA時(shí),盡量不開啟外設(shè)全局中斷,必須開啟的可以禁用外設(shè)主要事件源產(chǎn)生的硬件中斷 (注釋1)

上述步驟如下圖所示

3.2、生成代碼

3.2.0、配置Project Manager頁面

單擊進(jìn)入Project Manager頁面,在左邊Project分欄中修改工程名稱、工程目錄和工具鏈,然后在Code Generator中勾選“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后單擊頁面右上角GENERATE CODE生成工程,具體如下圖所示

詳細(xì)Project Manager配置內(nèi)容讀者可以閱讀“STM32CubeMX教程1 工程建立”實(shí)驗(yàn)3.4.3小節(jié)

3.2.1、外設(shè)初始化調(diào)用流程

首先在生成的工程主函數(shù)main()中調(diào)用MX_DMA_Init()函數(shù)對ADC1用到的DMA時(shí)鐘及其流的中斷進(jìn)行了配置

然后調(diào)用MX_ADC1_Init()函數(shù)對ADC1的基本參數(shù)、通道和通道參數(shù)進(jìn)行了配置,并調(diào)用了HAL_ADC_Init()使用配置的參數(shù)初始化了ADC1

在初始化函數(shù)HAL_ADC_Init()中又調(diào)用了HAL_ADC_MspInit()函數(shù),在該函數(shù)中使能了ADC1/GPIOA的時(shí)鐘,對ADC1_IN5/6/7的輸入引腳做了復(fù)用設(shè)置,然后對ADC1的DMA參數(shù)配置并進(jìn)行了初始化,最后調(diào)用了__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1)將adc1外設(shè)與DMA流對象關(guān)聯(lián)

具體的ADC DMA初始化調(diào)用流程如下圖所示

3.2.2、外設(shè)中斷調(diào)用流程

CubeMX中勾選DMA2_Stream0的全局中斷后,會(huì)在stm32f4xx_it.c中增加DMA的中斷服務(wù)函數(shù)DMA2_Stream0_IRQHandler()

在中斷服務(wù)函數(shù)DMA2_Stream0_IRQHandler()中調(diào)用了HAL庫的DMA全局中斷處理函數(shù),該函數(shù)中根據(jù)各種標(biāo)志判斷DMA傳輸完成/失敗/一半完成等事件,然后根據(jù)不同的事件調(diào)用不同的回調(diào)函數(shù),這里DMA傳輸完成之后調(diào)用了hdma->->XferCpltCal1back()

上述過程如下圖所示

這個(gè)函數(shù)指針在以DMA方式啟動(dòng)ADC采集時(shí)被指向DMA傳輸完成回調(diào)ADC_DMAConvCplt()函數(shù)

在該DMA傳輸完成回調(diào)ADC_DMAConvCplt()函數(shù)中最終調(diào)用了ADC采集完成回調(diào)HAL_ADC_ConvCpltCallback()函數(shù),該函數(shù)上一個(gè)實(shí)驗(yàn)我們重新實(shí)現(xiàn)過

上述過程如下圖所示

之前所有的外設(shè)回調(diào)函數(shù)都是直接調(diào)用了HAL庫提前準(zhǔn)備好的虛函數(shù),比如ADC的采集完成回調(diào)函數(shù)HAL_ADC_ConvCpltCallback(),用戶直接實(shí)現(xiàn)該虛函數(shù)即可

但是DMA不是一個(gè)外設(shè),而是數(shù)據(jù)傳輸手段,大多數(shù)外設(shè)都可以使用,因此DMA的各種事件回調(diào)函數(shù)不是一個(gè)真正的函數(shù),而是一個(gè)函數(shù)指針

當(dāng)我們以DMA傳輸?shù)姆绞絾?dòng)某個(gè)外設(shè)的時(shí)候,就會(huì)將該外設(shè)對應(yīng)事件的中斷服務(wù)函數(shù)地址賦值給對應(yīng)事件DMA中斷回調(diào)函數(shù)指針

3.2.3、添加其他必要代碼

在主函數(shù)中以DMA的方式啟動(dòng)ADC采集傳輸,然后啟動(dòng)ADC1的觸發(fā)源TIM3定時(shí)器,具體代碼如下圖所示

在adc.c中重新實(shí)現(xiàn)DMA傳輸完成回調(diào)函數(shù),在該函數(shù)中取出ADC轉(zhuǎn)換完成的三通道采集值,然后處理并通過串口輸出,具體代碼如下圖所示

一些定義及函數(shù)源代碼如下

/*main.c中的全局變量定義*/
uint32_t DataBuffer[BATCH_DATA_LEN];

/*main.h中的變量外擴(kuò)及宏定義*/
#define BATCH_DATA_LEN 3
extern uint32_t DataBuffer[BATCH_DATA_LEN];

/*DMA轉(zhuǎn)換完成中斷回調(diào)*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    /*定時(shí)器DMA啟動(dòng)多通道轉(zhuǎn)換*/
    uint32_t val=0,Volt=0;
    for(uint8_t i=0;i<BATCH_DATA_LEN;i++)
    {
        val=DataBuffer[i];
        Volt=(3300*val)>>12;
        printf("ADC_IN%d, val:%d, Volt:%d\r\n",i+5,val,Volt);
    }
    printf("\r\n");
}

4、常用函數(shù)

/*以DMA方式啟動(dòng)ADC采集*/
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)

/*結(jié)束以DMA方式啟動(dòng)的ADC采集*/
HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc)

5、燒錄驗(yàn)證

燒錄程序,單片機(jī)上電之后,串口不斷的輸出三個(gè)通道的ADC采集值,筆者將三個(gè)滑動(dòng)變阻器按照通道5、通道6和通道7的順序,分別從一端緩慢擰到另一端,可以從串口輸出的數(shù)據(jù)看到,通道5/6/7三個(gè)通道采集到的ADC數(shù)據(jù)從最大4095慢慢變到最小值0

6、注釋詳解

注釋1:詳細(xì)內(nèi)容請閱讀STM32Cube高效開發(fā)教程(基礎(chǔ)篇)14.5.1小節(jié)內(nèi)容

更多內(nèi)容請瀏覽 STM32CubeMX+STM32F4系列教程文章匯總貼

總結(jié)

以上是生活随笔為你收集整理的STM32CubeMX教程14 ADC - 多通道DMA转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。