我們在做SPI應(yīng)用時,有時希望通過定時器來定時地觸發(fā)SPI的收發(fā),并利用DMA完成數(shù)據(jù)的傳輸。這里,以STM32L476芯片為例來做個演示,以供參考。
本示例的大致過程是這樣的:
片內(nèi)SPI1做Master,SPI2做Slave,均工作在全雙工模式。
這里使用片內(nèi)定時器TIM3,通過它的更新事件觸發(fā)DMA請求,通過DMA將數(shù)據(jù)給到SPI1的數(shù)據(jù)寄存器并發(fā)送出去,同時也開啟SPI1接收事件的DMA傳輸。總之,SPI2的收、發(fā)事件都啟用DMA完成。
TIM3的更新事件周期控制兩個SPI的收發(fā)節(jié)奏,即定時器每產(chǎn)生一次更新事件,SPI1/SPI2這兩個主從通信模塊就進行一個數(shù)據(jù)的收發(fā)。我們可以通過調(diào)整定時器的計時周期來調(diào)整數(shù)據(jù)收發(fā)的快慢。
好,先基于STM32CubeMx進行初始化配置。
1. 對TIM3做基本配置。選擇時鐘源,先大致估算個定時器計時周期,調(diào)試時我們可以自行靈活調(diào)整。
開啟基于TIM3更新事件的DMA配置。傳輸方向是從Memory 到 外設(shè)SPI1,即將內(nèi)存數(shù)據(jù)傳輸?shù)絊PI1的數(shù)據(jù)寄存器進行數(shù)據(jù)發(fā)送,這里選用循環(huán)模式,以便測試。
2. 對SPI1/SPI2進行基本配置。細節(jié)請參看下面三幅截圖。
3、DMA的配置情況。
在TIM3和SPI1/SPI2外設(shè)配置中,開啟了相關(guān)事件的DMA請求,匯總?cè)缦聢D。
4、準(zhǔn)備用戶代碼。
當(dāng)完成基于STM32CubeMx的初始化配置并生產(chǎn)初始化代碼后,我們準(zhǔn)備相應(yīng)的用戶代碼。這里準(zhǔn)備了4個內(nèi)存數(shù)組,分別用于存放SPI1/SPI2的收發(fā)數(shù)據(jù)。
在定時器的觸發(fā)下,Master SPI1逐字的向Slave SPI2發(fā)送“Hello! I AM STM32!”,Slave SPI2也逐字的向Master回應(yīng)“HI,MASTER,ME TOO!”,這樣循環(huán)操作。下面兩幅截圖是本示例中使用到的用戶代碼,是基于STM32Cube固件庫而編寫的。應(yīng)該說簡單明了,無須過多解釋。
5、結(jié)果驗證。
下面的截圖是兩個不同時刻SPI通信時的信號波形圖。其中,紫色的是時鐘信號,綠色、黃色是數(shù)據(jù)信號。兩個數(shù)據(jù)信號間的時間間隔由定時器的更新周期決定。
下面的截圖是在調(diào)試狀態(tài)下的通過觀察窗口得到的SPI1/SPI2分別從對方收到的數(shù)據(jù),即SPI2收到的數(shù)據(jù)是“HELLO,I AM STM32!”,SPI1收到的數(shù)據(jù)則是“HI,MASTER,ME TOO!”
整體上講,上述應(yīng)用的實現(xiàn)不難,可能稍微有點綜合性。
要實現(xiàn)上述應(yīng)用,首先要求我們對DMA傳輸?shù)脑碛星逦牧私猓|發(fā)事件,傳輸源、傳輸目標(biāo)幾個概念及關(guān)系要弄清楚。
另外,即使我們基于STM32固件庫開發(fā),不一定能找到完整的現(xiàn)存例程,我們可能需要基于現(xiàn)有驅(qū)動代碼自行組織用戶程序。
還有,在上面示例代碼中,我沒有開啟DMA的中斷事件,我們在具體應(yīng)用中可以根據(jù)情況來決定是否啟用DMA中斷,比方開啟傳輸完成中斷等。
最后順便提醒下,這里我們基于定時器事件的DMA請求而自行指定DMA的源端和目的端,?一定要保證是該觸發(fā)事件所請求的DMA可以到達的地方。建議編程設(shè)計前最好查看下相關(guān)芯片數(shù)據(jù)手冊里的芯片模塊及總線框架圖,不然的話,有時你可能遇到你指定的DMA根本就不正常運作的情況。
-
STM32
+關(guān)注
關(guān)注
2290文章
11017瀏覽量
362445 -
SPI
+關(guān)注
關(guān)注
17文章
1784瀏覽量
94784 -
定時器
+關(guān)注
關(guān)注
23文章
3288瀏覽量
117248
發(fā)布評論請先 登錄
MCU定時器/計數(shù)器
STM32定時器基本原理及常見問題之培訓(xùn)資料
使用stm32f405做6步pwm輸出時,定時器配置由強制輸出轉(zhuǎn)為pwm,com觸發(fā)后會有延遲生效的現(xiàn)象,怎么解決?
定時器已安排!開發(fā)小白看過來~

SPI數(shù)據(jù)速率影響定時器中斷,問題出在哪里?
定時器的工作方式介紹
與定時器相關(guān)的寄存器有哪些類型
tc397如何使用定時器的更新事件來觸發(fā)dma搬運數(shù)據(jù)?
外接高級定時器1的剎車引腳后,STM32中能不能做濾波?
STM32G4系列芯片定時器的延時輸出問題

使用Arduino的可變定時器繼電器設(shè)計

評論