在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

            問(wèn)題描述:

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

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

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

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

            檢查代碼,發(fā)現(xiàn)沒(méi)問(wèn)題,但是問(wèn)題還是解決不了,就找了英文的參考手冊(cè)(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傳輸成功的條件:

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

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

            一個(gè)詭異的問(wèn)題:

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

            //ENBALE 之前USART1的TC,DMA1 對(duì)應(yīng)USART TX的DMA通道TC標(biāo)志都已經(jīng)置位,沒(méi)有清除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é)論:

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



            關(guān)鍵詞: STM32USARTDMA傳

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉