精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32U59 SPI DMA發(fā)送未產(chǎn)生傳輸完成中斷問題分析

STM32單片機 ? 來源:STM32單片機 ? 作者:STM32單片機 ? 2022-09-01 12:11 ? 次閱讀

1、前言

某客戶發(fā)現(xiàn)修改代碼后,STM32U59 SPI DMA 發(fā)送未產(chǎn)生傳輸完成中斷,但修改的代碼跟 SPI 以及 DMA 毫無關(guān)聯(lián)。

2、調(diào)研

回退代碼修改后問題消失,可以確認(rèn)硬件正常。檢查 SPI 發(fā)送對應(yīng)的 DMA 句柄的ErrorCode,發(fā)現(xiàn) HAL_DMA_ERROR_DTE(Date Transfer Error)置位。嘗試修改軟件,發(fā)現(xiàn)調(diào)整下某個全局變量初值,或屏蔽某些變量,都能解決問題。

為屏蔽 RTOS 及應(yīng)用代碼可能帶來的影響,調(diào)整客戶 SPI 和 DMA 初始化代碼位置到緊跟 MCU 復(fù)位后配置時鐘,初始化全局變量,并在初始化完成后立即發(fā)送一包數(shù)據(jù),測試下來問題仍存在,說明問題和后續(xù) RTOS 及應(yīng)用代碼代碼無關(guān)。

為澄清全局變量初始化對 SPI 和 DMA 的影響,在全局變量初始化完成、初始化 SPI和 DMA 前、后,分別檢查 RCC、SPI 和 DMA 寄存器,和正常時對比無差異。

3、分析

客戶使用的是 GPDMA 的 Linked List 模式,此模式下 DMA 傳輸相關(guān)的 8 個寄存器不通過軟件直接設(shè)置,而是需要軟件把待設(shè)定的寄存器參數(shù)先放入緩沖區(qū),再將緩沖區(qū)地址賦到 DMA 寄存器 CxLBAR(高 16 位)和 CxLLR(低 16 位),使能 DMA 時硬件自動將這些參數(shù)加載到 DMA 通道對應(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。

3d67c0b0-292c-11ed-ba43-dac502259ad0.png

3d8d5064-292c-11ed-ba43-dac502259ad0.png

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

3daecd7a-292c-11ed-ba43-dac502259ad0.png

4、處理

處由于增減全局變量、修改變量初值為零或非零,都會影響最終鏈接結(jié)果,故通過設(shè)置預(yù)編譯選項對所有 DMA 鏈表數(shù)據(jù)結(jié)構(gòu)變量的地址作出限制,來滿足 4 字節(jié)對齊且不跨64K Byte 邊界這個約束條件,再次編譯鏈接后進(jìn)行測試,SPI DMA 功能恢復(fù)正常。

5、小結(jié)

對這種看似怪異的問題,需要仔細(xì)觀察并記錄整個數(shù)據(jù)傳輸過程,各個關(guān)鍵操作前后相關(guān)寄存器的變化來獲取第一手資料,對比正常情況并結(jié)合參考手冊尋找具體原因。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16676

    瀏覽量

    347873
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1669

    瀏覽量

    90756
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    889

    瀏覽量

    41220
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    552

    瀏覽量

    99954

原文標(biāo)題:工程師筆記|DMA 不產(chǎn)生傳輸完成中斷

文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用dma的方式來傳輸定時器輸入捕獲的數(shù)據(jù),是不是每隔100ms會觸發(fā)dma傳輸完成中斷?

    目前使用dma的方式來傳輸定時器輸入捕獲的數(shù)據(jù),內(nèi)存數(shù)據(jù)大小為2,使用normal模式,100ms打開dma模式,請問,這種情況下,是不是每隔100ms會觸發(fā)dma
    發(fā)表于 04-18 07:47

    STM32H743 DMA接收固定長度數(shù)據(jù)后,并未立即進(jìn)入DMA傳輸完成中斷,為什么?

    743 單工只接收SPI做從接收AD7768非標(biāo)準(zhǔn)SPI口數(shù)據(jù)時發(fā)現(xiàn),DMA接收固定長度數(shù)據(jù)后,并未立即進(jìn)入DMA傳輸完成
    發(fā)表于 05-30 08:21

    STM32SPIDMA傳輸問題

    我在做一個實驗,兩片STM32的單片機:其中一個做為SPI主機,只接收,另一個為SPI從機,只發(fā)送。兩個都為DMA
    發(fā)表于 02-10 10:49

    STM32 SPIDMA傳輸多出16個時鐘

    stm32f103開啟SPIDMA傳輸SPI時鐘4.5M,DMA按1B
    發(fā)表于 10-11 08:59

    STM32F4 DMA傳輸完成中斷觸發(fā)條件

    中斷產(chǎn)生有詳細(xì)描述,如下圖。根據(jù)圖知道傳輸完成中斷的發(fā)生條件:1.DMA_SxBDTR計數(shù)器達(dá)到零(正常使用時用的就是這個)2.
    發(fā)表于 07-01 08:50

    HAL庫SPI DMA的使用問題

    *pTxData, uint8_t *pRxData, uint16_t Size);此函數(shù)內(nèi)需要對spi的狀態(tài)量進(jìn)行判斷是否為ready,然后再將狀態(tài)量變成busy,函數(shù)內(nèi)使能了DMA的TC(傳輸完成
    發(fā)表于 04-01 11:47

    DMA傳輸完成中斷用來配置ADM2483的管腳

    用的外設(shè)是PA9 PA10DMA選擇的是DMA2_Channel6代碼中還用了DMA傳輸完成中斷,用來配置ADM2483的管腳。直接上代碼了
    發(fā)表于 08-16 07:00

    STM32 SPI驅(qū)動增加信號量進(jìn)行傳輸完成通知哪位兄弟做過這樣的嘗試嗎

    當(dāng)前的 STM32 SPI 驅(qū)動里,傳輸完數(shù)據(jù)后,會使用 while 進(jìn)行等待傳輸完我修改了一下,給 SPI 增加了一個信號量。使用
    發(fā)表于 11-17 10:17

    STM32F407使用系統(tǒng)庫函數(shù)DMA_GetITStatus獲取中斷狀態(tài)的問題

    程序使用DMA傳輸,需要使用DMA傳輸完成中斷,程序如下:void DMA2_Stream7_I
    發(fā)表于 12-04 17:21 ?7次下載
    <b class='flag-5'>STM32</b>F407使用系統(tǒng)庫函數(shù)<b class='flag-5'>DMA</b>_GetITStatus獲取<b class='flag-5'>中斷</b>狀態(tài)的問題

    stm32f103使用dma和fpga進(jìn)行spi通信

    stm32作為從機,fpga作為主機。進(jìn)行spi通信。stm32使用dma進(jìn)行數(shù)據(jù)接收。在dma中斷
    發(fā)表于 12-22 19:29 ?92次下載
    <b class='flag-5'>stm32</b>f103使用<b class='flag-5'>dma</b>和fpga進(jìn)行<b class='flag-5'>spi</b>通信

    STM32L431 寄存器配置 USART+DMA發(fā)送+中斷接收

    用的外設(shè)是PA9 PA10DMA選擇的是DMA2_Channel6代碼中還用了DMA傳輸完成中斷,用來配置ADM2483的管腳。直接上代碼了
    發(fā)表于 12-24 19:09 ?17次下載
    <b class='flag-5'>STM32</b>L431 寄存器配置 USART+<b class='flag-5'>DMA</b><b class='flag-5'>發(fā)送</b>+<b class='flag-5'>中斷</b>接收

    DMA中斷的內(nèi)存到內(nèi)存傳輸

    .c:處理中斷信息。 DMA_XferCpltCallback:數(shù)據(jù)正確傳輸完成回調(diào)函數(shù)。 DMA_XferErrorC
    發(fā)表于 03-23 15:23 ?2799次閱讀
    <b class='flag-5'>DMA</b>帶<b class='flag-5'>中斷</b>的內(nèi)存到內(nèi)存<b class='flag-5'>傳輸</b>

    DMA產(chǎn)生傳輸完成中斷

    DMA產(chǎn)生傳輸完成中斷
    的頭像 發(fā)表于 10-18 16:44 ?1155次閱讀
    <b class='flag-5'>DMA</b>不<b class='flag-5'>產(chǎn)生</b><b class='flag-5'>傳輸完成</b><b class='flag-5'>中斷</b>

    stm32 HAL庫spi接收的同時為什么有數(shù)據(jù)發(fā)送出去?

    stm32 HAL庫spi接收的同時為什么有數(shù)據(jù)發(fā)送出去? 在STM32 HAL庫中,SPI接口的數(shù)據(jù)收發(fā)是通過
    的頭像 發(fā)表于 10-26 17:42 ?1413次閱讀

    STM32 DMA傳輸的問題分析

    用戶使用STM32G473RET6芯片,開發(fā)環(huán)境STM32CubeMX+Keil(LL庫)。使用DMA1通道1,在半傳輸中斷和完全
    的頭像 發(fā)表于 12-01 09:19 ?2292次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>DMA</b><b class='flag-5'>傳輸</b>的問題<b class='flag-5'>分析</b>