STM32 DMA正常模式等待傳輸完成和開始下一次傳輸
選擇DMA的正常模式,即DMA只傳輸一次。如果當傳輸完一次后,還想再傳輸一次,就需要重啟DMA:
DMA_Cmd(DMA1_Channel6,DISABLE);
重新設(shè)置源地址
重新設(shè)置目的地址
重設(shè)傳輸數(shù)量
DMA_Cmd(DMA1_Channel6,ENABLE);
因此建議把DMA_InitStructure定義為全局變量,然后可以使用下面語句來重啟DMA:
DMA_Cmd (DMA1_Channel4,DISABLE);
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_Cmd (DMA1_Channel4,ENABLE);
剛發(fā)現(xiàn)只需要重新設(shè)置傳輸數(shù)據(jù)長度就可以了:
DMA_Cmd(DMA1_Channel5,DISABLE);
//設(shè)置傳輸數(shù)據(jù)長度
DMA_SetCurrDataCounter(DMA1_Channel5,DMA_Rec_Len);
DMA_Cmd(DMA1_Channel5,ENABLE);
在DMA傳輸過程中,有幾個標志位可以用來判斷DMA狀態(tài):
DMA1_FLAG_GL4: DMA1 Channel4 global flag. 全局標志
DMA1_FLAG_TC4: DMA1 Channel4 transfer complete flag. 傳輸完成標志
DMA1_FLAG_HT4: DMA1 Channel4 half transfer flag. 傳輸一般標志
DMA1_FLAG_TE4: DMA1 Channel4 transfer error flag. 傳輸錯誤標志
可以用下面語句來等待DMA傳輸完成:
while(! DMA_GetFlagStatus(DMA1_FLAG_TC4));
DMA_ClearFlag(DMA1_FLAG_TC4);
如果在正常模式下,數(shù)據(jù)沒有傳輸完,就可以下一次傳輸,數(shù)據(jù)會出錯,所以最后調(diào)用上面語句判斷一下傳輸完成與否。
另外注意這幾個標志位,需要軟件清零。如果不調(diào)用DMA_ClearFlag(DMA1_FLAG_TC4);清除標志位,那么這個標志位就一直是1。