<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          第7課:DMA

          作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
          A用來(lái)連接外部設(shè)備和內(nèi)部設(shè)備之間的數(shù)據(jù)傳輸。有了它就可以繞開(kāi)CPU,直接進(jìn)行數(shù)據(jù)傳輸。但同時(shí)A的傳輸也會(huì)用到數(shù)據(jù)總線。所以它的使用也是有利有弊的。

          A利用了有限狀態(tài)機(jī)來(lái)分析。它分成3個(gè)狀態(tài)。

          本文引用地址:http://www.ex-cimer.com/article/201611/316800.htm

          狀態(tài)1等待REQ,一切狀態(tài)為0

          狀態(tài)2這個(gè)狀態(tài)已經(jīng)接受到了REQ,這個(gè)時(shí)候把CNT中的值導(dǎo)入到DMA中的CURR—TC中,然后ACK就變成了1

          狀態(tài)3這個(gè)時(shí)候分為2個(gè)有限狀態(tài)機(jī),子機(jī)用來(lái)作數(shù)據(jù)傳輸,從源地址取數(shù)據(jù),再寫(xiě)到目標(biāo)地址。而主機(jī)負(fù)責(zé)計(jì)數(shù),以及計(jì)數(shù)到0的中斷等。。。

          其實(shí) 有限狀態(tài)機(jī)FSM這種分析方法簡(jiǎn)單來(lái)說(shuō)就是把過(guò)程的變化無(wú)視掉,轉(zhuǎn)而只看狀態(tài)穩(wěn)定后的結(jié)果。

          以下來(lái)介紹在傳輸中的3種基本分類。

          第一類 是 單元式 和 突發(fā)式 unit and brust

          unit 發(fā)送1個(gè)Byte,而brust發(fā)送4個(gè)。

          第2類 服務(wù)類 單一服務(wù) 和 連續(xù)服務(wù) single and whole

          單一服務(wù)本質(zhì)上來(lái)講就是做一個(gè)原子操作 必須再?gòu)臓顟B(tài)1到狀態(tài)3再走一遍,也就是說(shuō) 需要等待REQ的這比有請(qǐng)求。而連續(xù)服務(wù)則在CURR_TC中的計(jì)數(shù)到0才停止。但是需要注意的一點(diǎn):雖然是連續(xù)的,但是它也要短暫的釋放數(shù)據(jù)總線,來(lái)給“饑渴”的CPU控制。

          第3類 請(qǐng)求式和握手式 demand and shake

          請(qǐng)求式就是當(dāng)ACK結(jié)束整個(gè)一次傳輸后,恢復(fù)到0,發(fā)現(xiàn)REQ仍然是1的話,繼續(xù)進(jìn)行傳輸。

          而shake mode 指的是 ,ACK完成一次傳輸后,一定要等到REQ 變成0,來(lái)確認(rèn)才能繼續(xù)進(jìn)行。不然會(huì)一直等待。

          請(qǐng)求式單服務(wù),握手式單服務(wù),握手式全服務(wù),請(qǐng)求式全服務(wù)。一般如果是外設(shè)對(duì)外設(shè)的話,推薦使用請(qǐng)求全服務(wù)。

          而從速度上來(lái)講,連續(xù)服務(wù)的確比單服務(wù)快一點(diǎn)。

          簡(jiǎn)單說(shuō)下需要設(shè)置的寄存器。

          因?yàn)槲覀冇?組DMA,每組要設(shè)置的寄存器是9個(gè),所以總共算術(shù)36個(gè)。

          在9個(gè)中,前4個(gè)設(shè)置源地址,源地址的控制,目標(biāo)地址,目標(biāo)地址的控制等選項(xiàng)。

          第5個(gè)是DMA控制寄存器,它要可以設(shè)置DMA的模式等具體的內(nèi)容。

          第6,7個(gè)是看源地址和目標(biāo)地址在現(xiàn)在的數(shù)值。

          而第8個(gè)是看CT內(nèi)部計(jì)數(shù)器中,遞減到了幾。

          第9個(gè)是控制DMA啟動(dòng)和停止的寄存器。例如在單一模式下,傳完一次 on/off位會(huì)自動(dòng)置0,需要再次置1才能再次傳輸

          以下來(lái)進(jìn)行舉例:

          寫(xiě)一個(gè)程序 利用分別利用DMA傳輸1M數(shù)據(jù),另外一個(gè)正??截?,利用定時(shí)器PWM來(lái)計(jì)時(shí) 并輸出到UART串口中。基本上除了中斷,前2次用到的設(shè)備這次都利用到了。

          #include"s3c2440.h"
          #define UART_CLK 50000000
          #define UART_BAUD_RATE 115200
          #define UART_BRD (int)(UART_CLK/(UART_BAUD_RATE *16))-1

          int n=0; //定義外部變量

          void init_uart()
          {
          rGPHCON |=0xa0;
          rGPHUP = 0x0c;
          rULCON0 = 0x3;
          rUCON0 = 0x5;
          rUFCON0 = 0;
          rUMCON0 = 0;
          rUBRDIV0 = UART_BRD;
          }

          void init_timer0() //初始化pwm,0.5秒計(jì)65535次數(shù)
          {
          rTCFG0 = 0x63;
          rTCFG1 = 0x1;
          rTCNTB0 = 0xFFFF;
          rTCON = 0xa;
          rTCON = 0x9;
          }

          void init_irq()
          {
          rINTMOD = 0;
          rINTMSK = ~(1<<10);//計(jì)時(shí)到0進(jìn)入ISR,其中進(jìn)行計(jì)數(shù)的累加,和小燈亮暗處理,小燈亮暗 為了說(shuō)明進(jìn)入了中斷
          }

          void uart_write(char *data)
          {
          while (*data != 看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();