STM32學(xué)習(xí)筆記(九)DMA(Direct memory access controller)

直接存儲器讀取

DMA簡介

直接存儲器存取(DMA)用來提供在外設(shè)和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸睛藻。無須CPU干預(yù),數(shù)據(jù)可以通過DMA快速地移動冈在,這就節(jié)省了CPU的資源來做其他操作按摘。

DMA框圖

由圖可見,DMA 一共有 DMA1 和 DMA2 兩個控制器炫贤。DMA1 有7個通道,DMA2 有5個通道侍郭。

在存儲器和存儲器之間傳輸數(shù)據(jù)時俩垃,可任選通道進(jìn)行傳輸汰寓;但在外設(shè)和存儲器之間傳輸數(shù)據(jù)時,需要用到專用的通道跃闹。

各個通道的 DMA1 請求
各個通道的 DMA2 請求

DMA寄存器

  • 中斷狀態(tài)寄存器 --- ISR(interrupt status register):存放DMA中斷的標(biāo)志位望艺;

    • 注意:若為DMA2肌访,只有低19位有效找默;
    • 作用---傳輸錯誤(TE)標(biāo)志位:位3,7,11,15,19,23,27惩激,發(fā)生傳輸錯誤時置1;
    • 作用---半傳輸(HT)標(biāo)志位:位2,6,10,14,18,22,26顷蟀,傳輸了一半數(shù)據(jù)并產(chǎn)生對應(yīng)事件時置1骡技;
    • 作用---傳輸完成(TC)標(biāo)志位:位1,5,9,13,17,21,25,傳輸完成并產(chǎn)生了對應(yīng)事件時置1囤萤;
    • 作用---全局中斷(GI)標(biāo)志位:位0,4,8,12,16,20,24是趴,上述3個寄存器任一寄存器置1,該寄存器置1右遭;
    • 復(fù)位值:0x0000 0000
  • 中斷標(biāo)志清除寄存器 --- IFCR(interrupt flag clear register):清除ISR中DMA中斷的標(biāo)志位;

    • 注意:若為DMA2吹榴,只有低19位有效滚婉;
    • 作用---清除傳輸錯誤(TE)標(biāo)志位:位3,7,11,15,19,23,27,置1時將 TE 置0远剩;
    • 作用---清除半傳輸(HT)標(biāo)志位:位2,6,10,14,18,22,26骇窍,置1時將 HT 置0;
    • 作用---清除傳輸完成(TC)標(biāo)志位:位1,5,9,13,17,21,25腹纳,置1時將 TC 置0;
    • 作用---清除全局中斷(GI)標(biāo)志位:位0,4,8,12,16,20,24足画,置1時將 TE佃牛、HT、TC寄存器均置0象缀;
    • 復(fù)位值:0x0000 0000
  • 通道x配置寄存器 --- CCRx(channel x configuration register):設(shè)置通道x的各項配置;

    • 注意:若為DMA1娃胆,該寄存器有7組(即x可為 0~7)等曼;DMA2 就只有5組;
    • 作用---開啟通道:位0 置1時通道開啟禁谦,置0時關(guān)閉;
    • 作用---允許傳輸完成(TC)中斷:位1丧蘸,置1時允許產(chǎn)生傳輸完成中斷(可檢測TC標(biāo)志位查看是否產(chǎn)生) 遥皂;
    • 作用---允許半傳輸(HT)中斷:位2,置1時允許產(chǎn)生半傳輸中斷弟孟;
    • 作用---允許傳輸錯誤(TE)中斷:位3样悟,置1時允許產(chǎn)生傳輸錯誤中斷;
    • 作用---設(shè)置數(shù)據(jù)來源:位4陈症,置0時表示從外設(shè)讀取數(shù)據(jù)震糖,置1時表示從存儲器讀取數(shù)據(jù);
    • 注意:若是存儲器到存儲器嘁信,則一般把發(fā)送存儲器當(dāng)作外設(shè)來進(jìn)行設(shè)置疏叨,位14 再置1即可穿剖;
    • 作用---設(shè)置是否循環(huán)操作:位5,置0時表示只讀取1次數(shù)據(jù)秀又,置1時表示循環(huán)讀取該數(shù)據(jù);
    • 作用---設(shè)置外設(shè)地址增量模式:位6吐辙,置0時傳輸數(shù)據(jù)時外設(shè)地址不增加,置1則為增加尊沸;
    • 作用---設(shè)置存儲器地址增量模式:位7贤惯,置0時傳輸數(shù)據(jù)時存儲器地址不增加,置1則為增加屁商;
    • 作用---設(shè)置外設(shè)數(shù)據(jù)寬度:位9:8颈墅;00為8位,01為16位帽哑,10為32位叹俏,11為保留;
    • 作用---設(shè)置存儲器數(shù)據(jù)寬度:位11:10粘驰;00為8位蝌数,01為16位,10為32位顶伞,11為保留;
    • 作用---設(shè)置通道的優(yōu)先級:位13:12滑潘,00為低锨咙,01為中,10為高粹舵,11為最高;
    • 注意:當(dāng)通道優(yōu)先級相同時巴席,DMA1通道比DMA2通道優(yōu)先級高诅需,DMAx比DMAy通道優(yōu)先級高(x<y);
    • 作用---設(shè)置存儲器和存儲器之間傳輸:位14毡证,置0表示是外設(shè)和存儲器之間傳輸蔫仙,置1表示是存儲器和存儲器之間傳輸;
    • 復(fù)位值:0x0000 0000
  • 通道x傳輸數(shù)量寄存器 --- CNDTRx(channel x number of data register):設(shè)置通道x需要傳輸?shù)臄?shù)據(jù)個數(shù)恤煞;

    • 注意:若為DMA1施籍,該寄存器有7組(即x可為 0~7);DMA2 就只有5組丑慎;
    • 作用---設(shè)置需要傳輸?shù)臄?shù)據(jù)的個數(shù):位15:0竿裂,表示需要傳輸?shù)臄?shù)據(jù)的個數(shù)(易知一次最多只能傳輸65335個數(shù)據(jù));
  • DMA通道x外設(shè)地址寄存器 --- CPARx(channel x peripheral address register):存儲在外設(shè)中需要傳輸?shù)臄?shù)據(jù)的地址腻异;

    • 注意:若為DMA1悔常,該寄存器有7組(即x可為 0~7);DMA2 就只有5組机打;
    • 作用---存儲地址:位31:0姐帚,存儲在外設(shè)中需要傳輸?shù)臄?shù)據(jù)的地址障涯;
  • DMA通道x存儲器地址寄存器 --- CMARx(channel x memory address register):存儲在存儲器中需要傳輸?shù)臄?shù)據(jù)的地址膳汪;

    • 注意:若為DMA1九秀,該寄存器有7組(即x可為 0~7);DMA2 就只有5組痹换;
    • 作用---存儲地址:位31:0都弹,存儲在存儲器中需要傳輸?shù)臄?shù)據(jù)的地址;

常用DMA固件庫函數(shù) (stm32f10x_dma.h)

USART初始化函數(shù) --- USART_Init

void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);
  • DMAy_Channelx:選擇通道端口冯痢,y可為 1~2 框杜,y=1時x可為 1~7 ,y=2時x可為 1~5 振劳;
  • DMA_InitStructDMA_InitTypeDef 結(jié)構(gòu)體
    • DMA_MemoryBaseAddr:存儲器(發(fā)送或?qū)⒁邮盏模?shù)據(jù)地址油狂;
    • DMA_PeripheralBaseAddr:外設(shè)(發(fā)送或?qū)⒁邮盏模?shù)據(jù)地址;
    • DMA_DIR:數(shù)據(jù)傳輸方向夹供,可選 外設(shè)為源(PeripheralSRC)仁堪、外設(shè)為目標(biāo)(PeripheralDST);
    • DMA_BufferSize:傳輸?shù)臄?shù)據(jù)的個數(shù)鸟辅,最大為65335莺葫;
    • DMA_PeripheralInc:外設(shè)是否啟動增量模式( Enable 或 Disable);
    • DMA_PeripheralDataSize:外設(shè)數(shù)據(jù)的字長再层;
    • DMA_MemoryInc:存儲器是否啟動增量模式( Enable 或 Disable);
    • DMA_MemoryDataSize:存儲器數(shù)據(jù)的字長蒿秦;
    • DMA_Mode:是否循環(huán)傳輸數(shù)據(jù)蛋济,( Normal 或 Circular );
    • DMA_Priority:該通道優(yōu)先級渡处,可為 低(Low)祟辟、中(Medium)、高(High)旧困、超高(VeryHigh)叮喳;
    • DMA_M2M:是否是存儲器和存儲器之間的傳輸,是(Enable) 或 不是(Disable)馍悟;
  • 示例:
// DMA_M2M 初始化
//定義DMA初始化結(jié)構(gòu)體
DMA_InitTypeDef DMA_InitStructure;
    
//打開DMA1時鐘
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//配置DMA
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)aSRC_Const_Buffer;         //源數(shù)據(jù)地址
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)aDST_Buffer;           //目標(biāo)數(shù)據(jù)地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                          //設(shè)置外設(shè)(Flash)為源
    
DMA_InitStructure.DMA_BufferSize = 8;                                       //配置傳輸數(shù)據(jù)的個數(shù)為8
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;             //外設(shè)(源)設(shè)置為增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;     //外設(shè)數(shù)據(jù)字長設(shè)置為32位
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                     //存儲(SRAM)設(shè)置為增量模式
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;             //存儲數(shù)據(jù)字長設(shè)置為32位

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                               //只發(fā)送一次數(shù)據(jù)(非循環(huán)發(fā)送)
DMA_InitStructure.DMA_Priority = DMA_Priority_High;                         //設(shè)置為高優(yōu)先級
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;                                 //打開 M2M

//初始化DMA通道
DMA_Init(DMA1_Channel6, &DMA_InitStructure);

DMA清除標(biāo)志位函數(shù) --- DMA_ClearFlag

void DMA_ClearFlag(uint32_t DMAy_FLAG);
  • DMAy_FLAG:對應(yīng)的標(biāo)志位侵状,y可以為 1~2 毅整;
    DMA1的標(biāo)志位

DMA通道使能函數(shù) --- DMA_Cmd

DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
  • DMAy_Channelx:選擇通道端口悼嫉,y可為 1~2 ,y=1時x可為 1~7 戏蔑,y=2時x可為 1~5 ;
  • NewState:使能或關(guān)閉鳍寂,ENABLE情龄、DISABLE捍壤;
  • 示例:
//使能DMA1的通道6
DMA_Cmd(DMA1_Channel6, ENABLE);

DMA獲取標(biāo)志位函數(shù) --- DMA_GetFlagStatus

FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
  • DMAy_FLAG:對應(yīng)的標(biāo)志位鹃觉,y可以為 1~2硬霍;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笼裳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拜轨,更是在濱河造成了極大的恐慌允青,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件法牲,死亡現(xiàn)場離奇詭異拒垃,居然都是意外死亡瓷蛙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門横堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冠桃,“玉大人,你說我怎么就攤上這事胸蛛√嫉埃” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵玷室,是天一觀的道長。 經(jīng)常有香客問我敌蜂,道長津肛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任秸脱,我火速辦了婚禮部蛇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巷查。我一直安慰自己抹腿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布崇败。 她就那樣靜靜地躺著房蝉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咧擂。 梳的紋絲不亂的頭發(fā)上檀蹋,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天俯逾,我揣著相機與錄音,去河邊找鬼桌肴。 笑死,一個胖子當(dāng)著我的面吹牛坠七,可吹牛的內(nèi)容都是我干的旗笔。 我是一名探鬼主播拄踪,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惶桐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贿衍?” 一聲冷哼從身側(cè)響起叛拷,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤岂却,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后署浩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫尺,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡正驻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了襟交。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伤靠。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖焕梅,靈堂內(nèi)的尸體忽然破棺而出卦洽,到底是詐尸還是另有隱情,我是刑警寧澤该窗,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站粗梭,受9級特大地震影響级零,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鉴嗤,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一序调、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硬耍,春花似錦边酒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至引润,卻和暖如春赴背,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凰荚。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工便瑟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人到涂。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像沉御,于是被迫代替她去往敵國和親昭灵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容