嵌入式課程設計-DMA傳送編程_第1頁
嵌入式課程設計-DMA傳送編程_第2頁
嵌入式課程設計-DMA傳送編程_第3頁
嵌入式課程設計-DMA傳送編程_第4頁
嵌入式課程設計-DMA傳送編程_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

嵌入式課程設計 ---DMA傳送編程嵌入式課程設計系別 :計算機與通信工程學院班級 :通信工程 08-1班姓名 :####學號 :33333333333鄭州輕工業學院計算機與通信工程學院2011年12月鄭州輕工業學院課程設計任務書題目DMA傳送編程專業、班級 通信工程 08-1學號3333333姓名333主要內容、基本要求、主要參考文獻等 :1、主要內容(1)編寫單字節方式、雙字節方式和四字節方式常規內存拷貝及時間檢測程序(2)編寫DMAT式內存拷貝及時間檢測程序(3)比較DMAT式內存拷貝及常規內存拷貝的效率2、基本要求(1)掌握S3c44B0DM檢制器的使用(2)掌握DM徽件編程方法3、主要參考文獻[11馬忠梅,馬廣云,徐英惠,田澤.ARM嵌入式處理器結構與應用基礎.北京:北京航天航空大學出版社, 2002【2】田澤 .嵌入式系統開發與應用實驗教程 .北京航空航天大學出版社, 2004[3]周立功.ARM微控制器基礎與實戰[M].北京航天航空大學出版社,2003完成期限:指導教師簽名 :張濤張彥課程負責人簽名 :張濤張彥2-目錄TOC\o"1-5"\h\z一、課程設計的基本任務 4二、課程設計的基本要求 4三、預備知識 4 四、實驗設備 4 五、基礎知識 4 六、課程設計說明書 7七、程序代碼 83-DMA傳送編程.一、課程設計的基本任務了解DMA專送原理掌握S3c44B0DMAfe制器的使用掌握DM儆件編程方法二、課程設計的基本要求編寫單字節方式、雙字節方式和四字節方式常規內存拷貝及時間檢測程序編寫DMAT式內存拷貝及時間檢測程序比較DMAT式內存拷貝及常規內存拷貝的效率三、預備知識了解ADT集成開發環境的基本功能了解DMA勺原理以及處理步驟四、實驗設備JX44B0教學實驗箱ADT1000?真器和ADTIDE集成開發環境串口連接線五、基礎知識直接數據存儲 -DMADMAJ式當高速外設要與系統內存或者要在系統內存的不同區域之間,進行大量數據的快速傳送時,查詢方式和中斷方式可能不能滿足要求直接存儲器存取(DMA就是為解決這個問題提出的采用DMAJ式,在一定時間段內,由DMA空制器取代CPU獲得總線控制權,來實現內存與外設或者內存的不同區域之間大量數據的快速傳送典型的DMA空制器(以下

簡稱DMAC)J工作電路簡稱DMAC)J工作電路-4-DM徽據傳送的工作過程1)DMAC發出DMAt送請求2)DMAC2)DMAC通過連接到CPU勺HOLD言號向CPl>出DMA請求3)CPU3)CPU在完成當前總線操作后會立即對DMA青求做出響應CPU(勺響應包括兩個方面:CPU等控制總線、數據總線和地址總線浮空,即放棄對這些總線的控制權CPU等有效的HLDA言號力口至ijDMACt,以通知DMACCPU已經放棄了總線的控制權CPU將總線浮空,即放棄了總線控制權后,由DMACI管系統總線的控制權,并向外設送出DMA勺應答信號DMAC送出地址信號和控制信號,實現外設與內存或內存之間大量數據的快速傳送DMAC等規定的數據字節傳送完之后,通過向CP3HOLD言號,撤消對CPU的DMA青求。CPU攵到此信號,一方面使HLDA6效,另一方面又重新開始控制總線,實現正常取指令、分析指令、執行指令的操作。DM聯送方式I/O接口到存儲器存儲器到 I/O接口存儲器到存儲器I/O接口到存儲器的傳送當進行由I/O接口到存儲器的數據傳送時,來自I/O接口的數據利用DMACf出的控制信號,將數據輸送到系統數據總線D0~D7±,同時,DMAC1出存儲器單元地址及控制信號,將存在于D0~D7±的數據寫入所選中的存儲單元中。這樣就完成了由I/O接口到存儲器一個字節的傳送。同時DMAO改內部地址及字節數寄存器的內容。存儲器到 I/O接口與前一種情況類似,在進行這種傳送時, DMACS出存儲器地址及控制信號,將選中的存儲單元的內容讀出放在數據總線D0~D7±,接著,DMACf出控制信號,將數據寫到規定的(預選中)端口中去,而后MDA?動修改內部的地址及字節數寄存器的內容S3c44B0勺DM饋制器-5-S3c44B廓成了4個通道的DM饋制器:,兩個ZDM饋制器ZDMA0/1可以用于存儲器到存儲器、儲存器到 I/O設備、I/O設備之間的 DMA傳送;,兩個BDM舲制器BDMA0/1用于儲存器與I/O設備之間的傳輸。S3c44B(fr與DM饋制器有關的寄存器ZDMA0/1空制寄存器ZDMA起始地址、目的地址寄存器DMA+數器寄存器ZDMA0/1空制寄存器ZDMA起始地址、目的地址寄存器-6-DMA+數器寄存器六、課程設計說明書本實驗通過DMAT式實現存儲器到存儲器間的數據傳送,并將其與常規的內存拷貝操作進行比較拷貝動作的計時處理采用定時器進行計時處理,采用函數 Timer_Start啟動計時處理,參數divider表示定時時間間隔,0:16us1:32us2:64us3:128us操作完成時調用Timer_Stop停止定時器計數,其返回值為計數值,該值乘以時間問隔(128us)即為計時時間Timer_Start(3);/*128us*/time=Timer_Stop();/* 停止定時器*/Uart_Printf("CopyBytes:time=%f\n",time*128E-6);常規的內存拷貝操作字節拷貝"(unsignedchar*)(dstAddr)="(unsignedchar*)(srcAddr);雙字節拷貝(unsignedshort*)(dstAddr)=*(unsignedshort*)(srcAddr);字節拷貝7-(unsignedint*)(dstAddr)=*(unsignedint*)(srcAddr);DMA勺內存拷貝操作清除傳輸完畢標志zdma0Done=0;設置DMA專輸的起止地址和長度rZDISRC0=srcAddr|(dw<<30)|(1<<28);/*dw為DMAt輸寬度*/rZDIDES0=dstAddr|(2<<30)|(1<<28);rZDICNT0=length|(2<<28)|(1<<26)|(3<<22)|(1<<20);啟動DMA專輸并開始計時rZDCON0=0x1;Timer_Start(3);DMA勺內存拷貝操作等待傳輸完成,傳輸完成標記將在DM/fr斷服務程序中置位while(zdma0Done==0);返回當前定時計數器中的值time=Timer_Stop();Uart_Printf("ZDMA0:time=%f\n",time*128E-6);關中斷rINTMSK=BIT_GLOBAL;DM沖斷處理函數voidisr_dma0(void){rI_ISPC=BIT_ZDMA0;/*設置傳輸完畢標志 */zdma0Done=1;}實驗報告要求什么叫DMA專送方式?試說明DMA&式傳送數據的主要步驟。試比較DMA專輸、查詢式傳輸及中斷方式傳輸之間的優缺點和適用場合 ?七、程序代碼 :/**************************************************************/8-/**//*FILENAMEVERSION*//**//*DMA.C1.0*//**//*DESCRIPTION*//**//*JX44B0(S3C44B0X)DMA實驗*//**//**//*DATASTRUCTURES*//**//*FUNCTIONS:*//* 在JX44B0教學實驗箱進行DMAT式內存拷貝的實驗*//**//*DEPENDENCIES*//*JX44B0-1*//*JX44B0-2*//*JX44B0-3*//**//**//*NAME:*//*REMARKS:*//**//*Copyright(C)2003WuhanCVTECHCO.,LTD*//**************************************************************//**************************************************************//*學習ARMftt理器中DMAJ式的處理方法:*//*DMA方式:內存,內存DMA方式傳輸數據*//*注意:學習該實驗之前請先學習 interrupt中斷處理實驗 *//**************************************************************//*包含文件 */#include"44b.h"#include"44blib.h"#include"rtc.h"typedef(*ISR_ROUTINE_ENTRY)(void);#definePrintfUartPrintf/*functions*/voidZdma0(intsrcAddr,intdstAddr,intlength);voidZdma0Done(void);voidTest_Zdma0(void);voidisr_dma0(void);/*globals*/volatileintzdma0Done;voidIsrIRQ()__attribute__((interrupt("IRQ")));/**************************************************************///Functionname:IsrIRQ//Description: 非矢量方式下中斷的查表處理//中斷地址表位于 0x0c7fff00開始的256字節//Returntype:void//Argument:void**************************************************************/voidIsrIRQ(){intcount=0;unsignedintisr_pending;unsignedintisr_mask=0x00000001;unsignedintisr_mask_set=rINTMSK;ISR_ROUTINE_ENTRYisr_routine_entry=(ISR_ROUTINE_ENTRY)0x0;__asm__("STMFDSP!,{r1,r4-r8}@SAVEr1,r4-r10\n""nop\n");isr_pending=(rINTPND&~isr_mask_set);10-while(isr_mask){if(isr_pending&isr_mask){isr_routine_entry=(ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));break;}count+=4;isr_mask<<=1;

if(isr_routine_entry)(*isr_routine_entry)();__asm__("LDMFDSP!,{r1,r4-r8}@RESTOREr1,r4-r10\n""nop\n");/**************************************************************///Functionname:init_interrupt_handler//Description:式下中斷向量表初始化處理//Returntype:void//Argument:irq_handler//中斷處理函數入口**************************************************************/voidinit_interrupt_handler(unsignedintirq_handler){inti;rINTPND=0x00000000;/*清除所有未決的中斷 */rI_ISPC=0x03FFFFFF;for(i=0;i<256;i+=4)/* 清除中斷表 */{11-(unsignedint*)(_ISR_STARTADDRESS+i)=0;}非矢量方設置IRQ模式處理函數*(unsignedint*)(HandleIRQ)=irq_handler;非矢量方設置IRQ模式處理函數/**************************************************************///Functionname:install_isr_handler//Description: 非矢量方式下中斷向量的安裝//Returntype:void//Argument:irq_no,中斷號//irq_routine,中斷處理函數地址**************************************************************/voidinstall_isr_handler(intirq_no,void*irq_routine){*(unsignedint*)(irq_no)=(unsignedint)irq_routine;}/**************************************************************///Functionname:Main//Description:DMA測試程序主函數//內存,內存DMA方式傳輸數據//傳輸完畢引發DM/fr斷//注冊中斷源 :BIT_ZDMA0//Returntype:int//Argument:void**************************************************************/intMain(void){Uart_Select(0);Uart_Init(MCLK,115200);Uart_Printf("DMATESTPROGRAM\n");rINTCON=0x7;/*Non-vect,IRQdisable,FIQdisable*/init_interrupt_handler((unsignedint)IsrIRQ);-12-install_isr_handler(HandleZDMA0,(void*)isr_dma0);rINTMOD=0x0;/*設置所有中斷為IRQ模式*/rINTMSK=(0x07ffffff&~(BIT_GLOBAL|BIT_ZDMA0));/*使能TICK中斷*/rINTCON=0x5;/*打開IRQ模式的中斷*/Test_Zdma0();while(1);/*************************************************************///Functionname:TestZdma0//Description:testzdma0//Returntype:void//Argument:void**************************************************************/voidTest_Zdma0(void)unsignedchar*src,*dst;inti;unsignedintmemSum;Uart_Printf("[ZDMA0MEM2MEMTest]\n");dst=(unsignedchar*)malloc(0x80000);src=(unsignedchar*)malloc(0x80000);/*將dst區域設置為非 Cacheable區域,關閉 Cache*/rNCACHBE1=(((((unsigned)dst+0x100000)>>12)+1)<<16)|((unsigned)dst>>12);Uart_Printf("dst=%x,src=%x\n",(int)dst,(int)src);-13-Zdma0((int)src,(int)dst,0x80000);free(src);free(dst);}/*************************************************************///Functionname:Zdma0//Description: 以三種不同的方式進行數據拷貝,檢查其時間消耗//Returntype:void//Argument:srcAddr,拷貝數據的起始地址//dstAddr,拷貝數據的目的地址//length,拷貝數據的長度**************************************************************/voidZdma0(intsrcAddr,intdstAddr,intlength){inttime;/*將目標地址設置為非Cache區*/rNCACHBE1=(((((unsigned)dstAddr+0x100000)>>12)+1)<<16)|((unsigned)dstAddr>>12);/*測試單字節方式的拷貝時間 *//*啟動定時器,精度128us,用于計時*/Timer_Start(3);for(time=0;time<length;time++){*(unsignedchar*)(dstAddr+time)=*(unsignedchar*)(srcAddr+time);}TOC\o"1-5"\h\z/*返回當前定時計數器中的值 */time=Timer_Stop();/*輸出拷貝的時間 */Uart_Printf("CopyBytes:time=%f\n",time*128E-6);14-/*測試雙字節方式的拷貝時間 */Timer_Start(3);for(time=0;time<length;time+=2){(unsignedshort*)(dstAddr+time)=*(unsignedshort*)(srcAddr+time);}time=Timer_Stop();Uart_Printf("Copyshortwords:time=%f\n",time*128E

溫馨提示

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

最新文檔

評論

0/150

提交評論