《STM32嵌入式單片機原理與應用》 課件 第10章 DMA控制器_第1頁
《STM32嵌入式單片機原理與應用》 課件 第10章 DMA控制器_第2頁
《STM32嵌入式單片機原理與應用》 課件 第10章 DMA控制器_第3頁
《STM32嵌入式單片機原理與應用》 課件 第10章 DMA控制器_第4頁
《STM32嵌入式單片機原理與應用》 課件 第10章 DMA控制器_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10章DMA控制器本章講述了DMA控制器,包括DMA的結構和主要特征、DMA的功能描述、DMA庫函數(shù)和DMA應用實例。10.1DMA的結構和主要特征DMA(DirectMemoryAccess,直接存儲器存?。┯脕硖峁┰谕庠O和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸,無須CPU干預,是所有現(xiàn)代計算機的重要特色。在DMA模式下,CPU只需向DMA控制器下達指令,讓DMA控制器來處理數(shù)據(jù)的傳送,數(shù)據(jù)傳送完畢再把信息反饋給CPU,這樣在很大程度上減輕了CPU資源占有率,可以大大節(jié)省系統(tǒng)資源。DMA主要用于快速設備和主存儲器成批交換數(shù)據(jù)的場合。在這種應用中,處理問題的出發(fā)點集中到兩點:一是不能丟失快速設備提供出來的數(shù)據(jù),二是進一步減少快速設備輸入/輸出操作過程中對CPU的打擾。這可以通過把這批數(shù)據(jù)的傳輸過程交由DMA來控制,讓DMA代替CPU控制在快速設備與主存儲器之間直接傳輸數(shù)據(jù)。當完成一批數(shù)據(jù)傳輸之后,快速設備還是要向CPU發(fā)一次中斷請求,報告本次傳輸結束的同時,“請示”下一步的操作要求。STM32的兩個DMA控制器有12個通道(DMA1有7個通道,DMA2有5個通道),每個通道專門用來管理來自一個或多個外設對存儲器訪問的請求。還有一個仲裁器來協(xié)調(diào)各個DMA請求的優(yōu)先權。DMA的功能框圖如圖10-1所示。STM32F103VET6的DMA模塊具有如下特征。1)12個獨立的可配置的通道(請求):DMA1有7個通道,DMA2有5個通道。2)每個通道都直接連接專用的硬件DMA請求,每個通道都支持軟件觸發(fā)。這些功能通過軟件來配置。3)在同一個DMA模塊上,多個請求間的優(yōu)先權可以通過軟件編程設置(共有4級:很高、高、中等和低),優(yōu)先權設置相等時由硬件決定(請求0優(yōu)先于請求1,以此類推)。4)獨立數(shù)據(jù)源和目標數(shù)據(jù)區(qū)的傳輸寬度(字節(jié)、半字、全字)是獨立的,模擬打包和拆包的過程。源和目的地址必須按數(shù)據(jù)傳輸寬度對齊。5)支持循環(huán)的緩沖器管理。6)每個通道都有3個事件標志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這3個事件標志通過邏輯“或”運算成為一個單獨的中斷請求。7)存儲器和存儲器間的傳輸。8)外設和存儲器、存儲器和外設之間的傳輸。9)閃存、SRAM、外設的SRAM、APB1、APB2和AHB外設均可作為訪問的源和目標。10)可編程的數(shù)據(jù)傳輸最大數(shù)目為65536。圖10-1DMA的功能框圖10.2DMA的功能描述DMA控制器和Cortex-M3核心共享系統(tǒng)數(shù)據(jù)總線,執(zhí)行直接存儲器數(shù)據(jù)傳輸。當CPU和DMA同時訪問相同的目標(RAM或外設)時,DMA請求會暫停CPU訪問系統(tǒng)總線若干個周期,總線仲裁器執(zhí)行循環(huán)調(diào)度,以保證CPU至少可以得到一半的系統(tǒng)總線(存儲器或外設)使用時間。發(fā)生一個事件后,外設向DMA控制器發(fā)送一個請求信號。DMA控制器根據(jù)通道的優(yōu)先權處理請求。當DMA控制器開始訪問發(fā)出請求的外設時,DMA控制器立即發(fā)送給外設一個應答信號。當從DMA控制器得到應答信號時,外設立即釋放請求。一旦外設釋放請求,DMA控制器同時撤銷應答信號。如果有更多的請求,外設可以在下一個周期啟動請求??傊看蜠MA傳送由3個操作組成:1)從外設數(shù)據(jù)寄存器或者從當前外設/存儲器地址寄存器指示的存儲器地址讀取數(shù)據(jù),第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設基地址或存儲器單元。10.2.1DMA處理2)將讀取的數(shù)據(jù)保存到外設數(shù)據(jù)寄存器或者當前外設/存儲器地址寄存器指示的存儲器地址,第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設基地址或存儲器單元。3)執(zhí)行一次DMA_CNDTRx寄存器的遞減操作,該寄存器包含未完成的操作數(shù)目。仲裁器根據(jù)通道請求的優(yōu)先級啟動外設/存儲器的訪問。優(yōu)先權管理分兩個階段。1)軟件:每個通道的優(yōu)先權可以在DMA_CCRx寄存器中的PL[1:0]設置,有4個等級:最高優(yōu)先級、高優(yōu)先級、中等優(yōu)先級、低優(yōu)先級。2)硬件:如果兩個請求有相同的軟件優(yōu)先級,則較低編號的通道比較高編號的通道有較高的優(yōu)先權。例如,通道2優(yōu)先于通道4。DMA1控制器的優(yōu)先級高于DMA2控制器的優(yōu)先級。

10.2.2仲裁器每個通道都可以在有固定地址的外設寄存器和存儲器之間執(zhí)行DMA傳輸。DMA傳輸?shù)臄?shù)據(jù)量是可編程的,最大為65535。數(shù)據(jù)項數(shù)量寄存器包含要傳輸?shù)臄?shù)據(jù)項數(shù)量,在每次傳輸后遞減。1.可編程的數(shù)據(jù)量外設和存儲器的傳輸數(shù)據(jù)量可以通過DMA_CCRx寄存器中的PSIZE和MSIZE位編程設置。10.2.3DMA通道2.指針增量通過設置DMA_CCRx寄存器中的PINC和MINC標志位,外設和存儲器的指針在每次傳輸后可以有選擇地完成自動增量。當設置為增量模式時,下一個要傳輸?shù)牡刂穼⑹乔耙粋€地址加上增量值,增量值取決于所選的數(shù)據(jù)寬度為1、2或4。第一個傳輸?shù)牡刂反娣旁贒MA_CPARx/DMA_CMARx寄存器中。在傳輸過程中,這些寄存器保持它們初始的數(shù)值,軟件不能改變和讀出當前正在傳輸?shù)牡刂罚ㄋ趦?nèi)部的當前外設/存儲器地址寄存器中)。當通道配置為非循環(huán)模式時,傳輸結束后(即傳輸計數(shù)變?yōu)?)將不再產(chǎn)生DMA操作。要開始新的DMA傳輸,需要在關閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數(shù)目。在循環(huán)模式下,最后一次傳輸結束時,DMA_CNDTRx寄存器的內(nèi)容會自動地被重新加載為其初始數(shù)值,內(nèi)部的當前外設/存儲器地址寄存器也被重新加載為DMA_CPARx/DMA_CMARx寄存器設定的初始基地址。3. 通道配置過程下面是配置DMA通道x的過程(x代表通道號):1)在DMA_CPARx寄存器中設置外設寄存器的地址。發(fā)生外設數(shù)據(jù)傳輸請求時,這個地址將是數(shù)據(jù)傳輸?shù)脑椿蚰繕恕?)在DMA_CMARx寄存器中設置數(shù)據(jù)存儲器的地址。發(fā)生存儲器數(shù)據(jù)傳輸請求時,傳輸?shù)臄?shù)據(jù)將從這個地址讀出或?qū)懭脒@個地址。3)在DMA_CNDTRx寄存器中設置要傳輸?shù)臄?shù)據(jù)量。在每個數(shù)據(jù)傳輸后,這個數(shù)值遞減。4)在DMA_CCRx寄存器的PL[1:0]位中設置通道的優(yōu)先級。5)在DMA_CCRx寄存器中設置數(shù)據(jù)傳輸?shù)姆较颉⒀h(huán)模式、外設和存儲器的增量模式、外設和存儲器的數(shù)據(jù)寬度、傳輸一半產(chǎn)生中斷或傳輸完成產(chǎn)生中斷。6)設置DMA_CCRx寄存器的ENABLE位,啟動該通道。一旦啟動了DMA通道,即可響應連到該通道上的外設的DMA請求。當傳輸一半的數(shù)據(jù)后,半傳輸標志(HTIF)被置1,當設置了允許半傳輸中斷位(HTIE)時,將產(chǎn)生中斷請求。在數(shù)據(jù)傳輸結束后,傳輸完成標志(TCIF)被置1,如果設置了允許傳輸完成中斷位(TCIE),則將產(chǎn)生中斷請求。4. 循環(huán)模式循環(huán)模式用于處理循環(huán)緩沖區(qū)和連續(xù)的數(shù)據(jù)傳輸(如ADC的掃描模式)。DMA_CCR寄存器中的CIRC位用于開啟這一功能。當循環(huán)模式啟動時,要被傳輸?shù)臄?shù)據(jù)數(shù)目會自動地被重新裝載成配置通道時設置的初值,DMA操作將會繼續(xù)進行。5.存儲器到存儲器模式DMA通道的操作可以在沒有外設請求的情況下進行,這種操作就是存儲器到存儲器模式。如果設置了DMA_CCRx寄存器中的MEM2MEM位,在軟件設置了DMA_CCRx存器中的EN位啟動DMA通道時,DMA傳輸將馬上開始。當DMA_CNDTRx寄存器為0時,DMA傳輸結束。存儲器到存儲器模式不能與循環(huán)模式同時使用。每個DMA通道都可以在DMA傳輸過半、傳輸完成和傳輸錯誤時產(chǎn)生中斷。為應用的靈活性考慮,通過設置寄存器的不同位來打開這些中斷。相關的中斷事件標志位及對應的使能控制位分別為:1)“傳輸過半”的中斷事件標志位是HTIF,中斷使能控制位是HTIE。2)“傳輸完成”的中斷事件標志位是TCIF,中斷使能控制位是TCIE。3)“傳輸錯誤”的中斷事件標志位是TEIF,中斷使能控制位是TEIE。10.2.4DMA中斷讀寫一個保留的地址區(qū)域,將會產(chǎn)生DMA傳輸錯誤。在DMA讀寫操作期間發(fā)生DMA傳輸錯誤時,硬件會自動清除發(fā)生錯誤的通道所對應的通道配置寄存器(DMA_CCRx)的EN位,該通道操作被停止。此時,在DMA_IFR寄存器中對應該通道的傳輸錯誤中斷標志位(TEIF)將被置位,如果在DMA_CCRx寄存器中設置了傳輸錯誤中斷允許位,則將產(chǎn)生中斷。10.3DMA庫函數(shù)DMA固件庫支持10種庫函數(shù),如表10-1所示。為了理解這些函數(shù)的具體使用方法,本節(jié)將對這些函數(shù)做詳細介紹。表10-1DMA庫函數(shù)函數(shù)名稱功能DMA_DeInit將DMA的通道x寄存器重設為缺省值DMA_Init根據(jù)DMA_InitStruct中指定的參數(shù),初始化DMA的通道x寄存器DMA_StructInit把DMA_InitStruct中的每一個參數(shù)按缺省值填入DMA_Cmd使能或者失能指定通道xDMA_ITConfig使能或者失能指定通道x的中斷DMA_GetCurrDataCounter得到當前DMA通道x剩余的待傳輸數(shù)據(jù)數(shù)目DMA_GetFlagStatus檢查指定的DMA通道x標志位設置與否DMA_ClearFlag清除DMA通道x待處理標志位DMA_GetITStatus檢查指定的DMA通道x中斷發(fā)生與否DMA_ClearITPendingBit清除DMA通道x中斷待處理標志位1.函數(shù)DMA_DeInit函數(shù)名:DMA_DeInit。函數(shù)原型:voidDMA_DeInit(DMA_Channel_TypeDef*DMAy_Channelx)。功能描述:DMAy_Channelx寄存器重設為缺省值。輸入?yún)?shù):DMAy_Channelx,DMAy的通道x,其中y可以是1或2,對于DMA1,x可以是1~7,對于DMA2,x可以是1~5。輸出參數(shù):無。返回值:無。例如:/*DeinitializetheDMA1Channe22*/DMA_DeInit(DMA1_Channe12);2.函數(shù)DMA_Init函數(shù)名:DMA_Init。函數(shù)原型:voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct).功能描述:根據(jù)DMA_InitStruct指定的參數(shù)初始化DMAy的通道x寄存器.輸入?yún)?shù)1:DMAy_Channelx,DMAy的通道x,其中y可以是1或2,對于DMAI,x可以是1~7,對于DMA2,x可以是1~5。輸入?yún)?shù)2:DMA_InitStruct,指向結構DMA_InitTypeDef的指針,包含了DMAy通道x的配置信息。輸出參數(shù):無。返回值:無。例如:/*InitializetheDMA1ChannellaccordingtotheDMA_InitStructuremembers*/DMAInitTypeDefDMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddr=0x40005400;DMA_InitStructure.DMA_MemoryBaseAddr=0x20000100;DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;DNAInitStructure.DMA_BufferSize=256;DMAInitStructure,DMA_PeripheralInc-DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc-DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;DMAInitStructure,DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;DMAInitStructure,DMA_Priority=DMA_Priority_Medium;DMA_InitStructure,DMA_M2M=DMA_M2M_Disable;DMA_Init(DMA1_Channe11,&DMA_InitStructure);3.函數(shù)DMA_GetCurrDataCounte函數(shù)名:DMA_GetCurrDataCounter。函數(shù)原型:u16DMA_GetCurrDataCounter(DMA_Channel_TypeDef*DMAy_Channelx)。功能描述:返回當前DMAy通道x剩余的待傳輸數(shù)據(jù)數(shù)目。輸入?yún)?shù):DMAy_Channelx,選擇DMAy通道x。輸出參數(shù):無。返回值:當前DMA通道x剩余的待傳輸數(shù)據(jù)數(shù)目。例如:/*GetthenumberofremainingdataunitsinthecurrentDMA1Channe12transfer*/u16CurrDataCount;CurrDataCount-DMA_GetCurrDataCounter(DMA1_Channe12);4.函數(shù)DMA_Cmd函數(shù)名:DMA_Cmd。函數(shù)原型:voidDMA_Cmd(DMA_Channel_TypeDef*DMAy_Channelx,F(xiàn)unctionalStateNewState)。功能描述:使能或者失能指定的通道x。輸入?yún)?shù)1:DMAy_Channelx:選擇DMAy通道x。輸入?yún)?shù)2:NewState,DMA通道x的新狀態(tài)。這個參數(shù)可以取ENABLE或者DISABLE。輸出參數(shù):無。返回值:無。例如:/*EnableDMA1Channe17*/DMA_Cmd(DMA1_Channe17,ENABLE);5.函數(shù)DMA_GetFlagStatus函數(shù)名:DMA_GetFlagStatus。函數(shù)原型:FlagStatusDMA_GetFlagStatus(uint32_tDMAy_FLAG)。功能描述:檢查指定的DMAy通道x標志位設置與否。輸入?yún)?shù):DMAyFLAG,待檢查的DMAy通道x標志位。輸出參數(shù):無。返回值:DMA_FLAG的新狀態(tài)(SET或者RESET)。例如:/*TestiftheDMA1Channe16halftransferinterruptflagissetornot*/FlagStatusStatus;Status=DMA_GetFlagStatus(DMA1_FLAG_HT6);6.函數(shù)DMA_ClearFlag函數(shù)名:DMA_ClearFlag。函數(shù)原型:voidDMA_ClearFlag(u32DMAy_FLAG)。功能描述:清除DMAy通道x待處理標志位。輸入?yún)?shù):DMAyFLAG,待清除的DMA標志位,使用操作符“|”可以同時選中多個DMA標志位。輸出參數(shù):無。返回值:無。例如:/*CleartheDMA1Channe13transfererrorinterruptpendingbit*/DMA_ClearFlag(DMA1_FLAG_TE3);7.函數(shù)DMA_ITConfig函數(shù)名:DMA_ITConfig。函數(shù)原型:voidDMA_ITConfig(DMA_Channel_TypeDef*DMAy_Channelx,u32DMA_IT,F(xiàn)unctionalStateNewState)。功能描述:使能或者失能指定的DMAy通道x中斷。輸入?yún)?shù)1:DMAyChannelx,選擇DMAy通道x。輸入?yún)?shù)2:DMA_IT,待使能或者失能的DMA中斷源,使用操作符“|”可以同時選中多個DMA中斷源。輸入?yún)?shù)3:NewState:DMA通道x中斷的新狀態(tài),這個參數(shù)可以取ENABLE或者DISABLE。輸出參數(shù):無。返回值:無。DMA_IT輸人參數(shù)DMA_IT使能或者失能DMAy通道x的中斷??梢匀”?0-12中的一個或者多個取值的組合作為該參數(shù)的值。表10-12DMA_IT值DMA_IT描述DMA_IT_TC傳輸完成中斷屏蔽DMA_IT_HT傳輸過半中斷屏蔽DMA_IT_TE傳輸錯誤中斷屏蔽例如:/*EnableDMA1Channe15completetransferinterrupt*/DMA_ITConfig(DMA1_Channe15,DMA_IT_TC,ENABLE);8.函數(shù)DMA_GetITStatus函數(shù)名:DMA_GetITStatus。函數(shù)原型:ITStatusDMA_GetITStatus(uint32_tDMAy_IT)。功能描述:檢查指定的DMAy通道x中斷發(fā)生與否。輸入?yún)?shù):DMAy_IT,待檢查的DMAy的通道x中斷源。輸出參數(shù):無。返回值:DMA_IT的新狀態(tài)(SET或者RESET)。10.4DMA應用實例本節(jié)講述一個從存儲器到外設的DMA應用實例。先定義一個數(shù)據(jù)變量,存于SRAM中,通過DMA的方式傳輸?shù)酱诘臄?shù)據(jù)寄存器,然后通過串口把這些數(shù)據(jù)發(fā)送到計算機顯示出來。DMA的應用廣泛,可完成外設到外設、外設到內(nèi)存、內(nèi)存到外設的傳輸,以使用中斷方式為例,其基本使用流程由3部分構成,即NVIC設置、DMA模式及中斷配置、DMA中斷服務。

1.NVIC設置NVIC設置用來完成中斷分組、中斷通道選擇、中斷優(yōu)先級設置及使能中斷的功能,流程圖如圖4-5所示。2.DMA模式及中斷配置DMA模式及中斷配置用來配置DMA工作模式及開啟DMA中斷,流程圖如圖10-2所示。DMA使用的是AHB總線,使用函數(shù)RCC_AHBPeriphClockCmd()開啟DMA時鐘。10.4.1DMA配置流程某外設的DMA通道外設基地址是由該設備的外設基地址加上相應數(shù)據(jù)儲存器的偏移地移地址(0x4c)得到的0x4001244C,即為ADC1的DMA通道外設基地址。如果使用內(nèi)存,則基地址為內(nèi)存數(shù)組地址。傳輸方向是針對外設說的,即外設為源或目標。緩沖區(qū)大小可以為0~65536。對于外設,應禁止地址自增;對于存儲器,則需要使用地址自增。數(shù)據(jù)寬度都有3種選擇,即字節(jié)、半字和字,應根據(jù)外設特點選擇相應的寬度。傳輸模式可選普通模式(傳輸一次)或者循環(huán)模式,內(nèi)存到內(nèi)存?zhèn)鬏敃r,只能選擇普通模式。以上參數(shù)在DMA_Init()函數(shù)中有詳細描述,這里不再贅述。圖10-2DMA模式與中斷配置流程圖3.DMA中斷服務進入定時器中斷后需根據(jù)設計完成響應操作,DMA中斷服務流程圖如圖10-3所示。啟動文件中定義了定時器中斷的入口,對于不同的中斷請求,要采用相應的中斷函數(shù)名。進入中斷后首先要檢測中斷請求是否為所需中斷,以防誤操作。如果是所需中斷,則進行中斷處理,中斷處理完成后清除中斷標志位,避免重復處于中斷。圖10-3DMA中斷服務程序流程圖存儲器到外設模式使用USART1功能,具體電路設置參考圖8-5,無需其他硬件設計。10.4

溫馨提示

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

評論

0/150

提交評論