我們在做SPI應用時,有時希望通過定時器定時地觸發SPI的收發,并利用DMA完成數據的傳輸。這里,我基于STM32L476芯片來做個演示,以供參考【為什么選用32L476,其實沒啥特別原因,只是順手找了塊Nucleo板】。
本示例的大致過程是這樣的:
片內SPI1做Master,SPI2做Slave,均工作在全雙工模式。
這里使用片內定時器TIM3,借助它的更新事件觸發DMA請求,通過DMA將數據給到SPI1的數據寄存器并發送出去,同時也開啟SPI1接收事件的DMA傳輸。SPI2的收、發事件都啟用DMA傳輸來實現數據收發操作。
TIM3的更新時間控制兩個SPI的收發節奏,即定時器每產生一次更新事件,SPI1/SPI2這兩個主從通信模塊就進行一個數據的收發。我們可以通過調整定時器的計時周期來調整數據收發的快慢節奏。
好,先基于STM32CubeMx進行初始化配置。
1、對TIM3做基本配置。選擇時鐘源,先大致估算個定時器計時周期,調試時我們可以自行靈活調整。
開啟基于TIM3更新事件的DMA配置。傳輸方向是從Memory到外設SPI1,即將內存數據傳輸到SPI1的數據寄存器進行數據發送,這里選用循環模式。
2、對SPI1/SPI2進行基本配置。細節請參看下面三幅截圖。
3、DMA的配置情況。
在TIM3和SPI1/SPI2外設配置中,開啟了相關事件的DMA請求,匯總如下圖。
4、準備用戶代碼。
當完成基于STM32CubeMx的初始化配置并生產初始化代碼后,我們準備相應的用戶代碼。
這里準備了4個內存數組,分別存放SPI1/SPI2的收發數據。
在定時器的觸發下,主SPI1逐字的向從SPI2發送“Hello! I AM STM32!”,從SPI2也逐字的向主SPI1回應“HI,MASTER,ME TOO!”,就這樣循環操作。
下面兩幅圖是本示例中使用到的用戶代碼截圖,是基于STM32Cube固件庫而編寫的。應該說簡單明了,無須多做解釋。
5、結果驗證。
下面的截圖是兩個不同時刻SPI通信時的信號時序波形圖。其中,紫色的是時鐘信號,綠色、黃色是數據信號。兩個數據信號間的間隔由定時器的更新周期決定。
下面的截圖是在調試狀態下的通過觀察窗口得到的SPI1/SPI2分別從對方收到的內容。
最后小結下。整體上講上述應用的實現不難,稍微有點綜合性。
要實現上述應用,首先要求我們對DMA傳輸的原理有清晰的了解,觸發事件,傳輸源、傳輸目標幾個概念及關系要弄清楚。另外,即使我們基于STM32固件庫開發,不一定能找到完完整整的現存代碼,我們可能需要基于現有驅動代碼自行組織用戶程序。還有,在上面示例代碼中,我沒有開啟DMA的中斷事件,我們在具體應用中可以根據情況來決定是否啟用DMA中斷,比方開啟傳輸完成中斷等。順便提醒下,這里我們基于定時器事件自行指定DMA的源端和目的端,?一定要保證是該觸發事件所請求的DMA可以到達的地方,編程設計前最好查看下相關芯片數據手冊里的芯片模塊及總線框架圖。
-
芯片
+關注
關注
456文章
51155瀏覽量
426434 -
STM32
+關注
關注
2271文章
10923瀏覽量
357162 -
定時器
+關注
關注
23文章
3255瀏覽量
115203
原文標題:STM32定時器觸發SPI逐字收發之應用示例
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論