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