久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32的USART DMA傳輸(轉(zhuǎn))

STM32的USART DMA傳輸(轉(zhuǎn))

作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏

問題描述:

我有一個需求,AD采得一定數(shù)目的數(shù)據(jù)之后,由串口DMA發(fā)出,由于AD使用雙緩沖,所以每次開始DMA的時候都需要重新設(shè)置開始的內(nèi)存地址以及傳輸?shù)臄?shù)目(這些都是理所當(dāng)然的),但是在開始調(diào)試的時候,遇到了一些問題,問題如下:當(dāng)?shù)谝淮?strong>DMA傳輸完畢,關(guān)閉DMA以設(shè)置內(nèi)存地址等,再開啟DMA,發(fā)現(xiàn)不啟動了。

本文引用地址:http://cqxgywz.com/article/201611/318101.htm

開始是參考了《STM32中文參考手冊REV10》,里面的發(fā)送步驟如下:

1. 在DMA控制寄存器上將USART_DR寄存器地址配置成DMA傳輸?shù)哪康牡刂贰T诿總€TXE事件后,數(shù)據(jù)將被傳送到這個地址。2. 在DMA控制寄存器上將存儲器地址配置成DMA傳輸?shù)脑吹刂贰T诿總€TXE事件后,將從此存儲器區(qū)讀出數(shù)據(jù)并傳送到USART_DR寄存器。3. 在DMA控制寄存器中配置要傳輸?shù)目偟淖止?jié)數(shù)。4. 在DMA寄存器上配置通道優(yōu)先級。5. 根據(jù)應(yīng)用程序的要求,配置在傳輸完成一半還是全部完成時產(chǎn)生DMA中斷。6. 在DMA寄存器上激活該通道。

檢查代碼,發(fā)現(xiàn)沒問題,但是問題還是解決不了,就找了英文的參考手冊(REV14),發(fā)現(xiàn)上面的步驟有了些修改:

1. Write the USART_DR register address in the DMA control register to configure it as thedestination of the transfer. The data will be moved to this address from memory aftereach TXE event.2. Write the memory address in the DMA control register to configure it as the source ofthe transfer. The data will be loaded into the USART_DR register from this memoryarea after each TXE event.3. Configure the total number of bytes to be transferred to the DMA control register.4. Configure the channel priority in the DMA register5. Configure DMA interrupt generation after half/ full transfer as required by theapplication.6. Clear the TC bit in the SR register by writing 0 to it.7. Activate the channel in the DMA register.When the number of data transfers programmed

多了一步,即第6步,清除SR寄存器的TC標(biāo)志位。照做,ok了。

重啟DMA傳輸成功的條件:

后來,又做了其他一些測試,發(fā)現(xiàn)即使不清除TC標(biāo)志位,只要把對應(yīng)DMA通道的TCIF標(biāo)志(傳輸完成標(biāo)志,DMA_ISR寄存器里面)清除,同樣也可以正常重啟傳輸。所以,要重啟傳輸,保證在重新ENABLE DMA之前,滿足以下兩個條件之一即可:

  • DMA_ISR 對應(yīng)的TCIF標(biāo)志清除
  • USART_SR 的TC標(biāo)志位清除

一個詭異的問題:

發(fā)現(xiàn)即使上面提到的兩個條件都不滿足,但是下面的代碼依然可以正常傳輸:

//ENBALE 之前USART1的TC,DMA1 對應(yīng)USART TX的DMA通道TC標(biāo)志都已經(jīng)置位,沒有清除DMA_Cmd(USART1_Tx_DMA_Channel, ENABLE);while((USART1->SR & USART_FLAG_TC) == 0x00);

這樣也可以。但是只要換成:

DMA_Cmd(USART1_Tx_DMA_Channel, ENABLE);/* Wait until USARTy TX DMA1 Channel Transfer Complete */while (DMA_GetFlagStatus(USART1_Tx_DMA_FLAG ) == RESET) {}

就不行了。比較奇怪。

結(jié)論:

不管那些詭異的問題了,以后重啟DMA之前,清除串口的TC或者DMA的TC。不過根據(jù)使用的感覺,清除DMA的TC簡單些。



關(guān)鍵詞: STM32USARTDMA傳

評論


技術(shù)專區(qū)

關(guān)閉