1、前言
某客戶發(fā)現(xiàn)修改代碼后,STM32U59 SPI DMA 發(fā)送未產(chǎn)生傳輸完成中斷,但修改的代碼跟 SPI 以及 DMA 毫無(wú)關(guān)聯(lián)。
2、調(diào)研
回退代碼修改后問(wèn)題消失,可以確認(rèn)硬件正常。檢查 SPI 發(fā)送對(duì)應(yīng)的 DMA 句柄的ErrorCode,發(fā)現(xiàn) HAL_DMA_ERROR_DTE(Date Transfer Error)置位。嘗試修改軟件,發(fā)現(xiàn)調(diào)整下某個(gè)全局變量初值,或屏蔽某些變量,都能解決問(wèn)題。
為屏蔽 RTOS 及應(yīng)用代碼可能帶來(lái)的影響,調(diào)整客戶 SPI 和 DMA 初始化代碼位置到緊跟 MCU 復(fù)位后配置時(shí)鐘,初始化全局變量,并在初始化完成后立即發(fā)送一包數(shù)據(jù),測(cè)試下來(lái)問(wèn)題仍存在,說(shuō)明問(wèn)題和后續(xù) RTOS 及應(yīng)用代碼代碼無(wú)關(guān)。
為澄清全局變量初始化對(duì) SPI 和 DMA 的影響,在全局變量初始化完成、初始化 SPI和 DMA 前、后,分別檢查 RCC、SPI 和 DMA 寄存器,和正常時(shí)對(duì)比無(wú)差異。
3、分析
客戶使用的是 GPDMA 的 Linked List 模式,此模式下 DMA 傳輸相關(guān)的 8 個(gè)寄存器不通過(guò)軟件直接設(shè)置,而是需要軟件把待設(shè)定的寄存器參數(shù)先放入緩沖區(qū),再將緩沖區(qū)地址賦到 DMA 寄存器 CxLBAR(高 16 位)和 CxLLR(低 16 位),使能 DMA 時(shí)硬件自動(dòng)將這些參數(shù)加載到 DMA 通道對(duì)應(yīng)的寄存器中。
跟蹤代碼執(zhí)行,在 DMA 使能前,查看參數(shù)緩沖區(qū)(地址:0x2001 FFF0)。確認(rèn)DMA 參數(shù)緩沖區(qū)中源地址寄存器參數(shù) 0x200 e0618、目標(biāo)地址寄存器參數(shù) 0x4001 3020都是正確的;使能 DMA 后,發(fā)現(xiàn) DMA CxDAR 寄存器數(shù)據(jù)異常 0x1382 932e。


查閱參考手冊(cè),找到其對(duì)對(duì)緩沖區(qū)限制的描述:必須 4 字節(jié)對(duì)齊,且不能跨 64Kbyte邊界;而用戶的緩沖區(qū)地址 0x2001 FFF0(32 字節(jié))剛好跨了 64Kbyte 邊界。鏈接器分配的地址范圍是 0x2001 FFF0 ~ 0x2002 0010,而 GPDMA 實(shí)際訪問(wèn)的數(shù)據(jù)區(qū)間是0x2001 FFF0 ~ 0x2001 FFFF 和 0x20010000 ~ 0x2001000F,把 2001 0000 對(duì)應(yīng)的數(shù)據(jù)加載到了 DAR 中,隨即引發(fā)了 DTE 錯(cuò)誤。

4、處理
處由于增減全局變量、修改變量初值為零或非零,都會(huì)影響最終鏈接結(jié)果,故通過(guò)設(shè)置預(yù)編譯選項(xiàng)對(duì)所有 DMA 鏈表數(shù)據(jù)結(jié)構(gòu)變量的地址作出限制,來(lái)滿足 4 字節(jié)對(duì)齊且不跨64K Byte 邊界這個(gè)約束條件,再次編譯鏈接后進(jìn)行測(cè)試,SPI DMA 功能恢復(fù)正常。
5、小結(jié)
對(duì)這種看似怪異的問(wèn)題,需要仔細(xì)觀察并記錄整個(gè)數(shù)據(jù)傳輸過(guò)程,各個(gè)關(guān)鍵操作前后相關(guān)寄存器的變化來(lái)獲取第一手資料,對(duì)比正常情況并結(jié)合參考手冊(cè)尋找具體原因。
-
mcu
+關(guān)注
關(guān)注
147文章
18588瀏覽量
385952 -
SPI
+關(guān)注
關(guān)注
17文章
1865瀏覽量
99687 -
中斷
+關(guān)注
關(guān)注
5文章
912瀏覽量
43538 -
dma
+關(guān)注
關(guān)注
3文章
577瀏覽量
105291
原文標(biāo)題:工程師筆記|DMA 不產(chǎn)生傳輸完成中斷
文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
使用dma的方式來(lái)傳輸定時(shí)器輸入捕獲的數(shù)據(jù),是不是每隔100ms會(huì)觸發(fā)dma的傳輸完成中斷?
STM32H743 DMA接收固定長(zhǎng)度數(shù)據(jù)后,并未立即進(jìn)入DMA傳輸完成中斷,為什么?
STM32 的SPI的DMA傳輸問(wèn)題
STM32F4 DMA傳輸完成中斷觸發(fā)條件
HAL庫(kù)SPI DMA的使用問(wèn)題
用DMA傳輸完成中斷用來(lái)配置ADM2483的管腳
STM32 SPI驅(qū)動(dòng)增加信號(hào)量進(jìn)行傳輸完成通知哪位兄弟做過(guò)這樣的嘗試嗎
STM32F407使用系統(tǒng)庫(kù)函數(shù)DMA_GetITStatus獲取中斷狀態(tài)的問(wèn)題
stm32f103使用dma和fpga進(jìn)行spi通信
STM32L431 寄存器配置 USART+DMA發(fā)送+中斷接收
DMA帶中斷的內(nèi)存到內(nèi)存傳輸
stm32 HAL庫(kù)spi接收的同時(shí)為什么有數(shù)據(jù)發(fā)送出去?
STM32 DMA傳輸的問(wèn)題分析

STM32U59 SPI DMA發(fā)送未產(chǎn)生傳輸完成中斷問(wèn)題分析
評(píng)論