MSP430程序庫十四DMA程序庫_第1頁
MSP430程序庫十四DMA程序庫_第2頁
MSP430程序庫十四DMA程序庫_第3頁
MSP430程序庫十四DMA程序庫_第4頁
MSP430程序庫十四DMA程序庫_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

-.z.MSP430程序庫<十四>DMA程序庫直接存儲器存取(DMADirectMemoryAccess)方式是用硬件實現(xiàn)存儲器與存儲器之間或存儲器與I\O設備之間直接進展高速數(shù)據(jù)傳送,不需要CPU的干預。這種方式通常用來傳送數(shù)據(jù)塊。MSP430f16*系列單片機內部含有DMA模塊,而且?guī)缀鮾炔克型庠O都可以觸發(fā)DMA開場存取數(shù)據(jù)。這里實現(xiàn)了這個模塊的程序通用的函數(shù)庫,方便使用。硬件介紹:MSP430F15*/16*系列單片機具有DMA控制器,從而能夠為數(shù)據(jù)高速傳輸提供保證。例如,通過DMA控制器可以直接將ADC轉換存貯器的內容傳到RAM單元。MSP430系列單片機擴展的DMA具有來之所有外設的觸發(fā)器,不需要CPU的干預即可提供先進的可配置的數(shù)據(jù)傳輸能力,從而加速了基于MCU的信號處理進程,DMA傳輸?shù)挠|發(fā)來源對CPU來說是完全透明的,DMA控制器可在內存與外部及外部硬件之間進展準確的傳輸控制。DMA消除了數(shù)據(jù)傳輸延遲時間以及各種開銷,從而可以解放16為RISCCPU,以便其將更多的時間用于處理數(shù)據(jù),而非執(zhí)行正在處理的任務。MSP430F16*系列單片機的DMA模塊有以下特點:數(shù)據(jù)傳送不需要CPU介入,完全由DMA控制器自行管理。在整個地址空間范圍內傳輸數(shù)據(jù),塊方式傳輸可達65536字節(jié);能夠提高片內外設數(shù)據(jù)吞吐能力,實現(xiàn)高速傳輸,每個字或者字節(jié)的傳輸僅需要2個MCLK;減少系統(tǒng)功耗,即使在片內外設進展數(shù)據(jù)輸入或輸出時,CPU也可以處于超低功耗模式而不需喚醒;字節(jié)和字數(shù)據(jù)可以混合傳送:DMA傳輸可以是字節(jié)到字節(jié)、字到字、字節(jié)到字或者字到字節(jié)。當字到字節(jié)傳輸時,只有字中較低字節(jié)能夠傳輸,當從字節(jié)到字傳輸時,傳輸?shù)阶值牡妥止?jié),高字節(jié)被自動清零;四種傳輸尋址模式:固定地址到固定地址、固定地址到塊地址、塊地址到固定地址以及塊地址到塊地址;觸發(fā)方式靈活:邊沿或者電平觸發(fā)。單個、塊或突發(fā)塊傳輸模式:每次觸發(fā)DMA操作,可以根據(jù)需要傳輸不同規(guī)模的數(shù)據(jù)DMA的四種尋址模式如下列圖所示:DMA控制器模塊:3個獨立的傳輸通道:通道0、通道1和通道2。每個通道都有源地址存放器、目的地址存放器、傳送數(shù)據(jù)長度存放器和控制存放器。每個通道的觸發(fā)請求可以分別允許和制止;可配置的通道優(yōu)先權:優(yōu)先權裁決模塊,傳輸通道的優(yōu)先級可以調整,對同時有觸發(fā)請求的通道進展優(yōu)先級裁決,確定哪個通道的優(yōu)先級最高。MSP430的DMA控制器可以采用固定優(yōu)先級,還可以采用循環(huán)優(yōu)先級。程序命令控制模塊,每個DMA通道開場傳輸之前,CPU要編程給定相關的命令和模式控制,以決定DMA通道傳輸?shù)念愋停豢膳渲玫膫魉陀|發(fā)器:觸發(fā)源選擇模塊,DMAREQ〔軟件觸發(fā)〕、Timer_ACCR2輸出、Timer_BCCR2輸出、I2C數(shù)據(jù)接收準備好、I2C數(shù)據(jù)發(fā)送準備好、USART接收發(fā)送數(shù)據(jù)、DAC12模塊DAC12IFG、ADC12模塊的ADC12IFG*、DMA*IFG、DMAE0外部觸發(fā)源。并且還具有觸發(fā)源擴大能力。DMA有六種傳輸模式:單字或者單字節(jié)傳輸;塊傳輸;突發(fā)塊傳輸;重復單字或者單字節(jié)傳輸;重復塊傳輸;重復突發(fā)塊傳輸。前三個,傳輸完成后DMAEN自動復位;再次傳輸時需要重新置位DMAEN位以使能DMA通道。后三個為重復模式,一次傳輸完成后,DMAEN不復位;再次出發(fā)時,可以再次啟動數(shù)據(jù)傳輸。六種傳輸模式通過DMADT*存放器設置:DMADT*TransferModeDescription000SingletransferEachtransferrequiresatrigger.DMAENisautomaticallyclearedwhenDMA*SZtransfershavebeenmade.001BlocktransferApleteblockistransferredwithonetrigger.DMAENisautomaticallyclearedattheendoftheblocktransfer.010,011Burst-blocktransferCPUactivityisinterleavedwithablocktransfer.DMAENisautomaticallyclearedattheendoftheburst-blocktransfer.100RepeatedsingletransferEachtransferrequiresatrigger.DMAENremainsenabled.101RepeatedblocktransferApleteblockistransferredwithonetrigger.DMAENremainsenabled.110,111Repeatedburst-blockCPUactivityisinterleavedwithablocktransfer.transferDMAENremainsenabled.單字或者單字節(jié)傳輸:DMA通道被定義為單字或者單字節(jié)傳輸模式,每個字或者字節(jié)的傳輸都要觸發(fā)信號觸發(fā)。設置DMADT*=0就定義了單字或者單字節(jié)傳輸模式,規(guī)定的傳輸完畢后DMAEN位自動去除,如果需要再次傳輸,必須重新置位DMAEN。如果設置DMADT*=4為重復單字或者單字節(jié)傳輸模式,DMAEN位一直保持置位,每次觸發(fā)伴隨一次傳輸。DMA*SZ存放器保存?zhèn)鬏數(shù)膯卧獋€數(shù),如果該存放器為0,則沒有傳輸。傳輸之前DMA*SZ存放器的值寫入到一個臨時的存放器中,每次操作之后DMA*SZ做減操作。當DMA*SZ減為零的時候,它所對應的臨時存放器將原來的值重新置入DMA*SZ,同時相應的DMAIFG標志置位。塊傳輸模式:在塊傳輸模式,每次觸發(fā)可以傳輸一個數(shù)據(jù)塊。設置DMADT*=1為塊傳輸模式,每個數(shù)據(jù)塊傳輸完畢,DMAEN位自動去除,在觸發(fā)傳輸下一個數(shù)據(jù)塊之前,該位要被重新置位。在傳輸*個數(shù)據(jù)塊期間,其他的傳輸請求將被忽略。設置DMADT*=5為重復塊傳輸模式,*個數(shù)據(jù)塊傳輸完畢,DMAEN位仍然保持置位,之后,新的觸發(fā)可以引起又一次數(shù)據(jù)塊傳送。DMA*SZ存放器保存數(shù)據(jù)塊所包含的單元個數(shù)。DMASRCINCR和DMADSTINCR反映在數(shù)據(jù)塊傳輸過程中的目的地址和源地址的變化情況。在塊傳輸或者重復塊傳輸過程中,DMA*SA,DMA*DA,DMA*SZ存放器的值寫入到對應的臨時存放器中,DMA*SA,DMA*DA存放器所對應的臨時值在塊傳輸過程中增加或者減少,而DMA*SZ在塊傳輸過程中減計數(shù),始終反映當前數(shù)據(jù)塊還有多少單元沒有傳輸完畢,當DMA*SZ減為0,它所對應的臨時存放器將原來的值重新置入DMA*SZ,同時相應的DMAIFG被置位。在塊傳輸過程中,CPU暫停工作,不參與數(shù)據(jù)的傳輸。數(shù)據(jù)塊需要2×MCLK×DMA*SZ個時鐘周期。當每個數(shù)據(jù)塊傳輸完畢,CPU按照暫停前的狀態(tài)重新開場執(zhí)行。突發(fā)塊傳輸模式:這個和塊傳輸模式類似,只不過每傳輸4個字或字節(jié),DMA釋放內部總線,CPU運行2個MCLK周期;在傳輸過程中CPU有20%的執(zhí)行時間,而塊傳輸需要等DMA完全傳送完之后,CPU方能運行。DMA觸發(fā)源:每個通道的觸發(fā)源有DMA*TSEL*位進展控制的,這些位必須在DMAEN位為0是進展設置,否則可能出現(xiàn)不可預料的DMA觸發(fā)。DMA*TSEL*Operation0000DMAREQbit(softwaretrigger)0001TACCR2CCIFGbit0010TBCCR2CCIFGbit0011UR*IFG0(UART/SPImode),USART0datareceived(I2Cmode)0100UT*IFG0(UART/SPImode),USART0transmitready(I2Cmode)0101DAC12_0CTLDAC12IFGbit0110ADC12ADC12IFG*bit0111TACCR0CCIFGbit1000TBCCR0CCIFGbit1001UR*IFG1bit1010UT*IFG1bit1011Multiplierready1100Noaction1101Noaction1110DMA0IFGbittriggersDMAchannel1DMA1IFGbittriggersDMAchannel2DMA2IFGbittriggersDMAchannel01111E*ternaltriggerDMAE0另外,單片機的中斷程序不影響DMA的傳輸,當DMA傳輸過程中,單片機不響應中外部NMI中斷(必須DMA的控制位ENNMI位為1時響應NMI中斷,否則不予處理)外的所有中斷;必須等待DMA數(shù)據(jù)傳送完畢之后才運行系統(tǒng)的中斷處理程序。DMA的中斷:數(shù)據(jù)傳送過程中,DMA*SZ存放器值減為0時,DMA置位DMAIFG,DMA的中斷和DAC12模塊共享中斷向量,使用中斷時需要軟件判斷具體是那個中斷。中斷響應后DMAIFG不會自動復位,使用時必須軟件清零DMAIFG位。DMA的存放器如下:RegisterShortFormRegisterTypeAddressInitialStateDMAcontrol0DMACTL0Read/write0122hResetwithPORDMAcontrol1DMACTL1Read/write0124hResetwithPORDMAchannel0controlDMA0CTLRead/write01E0hResetwithPORDMAchannel0sourceaddressDMA0SARead/write01E2hUnchangedDMAchannel0destinationaddressDMA0DARead/write01E4hUnchangedDMAchannel0transfersizeDMA0SZRead/write01E6hUnchangedDMAchannel1controlDMA1CTLRead/write01E8hResetwithPORDMAchannel1sourceaddressDMA1SARead/write01EAhUnchangedDMAchannel1destinationaddressDMA1DARead/write01EChUnchangedDMAchannel1transfersizeDMA1SZRead/write01EEhUnchangedDMAchannel2controlDMA2CTLRead/write01F0hResetwithPORDMAchannel2sourceaddressDMA2SARead/write01F2hUnchangedDMAchannel2destinationaddressDMA2DARead/write01F4hUnchangedDMAchannel2transfersizeDMA2SZRead/write01F6hUnchanged有關每個存放器的詳細內容參考ti提供的用戶指南。程序實現(xiàn):DMA的使用主要是DMA存放器的初始設置,設置完成后,DMA接到觸發(fā)信號即可自動傳輸數(shù)據(jù)。設置函數(shù)如下:voidDMAInit(charchannel,chartrigger,chartransMode,charsrcMode,chardstMode,unsignedintsrc,unsignedintdst,unsignedintsize){unsignedint*DMA*CTL,*DMA*SA,*DMA*DA,*DMA*SZ;DMACTL0=trigger<<(channel<<2);DMACTL1=0*04;//DMA收到觸發(fā)請求時,等待當前指令執(zhí)行完成后switch(channel)//選擇當前設置哪個DMA通道{case0:DMA*CTL=(unsignedint*)&DMA0CTL;DMA*SA=(unsignedint*)&DMA0SA;DMA*DA=(unsignedint*)&DMA0DA;DMA*SZ=(unsignedint*)&DMA0SZ;break;//指針=0通道控制case1:DMA*CTL=(unsignedint*)&DMA1CTL;DMA*SA=(unsignedint*)&DMA1SA;DMA*DA=(unsignedint*)&DMA1DA;DMA*SZ=(unsignedint*)&DMA1SZ;break;//指針=1通道控制case2:DMA*CTL=(unsignedint*)&DMA2CTL;DMA*SA=(unsignedint*)&DMA2SA;DMA*DA=(unsignedint*)&DMA2DA;DMA*SZ=(unsignedint*)&DMA2SZ;break;//指針=2通道控制}switch(transMode)//設置DMA通道的傳輸模式{case'S':*DMA*CTL=DMADT_0;break;//單次傳輸case's':*DMA*CTL=DMADT_4;break;//重復單次傳輸case'B':*DMA*CTL=DMADT_1;break;//塊傳輸case'b':*DMA*CTL=DMADT_5;break;//重復塊傳輸case'I':*DMA*CTL=DMADT_2;break;//突發(fā)塊傳輸交織case'i':*DMA*CTL=DMADT_6;break;//重復突發(fā)塊傳輸交織}*DMA*CTL|=(srcMode&0*04)<<2;//源字或字節(jié)*DMA*CTL|=(srcMode&0*03)<<8;//源地址改變方式*DMA*CTL|=(dstMode&0*04)<<3;//目的字或字節(jié)*DMA*CTL|=(dstMode&0*03)<<10;//目的地址改變方式*DMA*SA=src;*DMA*DA=dst;*DMA*SZ=size;*DMA*CTL|=DMAEN;//DMA使能}函數(shù)比擬麻煩,函數(shù)內容按參數(shù)設置每個存放器。DMACTL0=trigger<<(channel<<2);這個是設置對應channel通道的的參考源,不大明白的可以看下DMACTL0的存放器內容;switch(channel)語句則根據(jù)通道設置對應指針指向的存放器;然后對應設置參數(shù)即可。當設置成非重復模式時,需要重新置位DMAEN,本程序就函數(shù)DMAReEnable實現(xiàn):voidDMAReEnable(charchannel){switch(channel)//使能對應通道{case0:DMA0CTL|=DMAEN;break;//0通道case1:DMA1CTL|=DMAEN;break;//1通道case2:DMA2CTL|=DMAEN;break;//2通道}}這個函數(shù)比擬簡單,只是根據(jù)傳入?yún)?shù)設置對應通道的DMAEN位。當設置為軟件觸發(fā)時,需要軟件啟動DMA程序如下:voidDMAStart(charchannel){switch

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論