最近有STM32用戶咨詢---如何基于STM32H7系列芯片用EXTI0中斷同步觸發SPI DMA并實現DMA雙緩沖功能。當然,在論壇上也有發布類似咨詢帖。其實,老早之前我算是未雨綢繆地在本公眾號分享了有關使用DMAMUX模塊通過EXTI同步觸發其它DMA請求的文章和關于DMA雙緩沖應用原理介紹與參考實現代碼。
STM32 MCU家族中里很多系列內置DMAMUX模塊,該模塊可以基于某些特定事件,比如某些EXTI事件、定時器觸發輸出、DMA完成事件來生成DMA請求;有了它,DMA請求與DMA通道的關聯可以實時編程,不再事先硬件鎖定DMA請求與DMA響應通道的連接邏輯。我這里不對DMAMUX做詳細介紹,有需要的請閱讀STM32系列手冊的相關章節或他人的相關解讀。
今天重點就咨詢者的問題,基于AMR MDK開發環境、STM32H743Nucleo 開放板做一下實驗演示,供有需要的同仁參考。
現在要實現的大致功能是,EXTI0中斷作為SPI DMA發送的同步事件,SPI DMA接收采用雙緩沖模式,即接收用到2個獨立的緩沖區。我在測試時將SPI的發送、接收腳短接,自發自收并工作在Master全雙工模式?!具@里用到的DMA為通用DMA,既非MDMA也非BDMA。下面兩幅圖是SPI收、發實現的功能框架,具體使用SPI1?!?/p>
我使用到PE0管腳【只要是某個GPIO端口的0號腳即可】,開啟其外部中斷功能。下面都是使用STM32CubeMx圖形化配置工具進行配置。
使用EXTI0作為SPI DMA發送功能的同步事件。即SPI的DMA發送須得到EXTI0事件的觸發方可啟動。每產生1個EXTI0事件就給SPI 申請24個 DMA發送請求,并讓SPI DMA發送工作在循環模式。
同時開啟SPI的DMA接收功能,并使用DMA雙緩沖模式進行接收。
使用CubeMx配置完成后,建立工程?;?a target="_blank">ARM MDK的基本存儲配置截圖如下:
說明下,這里我沒有開啟D-Cache,也沒有使用DMA FIFO。實際應用中自行開啟并做適當配置及處理。關于EXTI0的產生,我剛開始是使用跳線短接地驗證的,但這樣操作很不方便,我后來改為軟件方式觸發EXTI0中斷。最后測試時,我每2秒產生一個EXTI0中斷,進而觸發SPI通信。
每產生1次EXTI0中斷,則SPI使用DMA方式發送24個字節數據。SPI的DMA接收采用雙環沖模式,每次每個緩沖區只接收8個字節數據,然后切換緩沖區?!緦嶋H上我將2個接收緩沖區開辟的空間為10個字節】
我基于STM32HAL庫組織的代碼,核心用戶參考代碼如下:
下面函數代碼截圖是用來更新SPI發送緩沖區內容的,測試中每2秒更新一次。
下面是經過調試后的某一刻的演示結果截圖:
另外,下方還有視頻演示效果,有興趣的可以看看。建議點擊全屏按鈕查看,否則效果可能不太好。整體效果就是定時產生EXTI0中斷,觸發SPI的DMA方式發送,SPI基于DMA雙緩沖模式進行接收,可以看到2個接收緩沖區內容因周期性接收切換操作而變更。
關于咨詢者的功能實現的介紹及演示就到這里。最后特意給些相關提醒,這些提醒跟上面演示同等重要。
1、注意開啟D-Cache時的數據一致性問題;
2、注意通用DMA訪問域的限制問題
3、注意DMAFIFO開啟與不開啟時的差別;
4、注意初始化代碼往往是有順序要求的;
說實在的,本咨詢話題涉及的內容及知識點可能有點多,在此不能一一詳述。本人分享此應用演示的主要目的,是希望給關注本應用話題的人一些實現參考。能實現,可以實現,給遇到相應困難的同仁以信心。
今天的話題就聊到這里,就此打住。下次再聊~!
-
mcu
+關注
關注
146文章
17319瀏覽量
352649 -
SPI
+關注
關注
17文章
1721瀏覽量
92126 -
定時器
+關注
關注
23文章
3255瀏覽量
115371 -
dma
+關注
關注
3文章
566瀏覽量
100958 -
stm32h7
+關注
關注
0文章
37瀏覽量
1753
原文標題:STM32H7 EXTI + SPI +DMA 雙緩沖應用演示
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
STM32H7技術詳解
【STM32H7教程】第21章 STM32H7的NVIC中斷分組和配置(重要)
![【<b class='flag-5'>STM32H7</b>教程】第21章 <b class='flag-5'>STM32H7</b>的NVIC中斷分組和配置(重要)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
"STM32H7學習繼續(STM32H7系列5)第十七章比較實用,以后寫程序的時候會用到"
!["<b class='flag-5'>STM32H7</b>學習繼續(<b class='flag-5'>STM32H7</b>系列5)第十七章比較實用,以后寫程序的時候會用到"](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【STM32H7教程】第8章 STM32H7的終極調試組件Event Recorder
![【<b class='flag-5'>STM32H7</b>教程】第8章 <b class='flag-5'>STM32H7</b>的終極調試組件Event Recorder](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
雙核型號的微控制器STM32H7
AN5361_開始使用基于STM32CubeIDE雙核STM32H7微控制器的項目
![AN5361_開始使用基于<b class='flag-5'>STM32</b>CubeIDE<b class='flag-5'>雙</b>核<b class='flag-5'>STM32H7</b>微控制器的項目](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
AN5361_STM32CubeIDE中基于雙核STM32H7微控制器的項目入門
![AN5361_<b class='flag-5'>STM32</b>CubeIDE中基于<b class='flag-5'>雙</b>核<b class='flag-5'>STM32H7</b>微控制器的項目入門](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論