概述
直接存儲器訪問(DMA)用于在外設與存儲器之間以及存儲器與存儲器之間提供高速數據傳輸。可以在無需任何CPU操作的情況下通過DMA快速傳輸傳輸。這樣節省的CPU資源可供其它操作使用。
DMA允許在后臺執行數據傳輸,無需Cortex-MO處理器干預。在此操作過程中,主處理器可以執行其它任務,僅當整個數據塊需要處理時,才會中斷主處理器。這樣即使傳輸大量數據也不會對系統性能造成太大影響。
DMA主要用于為不同的外設模塊實現集中數據緩沖存儲(通常在系統SRAM中)。與分布式解決方案(其中每個外設都需要實現自己的本地數據存儲)相比,DMA解決方案在硅片成本和功耗方面的成本較低。
根據使用的產品型號的不同,有一個或兩個DMA模塊。
STM32F0XX DMA控制器總共有5個通道用于DMA1,每個通道都專門管理來自一個或多個外設的存儲器訪問請求。它具有一個仲裁器,用于處理不同的DMA請求的優先級。
本篇文章主要介紹如何使用STM32CubeMX實現ADC在DMA下快速采集,并且打印出去。
非DMA接收請查看:https://blog.csdn.net/qq_24312945/article/details/109685401
硬件準備
首先需要準備一個開發板,這里我準備的是NUCLEO-F030R8的開發板:
選擇芯片型號
使用STM32CUBEMX選擇芯片stm32f030r8,如下所示:
配置時鐘源
HSE與LSE分別為外部高速時鐘和低速時鐘,在本文中使用內置的時鐘源,故都選擇Disable選項,如下所示:
在這里插入圖片描述
配置時鐘樹
STM32F0的最高主頻到48M,所以配置48即可:
插入圖片描述
串口配置
本次實驗使用的串口1進行串口通信,波特率配置為115200。
ADC配置
STM32f030中,有一個ADC(模擬/數字轉換器),每個 ADC 有 12 位、 10 位、 8 位和 6 位可選,每個ADC有16個外部通道、2個內部通道和一個VBAT 通道的信號。
本文將開ADC的IN0、IN1、IN4一共三個通道,來分別讀取ADC,由于串口2和IN2,IN3復用,故不使用IN2、IN3。配置如下:
開啟DMA:
打開中斷:
生成工程設置
最后設置生成獨立的初始化文件:
生成代碼
配置keil
代碼
在main.c中,添加頭文件,若不添加會出現 identifier "FILE" is undefined報錯。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
函數聲明和串口重定向:
/* USER CODE BEGIN PFP */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
變量定義:
/* USER CODE BEGIN 1 */
uint32_t ADC_1, ADC_2,ADC_3;
//各采樣30次,故30*3為90
uint32_t ADC_Value[90];
uint8_t i;
/* USER CODE END 1 */
使用DMA傳輸:
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc,(uint32_t*)&ADC_Value,90); //使用DMA傳輸
/* USER CODE END 2 */
主循環:
/* USER CODE BEGIN WHILE */
while (1)
{
//放個延遲,防止程序運行第一次讀出數據有誤
HAL_Delay(100);
ADC_1=0;
ADC_2=0;
ADC_3=0;
for(i=0,ADC_1=0,ADC_2=0;i<90;)
{
ADC_1+=ADC_Value[i++];
ADC_2+=ADC_Value[i++];
ADC_3+=ADC_Value[i++];
}
printf("ADC數據如下
");
//除以30為求30次平均ADC值,乘以3.3為以3.3電壓為基準,除以4096為ADC配置為12位
printf("ADC_IN0=%1.4f
",ADC_1/30*3.3f/4096);
printf("ADC_IN1=%1.4f
",ADC_2/30*3.3f/4096);
printf("ADC_IN2=%1.4f
",ADC_3/30*3.3f/4096);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(900);
}
/* USER CODE END 3 */
演示效果
設定adc1口接3.3V,adc2口接GND,adc口接1.5V,輸出如下。
審核編輯:湯梓紅
-
adc
+關注
關注
99文章
6537瀏覽量
545896 -
USART
+關注
關注
1文章
195瀏覽量
30996 -
stm32cubemx
+關注
關注
5文章
284瀏覽量
15052
發布評論請先 登錄
相關推薦
STM32CUBEMX開發GD32F303(9)----USART通過DMA收發
![<b class='flag-5'>STM32CUBEMX</b>開發GD32F303(9)----<b class='flag-5'>USART</b><b class='flag-5'>通過</b><b class='flag-5'>DMA</b>收發](https://file.elecfans.com/web2/M00/7E/46/poYBAGOEerqAe0LjAADILAsHIgY275.png)
STM32CUBEMX(2)--USART通過DMA方式接收不定長數據
STM32CUBEMX(3)--ADC通過DMA方式采樣,USART打印
轉:使用STM32CubeMX生成用于STM32-V5開發板的USART工程DMA方式
通過CubeMx實現ADC多通道掃描采集DMA方式
STM32CUBEMX配置教程(十二)STM32的定時器觸發的固定頻率ADC采樣(使用DMA)
![<b class='flag-5'>STM32CUBEMX</b>配置教程(十二)<b class='flag-5'>STM32</b>的定時器觸發的固定頻率<b class='flag-5'>ADC</b><b class='flag-5'>采樣</b>(使用<b class='flag-5'>DMA</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CUBEMX配置教程(十三)STM32的定時器觸發的固定頻率DAC輸出(使用DMA)
![<b class='flag-5'>STM32CUBEMX</b>配置教程(十三)<b class='flag-5'>STM32</b>的定時器觸發的固定頻率DAC輸出(使用<b class='flag-5'>DMA</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
stm32CubeMx ADC多通道掃描模式DMA + 采集STM32內部溫度傳感器的值
![<b class='flag-5'>stm32CubeMx</b> <b class='flag-5'>ADC</b>多通道掃描模式<b class='flag-5'>DMA</b> + 采集<b class='flag-5'>STM32</b>內部溫度傳感器的值](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeMX實現串口通信(中斷方式)
![<b class='flag-5'>STM32CubeMX</b>實現串口通信(中斷<b class='flag-5'>方式</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeMX與HAL庫學習--ADC與USART的簡單練習
![<b class='flag-5'>STM32CubeMX</b>與HAL庫學習--<b class='flag-5'>ADC</b>與<b class='flag-5'>USART</b>的簡單練習](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論