在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 UART DMA實(shí)現(xiàn)未知數(shù)據(jù)長度接收

            STM32 UART DMA實(shí)現(xiàn)未知數(shù)據(jù)長度接收

            作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
            串口通信是經(jīng)常使用到的功能,在STM32UART具有DMA功能,并且收發(fā)都可以使用DMA,使用DMA發(fā)送基本上大家不會(huì)遇到什么問題,因?yàn)榘l(fā)送的時(shí)候會(huì)告知DMA發(fā)送的數(shù)據(jù)長度,DMA按照發(fā)送的長度直接發(fā)送就OK了,但是使用DMA接收時(shí)候就不同了,因?yàn)橛袝r(shí)候數(shù)據(jù)接收并不是每一次都是定長的,但是DMA只在接收數(shù)據(jù)長度和設(shè)定數(shù)據(jù)長度相同的時(shí)候才可以觸發(fā)中斷,告訴MCU數(shù)據(jù)接收完畢,針對(duì)這個(gè)問題,解決方法如下,有一點(diǎn)復(fù)雜,但是很管用。

            UART在傳輸一個(gè)字節(jié)的時(shí)候,首先拉低,傳輸起始位,然后在是LSB –MSB,最后是停止位,停止位是高電平

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

            超時(shí)時(shí)間
            搞過串口通信的都知道,如果串口有協(xié)議,一般都是有個(gè)超時(shí)時(shí)間的,超時(shí)時(shí)間是定義兩個(gè)幀之間的間隔的,如果串口接收到一個(gè)字節(jié)后,在規(guī)定的超時(shí)時(shí)間內(nèi)沒有接收到其他數(shù)據(jù),我們則認(rèn)為前面接收的數(shù)據(jù)位一幀。

            定時(shí)器復(fù)位復(fù)位模式
            STM32定時(shí)器功能比較強(qiáng)大,其中有一種模式為復(fù)位模式,TI1的輸入上升沿會(huì)復(fù)位定時(shí)器的計(jì)數(shù)器

            整體的思路是這樣的,一開始設(shè)置好DMA接收,可以把緩沖區(qū)長度設(shè)置為幀最大長度,我們可以把RX連接到定時(shí)器的管腳輸入端,并且一開始設(shè)置輸入并且使能引腳下降沿中斷,當(dāng)幀的第一個(gè)字節(jié)發(fā)送時(shí),因?yàn)槠鹗嘉粸榈碗娖?,空閑時(shí)UART為高電平,滿足條件,進(jìn)入中斷,禁止中斷,并且在中斷中開啟定時(shí)器,該定時(shí)器工作在復(fù)位模式,上升沿復(fù)位,并且設(shè)置好定時(shí)器輸出比較值為超時(shí)時(shí)間,比如20ms,這樣,在傳輸后面字節(jié)時(shí),肯定會(huì)有高低電平出現(xiàn),即便是傳輸?shù)氖?x00,0xFF,雖然UART數(shù)據(jù)區(qū)不變,但是都為1,或都為0,但是因?yàn)槠鹗嘉粸榈碗娖?,停止位是高電平,所以肯定?huì)有上升沿,定時(shí)器會(huì)一直復(fù)位,輸出定時(shí)器的計(jì)數(shù)器一直到達(dá)不了輸出比較值,當(dāng)一幀傳輸結(jié)束后,定時(shí)在最后一個(gè)字節(jié)復(fù)位后,由于沒有數(shù)據(jù)繼續(xù)到達(dá),無法復(fù)位,則計(jì)數(shù)器就能計(jì)到輸出比較值,這時(shí)發(fā)出中斷,在定時(shí)器中斷中可以計(jì)算出接收數(shù)據(jù)的長度,并且通知外部數(shù)據(jù)已經(jīng)接收完畢。

            功能實(shí)現(xiàn)
            實(shí)現(xiàn)的步驟:
            1、硬件連接:UART的RX線在連接外部的同時(shí),還需要連接到一個(gè)定時(shí)器的輸入端TIMx_CHx,定時(shí)器可以為任意定時(shí)器,但是CHx,只能為CH1或CH2

            軟件設(shè)置
            a) IO、中斷設(shè)置:在把UART功能口設(shè)置好后,還需要設(shè)置TIM4_CH2為輸入上拉,并且使能該引腳外部中斷

            把DMA接收的數(shù)據(jù)緩沖區(qū)設(shè)置為你認(rèn)為最大的幀長度,(如果最長不能確定,也可以隨便指定一個(gè)長度,后面再講怎么實(shí)現(xiàn))。
            b) 定時(shí)器設(shè)置
            因?yàn)槭褂玫氖荰IM4_CH2,所以需要配置TIM4,并且配置為復(fù)位模式,把超時(shí)時(shí)間定為20ms,為了方便TIM4時(shí)鐘定輸入為1KHZ

            工作過程如下
            在串口傳輸起始位的時(shí)候,首先產(chǎn)生外部中斷,在外部中斷中開啟定時(shí)器,禁止外部中斷,只要串口上一直有數(shù)據(jù),定時(shí)器肯定會(huì)不停的復(fù)位,到達(dá)不了定時(shí)時(shí)間,當(dāng)串口上沒有數(shù)據(jù)的時(shí)候,到超時(shí)時(shí)間后,定時(shí)器產(chǎn)生中斷,此時(shí)可以讀出接收的數(shù)據(jù)長度,然后開啟外部中斷,進(jìn)入下一個(gè)周期。

            總結(jié):本方法的缺點(diǎn)是程序開始的初始化麻煩些,但是優(yōu)點(diǎn)是非常明顯的,徹底解放了CPU,這樣在計(jì)算串口超時(shí)的時(shí)候,就不需要定時(shí)器不停的中斷,并且串口接收數(shù)據(jù)使用DMA方式,也不需要CPU參與,只是在接收結(jié)束的時(shí)候通知CPU取數(shù)據(jù),CPU的利用率會(huì)更高。



            評(píng)論


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

            關(guān)閉