2
由於某些設計要求,我需要在運行時更改DMA描述符。爲了實現這一點,我按照以下步驟操作:Atmel SAMD21 DMA中止問題
- 中止DMA通道。然後DMA硬件將保存當前執行的描述符 write_back相同DMA通道的RAM位置。
- 等到中止完成
- 修改write_back RAM位置上的DMA描述符。
- 再次啓用
DMA通道這是代碼片段我使用:
//Select DMA channel
DMAC->CHID.reg = DMAC_CHID_ID(cSPIDMAResource0.channel_id);
//Abort Selected DMA channel
DMAC->CHCTRLA.reg &= ~DMA_CHANNEL_ENABLE_BIT_POS;
//Wait until Abort completed
while((DMAC->CHCTRLA.reg & DMA_CHANNEL_ENABLE_BIT_POS) == DMA_CHANNEL_ENABLE_BIT_POS);
/*
Modify Descriptor here
*/
//Enable DMA channel
DMAC->CHCTRLA.reg |= DMA_CHANNEL_ENABLE_BIT_POS;
上述步驟工作正常,沒有任何問題,但我長期運行過程中面臨的描述腐敗問題。
當執行DMA中止時,DMA硬件正在執行的描述符存儲在另一個DMA通道的write_back RAM位置(而不是自己的write_back RAM位置)。
如果有人對任何問題有任何想法,或者對我如何完全避免描述符腐敗問題有所瞭解,我想嘗試一下。
我也嘗試禁用DMAC寄存器訪問過程中的中斷,但它沒有解決問題 – GOKU