基於stm32F407ZGT6的三重ADC交替採樣+DMA傳輸數據+定時器TRGO觸發

来源:https://www.cnblogs.com/Edwardssss/archive/2022/08/02/16485125.html
-Advertisement-
Play Games

好久沒寫博客了,最近挺忙的。近來有些好玩的實現,網上的資料並不是非常詳細,打算慢慢寫下來,希望別人能少走一點彎路。 因為希望提高ADC的採樣率,這次我試著實現了一下三重ADC交替採樣+DMA搬運至記憶體+TIM的TRGO觸發採樣(環境是stm32cubemx 6.5.0和keil 5) 首先打開cub ...


好久沒寫博客了,最近挺忙的。近來有些好玩的實現,網上的資料並不是非常詳細,打算慢慢寫下來,希望別人能少走一點彎路。 因為希望提高ADC的採樣率,這次我試著實現了一下三重ADC交替採樣+DMA搬運至記憶體+TIM的TRGO觸發採樣(環境是stm32cubemx 6.5.0和keil 5) 

首先打開cubemx進行基礎設置(設置時鐘樹,RCC,SYS)

然後設置ADC1(下圖為具體設置,僅供參考)

此處我們將ADC_Mode設置為Triple regular simultaneous mode only,並打開DMA連續請求(為了使DMA能夠填滿數組,按照我們的預期工作)

外部觸發源設置為TIM2的TRGO

由於已經設置了ADC模式,ADC2和ADC3是跟隨ADC1的,所以他們的模式是不能改變的,和ADC1一樣設置就可以了

接下來我們設置DMA,記住要設置成circular模式,不然他就只會傳輸一次,選擇一次傳輸Half Word,從外設搬運到記憶體

主要的設置就這些,串口的初始化已經省略了,後面我們將用串口重定向列印數據至串口(詳見我之前的博客串口重定向發送和接收

現在我們只需要生成代碼,打開工程

這裡有個小細節:DMA和ADC的初始化順序不能錯了,要先初始化DMA再初始化ADC(其實用到DMA傳輸數據的外設都要在DMA初始化之後再進行初始化,因為不先初始化DMA的話,在初始化其他外設時,當配置到DMA相關的設置時會出現錯亂,導致外設無法正常工作,比如ADC就會傳輸數據失敗,但是DMA一直是處於busy狀態)

下麵我們進行垃圾核心代碼的編寫

我的初始化順序(僅供參考)

1 MX_GPIO_Init();
2 MX_DMA_Init();
3 MX_ADC1_Init();
4 MX_ADC2_Init();
5 MX_ADC3_Init();
6 MX_DAC_Init();
7 MX_TIM2_Init();
8 MX_USART1_UART_Init();

主函數當中編寫的代碼如下:

1 HAL_ADC_Start(&hadc1);
2 HAL_ADC_Start(&hadc2);
3 HAL_ADC_Start(&hadc3);//啟動ADC
4 HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)ADC_value,3000);
5 HAL_TIM_Base_Start(&htim2);//啟動TIM2,用於觸發ADC採樣

對於數據的處理,我更傾向於寫在回調函數裡面

1 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
2 {
3   int i;
4   for(i = 0;i < 1000;i++)
5   {
6     printf("%f,%f,%f\n",ADC_value[3 * i] * 3 / 4096.0,ADC_value[3 * i + 1] * 3 / 4096.0,ADC_value[3 * i + 2] * 3 / 4096.0);
7   }
8   return;
9 }

我們再編譯,燒錄程式。 至此,我們就可以實現ADC三重交替採樣了

 /*------------------------------------------------------------------------分割線------------------------------------------------------------------------*/

我思來想去感覺還是在回調函數裡面改變一個標誌位就可以了,把這麼一大段處理放進去不太好,容易出現中斷嵌套等我們不希望出現的現象

儘量把處理的步驟寫到函數裡面去執行,只需通過判斷標誌位即可達到同等效果


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 接著上周寫的截圖控制項繼續更新 繪製箭頭。 1.WPF實現截屏「仿微信」 2.WPF 實現截屏控制項之移動(二)「仿微信」 3.WPF 截圖控制項之伸縮(三) 「仿微信」 4.WPF 截圖控制項之繪製方框與橢圓(四) 「仿微信」 正文 一、首先接著ScreenCut繼續發電。 1)繪製箭頭因為需要只修 ...
  • 此案例基於拖曳和彈動球兩個技術功能實現,如有不懂的可以參考之前的相關文章,屬於遞進式教程。 五環彈動球 好吧,名字是我起的,其實,你可以任意個球進行聯動彈動,效果還是很不錯的,有很多前端都是基於這個特效,可以搞出一些很有科技感的效果出來。 Wpf 和 SkiaSharp 新建一個WPF項目,然後,N ...
  • lamp 1. lamp簡介 lamp,其實就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一組動態網站或者伺服器的開源軟體 LAMP指的是Linux(操作系統)、Apache(HTTP伺服器)、MySQL(也指MariaDB,資料庫軟體)和PHP(有時也 ...
  • 搭建lamp架構 1.LAMP架構介紹 所謂lamp,其實就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一組動態網站或者伺服器的開源軟體,除Linux外其它各部件本身都是各自獨立的程式,但是因為經常被放在一起使用,擁有了越來越高的相容度,共同組成了一個強 ...
  • Preparation debian11幾乎可以使用任何舊的電腦硬體,因為最小安裝的要求非常低。以下是最低要求和推薦要求: | 最低要求 | 推薦要求 | | | | | 存儲:10 Gigabytes記憶體:512 MegabytesCPU: 1 GigaHertz | 存儲:10 Gigabyt ...
  • 今天我們來瞭解有關Secret加密以及Configmapd配置介紹 一、Configmapd配置介紹 ConfigMap 功能在 Kubernetes1.2 版本中引入,許多應用程式會從配置文件、命令行參數或環境變數中讀取配置信息。ConfigMap API 給我們提供了向容器中註入配置信息的機制,... ...
  • 交叉編譯 交叉編譯是在一個平臺上生成另一個平臺上的可執行代碼。 同一個體繫結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體繫結構上運行。 通常是自己的電腦寫好代碼編譯之後發到嵌入式設備或者盒子之類的去執行,或者另一個版本系統沒有的東西,例如opencv,從有的系統版本編譯到沒有的系統 ...
  • Mac圖片無損放大軟體哪款好用?Topaz Gigapixel AI for Mac是Mac平臺上一款圖片無損放大軟體,使用AI人工智慧來擴展圖像。topaz gigapixel AI為用戶提供無損放大的圖像,同時還增加了自然細節損失處理,可以放大和填充圖像調整產品,而不使圖片失真! 詳情:Topa ...
一周排行
    -Advertisement-
    Play Games
  • 使用原因: 在我們服務端調用第三方介面時,如:支付寶,微信支付,我們服務端需要模擬http請求並加上一些自己的邏輯響應給前端最終達到我們想要的效果 1.使用WebClient 引用命名空間 using System.Net; using System.Collections.Specialized; ...
  • WPF 實現帶蒙版的 MessageBox 消息提示框 WPF 實現帶蒙版的 MessageBox 消息提示框 作者:WPFDevelopersOrg 原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal 框架使用大於等於.N ...
  • 一、JSON(JavaScript Object Notation)的簡介: ① JSON和XML類似,主要用於存儲和傳輸文本信息,但是和XML相比,JSON更小、更快、更易解析、更易編寫與閱讀。 ② C、Python、C++、Java、PHP、Go等編程語言都支持JSON。 二、JSON語法規則: ...
  • 1.避免Scoped模式註冊的服務變成Singleton模式 當提供一個生命周期模式為Singleton的服務實例時,如果發現該服務中還依賴生命周期模式為Scoped的服務實例(Scoped服務實例將被一個Singleton服務實例所引用),那麼這個被依賴的Scoped服務實例最終會成為一個Sing ...
  • 索引時資料庫提高數據查詢處理性能的一個非常關鍵的技術,索引的使用可以對性能產生上百倍甚至上千倍的影響。接下來,會介紹索引的基本原理、概念,並深入學習資料庫中所使用的索引結構和存儲方式,以及如何管理、維護索引等。 1.索引的基本概念 索引時用來快速查詢表記錄的一種存儲結構,一般使用索引有一下兩個方面: ...
  • django2 路由控制器 Route路由,是一種映射關係。路由是把客戶端請求的url路徑和用戶請求的應用程式,這裡意指django裡面的視圖進行綁定映射的一種關係。 請求路徑和視圖函數不是一一對應的關係 在django中所有的路由最終都被保存到一個叫urlpatterns的文件里,並且該文件必須在 ...
  • 1、我們的目標是獲取微博某博主的全部圖片、視頻 2、拿到網址後 我們先觀察 打開F12 隨著下滑我們發現載入出來了一個叫mymblog的東西,展開響應發現需要的東西就在裡面 3、重點來了!!! 通過觀察發現第二頁比第一頁多了參數since_id 而第二頁的since_id參數剛好在上一頁中能獲取到, ...
  • 一、實現原理 在Servlet3協議規範中,包含在JAR文件/META-INFO/resources/路徑下的資源可以直接訪問。 二、舉例說明 如下圖所示,是我新建的一個Spring Boot Starter項目:zimug-minitor-threadpool,用於實現可配置、可觀測的線程池。其中 ...
  • 精華筆記: static final常量:應用率高 必須聲明同時初始化 由類名打點來訪問,不能被改變 建議:常量所有字母都大寫,多個單詞用_分隔 編譯器在編譯時會將常量直接替換為具體的數,效率高 何時用:數據永遠不變,並且經常使用 抽象方法: 由abstract修飾 只有方法的定義,沒有具體的實現( ...
  • Python有一個for...else語法,它的寫法如下 for i in range(0,100): if i == 3: break else: print("Not found") 該語句表示:若for迴圈遍歷完畢,則執行else部分的語句。也就是說上述代碼不會有任何輸出,而下述代碼會輸出“N ...