【實驗環境】
【實驗步驟】
【思考題】
附錄:dma 庫函式
dma (direct memory access),直接儲存器訪問,是一種可以大大減輕cpu 工作量的資料訪問方式,因而被廣泛地使用。外設工作的時候,除了轉移資料,實質上是不需要核心進行干預的,而如果資料轉移的工作現在也交給了另乙個外設,那麼在該外設進行工作的時候,核心同時還可以進行其它操作。而stm32 的 dma 模組正是以類似外設的形式,新增到 cortex 核心之外,進行資料轉移工作的。
微控制器的硬體系統,通常主要由 cpu(核心)、外設、記憶體(sram)、匯流排等結構組成,在系統工作中,資料經常要在各項裝置之間進行轉移。通常情況下,在轉移資料的過程中會占用 cpu 十分寶貴的資源,所以我們希望 cpu 更多地被用在資料運算或響應中斷之中,而資料轉移的工作交由其它部件完成。dma 恰恰為 cpu 分擔了這部分資料轉移的工作。因為 dma 的存在, cpu 被解放出來,它可以在 dma 轉移資料的過程中同時進行資料運算,響應中斷,大大提高了系統的執行效率。
在 stm32 中,dma 的傳輸模式分為3種:
外設到儲存器的傳輸。
儲存器到儲存器的傳輸。
儲存器到外設的傳輸。
由 dma 控制器掛載在ahb(高階高效能匯流排)上,與核心共享資料匯流排。dma控制器在收到乙個傳輸命令後,開始訪問源位址暫存器中儲存的位址,並載入該位址對應的資料,然後將資料儲存到目標位址暫存器中指定的位址上去。在完成一次資料轉移後,dma內記錄資料總數的暫存器執行一次減一操作,然後根據預先設定的傳輸模式決定是否對源/目標位址進行位移操作。例如,若是從外設(gpio或其他有固定介面的裝置)到儲存器的傳輸,則在執行一次操作後,只需目標位址進行位移,源位址不變;而若是從儲存器到儲存器的傳輸,則需要同時將源位址和目標位址進行位移。
dma_inittypedef結構體引數的配置如下:
typedef
struct
dma_inittypedef;
dma_peripheralbaseaddr:外設位址,設定 dma_cpar 暫存器的值;一般設定為外設的資料暫存器位址,如果是儲存器到儲存器模式則設定為其中乙個儲存器位址。
dma_dir:傳輸方向選擇,可選外設到儲存器、儲存器到外設。它設定dma_ccr 暫存器的 dir[1:0]位的值。 這裡並沒有儲存器到儲存器的方向選擇,當使用儲存器到儲存器時,只需要把其中乙個儲存器當作外設使用即可。
dma_buffersize:設定待傳輸資料數目,初始化設定 dma_***tr 暫存器的值。
dma_peripheralinc:如果配置為 dma_peripheralinc_enable,使能外設位址自動遞增功能,它設定 dma_ccr 暫存器的 pinc 位的值;一般外設都是只有乙個資料暫存器,所以一般不會使能該位。
dma_memoryinc:如果配置為 dma_memoryinc_enable,使能儲存器位址自動遞增功能,它設定 dma_ccr 暫存器的 minc 位的值;我們自定義的儲存區一般都是存放多個資料的,所以要使能儲存器位址自動遞增功能。
dma_peripheraldatasize: 外設資料寬度,可選位元組(8 位)、半字(16位)和字(32位),它設定 dma_ccr 暫存器的 psize[1:0]位的值。
dma_memorydatasize:儲存器資料寬度,可選位元組(8 位)、半字(16 位)和字(32位),它設定 dma_ccr 暫存器的 msize[1:0]位的值。 當外設和儲存器之間傳資料時,兩邊的資料寬度應該設定為一致大小。
dma_mode: dma 傳輸模式選擇,可選一次傳輸或者迴圈傳輸,它設定dma_ccr 暫存器的 circ 位的值。 例程我們的 adc 採集是持續迴圈進行的,所以使用迴圈傳輸模式。
dma_priority:軟體設定通道的優先順序,有 4 個可選優先順序分別為非常高、高、中和低,它設定 dma_ccr 暫存器的 pl[1:0]位的值。 dma 通道優先順序只有在多個 dma 通道同時使用時才有意義,如果是單個通道,優先順序可以隨便設定。
dma_m2m:儲存器到儲存器模式 ,使用儲存器到儲存器時用到設定dma_ccr 的位14 men2men 即可啟動儲存器到儲存器模式。
圖1 實驗程式流程示意圖
keil 5,串列埠助手軟體
實驗場地:
無開啟已經建立好的工程模板,在新建立的工程模板中已經新增五個資料夾,分別命名為user、hardware、system、core、fwlib資料夾,如圖4所示。其中user資料夾存放的是主函式,hardware資料夾存放的是本實驗對應的硬體裝置函式,system存放的是本課程所有實驗通用的函式,core資料夾存放的是啟動檔案,fwlib資料夾存放的是底層驅動函式。在本實驗中,oled模組的裝置函式已經在oled.c的檔案中給出。
圖4 工程模板對應的資料夾
在hardware資料夾下新建兩個檔案,分別為dma.c和dma.h。分別存放dma控制函式與dma標頭檔案,如圖5所示。
圖5 在hardware資料夾下建立dma.c與dma.**件
2.1 開啟程式中的dma.c檔案,首先將dma.**件包含進來。其次對dma_config函式進行編寫,對dma的位址通訊模式等進行配置。
#include
"dma.h"
//包含標頭檔案
void
dma_config
(void
)
2.2 開啟dma.**件,新增dma_config 函式宣告及外部變數。
#ifndef __dma_h
#define __dma_h
#include
"sys.h"
extern uint16_t number_origin;
//引用已經定義的外部變數
extern uint16_t number_target;
//引用已經定義的外部變數
void
dma_config
(void);
//宣告函式
#endif
將工程編譯需要用到的標頭檔案包含進來。
#include
"stm32f10x.h"
//包含系統暫存器定義宣告的標頭檔案
#include
"sys.h"
//包含系統檔案
#include
"delay.h"
//包含延時函式標頭檔案
#include
"dma.h"
//包含dma標頭檔案
定義待轉移的源位址及目標位址。
uint16_t number_origin=
123;
//待轉移的源位址
uint16_t number_target=0;
//待轉移的目標位址
預定義oled螢幕顯示函式。
void
oled_show
(void);
//oled螢幕顯示函式
在主函式中呼叫延時函式與oled初始化函式。
delay_init()
;//呼叫延時函式
oled_init()
;//呼叫oled初始化函式
在主函式中,更新源位址內容並呼叫顯示函式。
int
main
(void
)}
在主函式下面新建oled_show函式,並編寫顯示函式。
void
oled_show
(void
)}
題目1: 下面哪條語句是設定串列埠資料寄存位址?(a)
a:dma_initstructure.dma_peripheralbaseaddr = 0x40004c04;
b:dma_initstructure.dma_dir = dma_dir_peripheraldst;
c:dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable;
d:dma_initstructure.dma_memoryinc = dma_memoryinc_enable;
題目2: 在dma進行資料轉移時,核心可以進行其它操作嗎?(a)
a:可以
b:不可以
題目1:dma的工作意義是什麼?
在轉移資料的過程中會占用 cpu 十分寶貴的資源,所以我們希望 cpu 更多地被用在資料運算或響應中斷之中,而資料轉移的工作交由其它部件完成。dma 正為 cpu 分擔了資料轉移的工作。因為 dma 的存在, cpu 被解放出來,它可以在 dma 轉移資料的過程中同時進行資料運算,響應中斷,大大提高效率。
實驗四 8237DMA控制器實驗
實驗內容 編寫程式,使用dma通道進行ram ram的通道傳送。將6264中0000 8000h 0000 80ff單元的資料傳送至0000 8200h 0000 82ffh單元中。本實驗中8237實驗位址從x20h x2fh 實驗 code segment assume 在 0000 8000h ...
ARM嵌入式實驗
問題 在startup.s中增加函式,由c程式呼叫,以此取得彙編中相關引數的設定值。獲取pll中m,p值,c程式呼叫彙編函式 在c語言中,要extern 乙個函式宣告即可,然後這個函式在彙編裡面實現。在彙編裡面,用export 把c語言定義的函式名引進來,再開始編寫函式名開始的段 實現 c程式呼叫 ...
嵌入式實驗5
實驗5 鍵盤中斷實驗 實驗日期 年月日 實驗目的 對鍵盤裝置驅動程式和應用軟體源 的剖析,使學生深入理解嵌入式系統中鍵盤裝置的工作原理及其軟體設計方法,以便進行後續的綜合實驗及開發工作。實驗儀器 pc機 嵌入式系統實驗箱 網線 串列埠線 實驗原理 查詢方式會浪費大量的處理器有效時間,而中斷方式是多工...