19.7.1.3
定義傳輸源和目標存儲器
首先,要使用DMA傳輸,就肯定要有一個源地址和一個目標地址,這里我們定義SRC_Buffer數(shù)組的首地址作為源地址,DST_Buffer數(shù)組的首地址作為DMAC傳輸?shù)哪繕说刂贰RC_Buffer數(shù)組由于有const聲明為常量,因此其數(shù)據(jù)存儲在內(nèi)部Flash 中,DST_Buffer為普通的全局變量,其數(shù)據(jù)存儲在RAM中。這兩個數(shù)組的大小由宏定義BUFFER_SIZE來決定。
列表2:代碼清單20?1 定義傳輸源和目標存儲器
左右滑動查看完整內(nèi)容
// 用戶要發(fā)送的數(shù)據(jù)大小
#defineBUFFER_SIZE 32
/**
* 定義 SRC_Buffer 數(shù)組作為 DMAC 傳輸數(shù)據(jù)源
* const 關鍵字將 SRC_Buffer 數(shù)組變量定義為常量類型,數(shù)據(jù)存儲在內(nèi)部的 FLASH 中
*/
constuint32_tSRC_Buffer[BUFFER_SIZE] = {
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,
0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,
0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,
0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,
0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,
0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};
/**
* 定義 DMAC 傳輸目標存儲器
* 存儲在內(nèi)部的 SRAM 中
*/
uint32_tDST_Buffer[BUFFER_SIZE] = {0};
19.7.1.4
設置源地址和目標地址函數(shù)
DMAC傳輸?shù)呐渲茫梢赃x擇在FSP配置界面中進行配置,但是要注意,在FSP配置界面中進行配置的話是不方便配置傳輸?shù)刂返模源藭r我們其實還沒有配置傳輸?shù)脑吹刂泛湍繕说刂罚@部分需要在代碼里面配置。
列表3:代碼清單20?2 設置源地址和目標地址函數(shù)
左右滑動查看完整內(nèi)容
/* 設置傳輸?shù)脑吹刂泛湍康牡刂?*/ voidset_transfer_dst_src_address(transfer_cfg_tconst *constp_config, voidconst * volatile p_src, voidconst * volatile p_dest ) { p_config->p_info->p_src = (void*) p_src; p_config->p_info->p_dest = (void*) p_dest; }
19.7.1.5
使用FSP配置器生成的配置
前面我們在FSP配置界面上的配置其實是保存在hal_data.c文件中。如下圖所示。

我們完全可以在hal_data.c文件中找到定義好的數(shù)據(jù),重新復制一份,再改個變量名,在此基礎上重新配置各個參數(shù)。在本例程中也使用了這種方法,主要是為了使用宏去方便切換不同模式的配置代碼,在代碼中配置DMAC。在頭文件“bsp_dmac_m2m.h”中,默認定義了USE_MY_TRANSFER_INFOR_CONFIG來選擇使用我們在代碼里自定義的傳輸信息配置,但是現(xiàn)在讓我們先注釋掉這個宏定義,從而選擇使用在FSP配置界面上的配置。
下面的是與我們之前在FSP配置界面上的配置等效的配置代碼:
列表4:代碼清單20?3與FSP配置界面上的配置等效的配置代碼
左右滑動查看完整內(nèi)容
/* FSP 配置界面的傳輸信息配置(正常傳輸模式)等效于下面 fsp_transfer_info_normal 里
的配置(除了源地址和目標地址)
源地址和目標地址在 FSP 配置界面設置的話不太方便,我們會在 DMAC_Init 函數(shù)里設置。
關于偏移值(Offset value)和源緩沖大小(Source Buffer Size),在 transfer_info_
→t 里沒有這兩項設置,建議在 FSP 配置界面設置
- 偏移值只有在地址模式是偏移模式的情況下才會用到;
- 而源緩沖大小與之相關的功能本例程不會涉及到,所以暫不考慮。
下面的 fsp_transfer_info_normal 僅作為對比參考,在本例程中是沒有用到的。
*/
//transfer_info_t fsp_transfer_info_normal =
//{
// .transfer_settings_word_b.dest_addr_mode = TRANSFER_ADDR_MODE_FIXED,?
→//每次傳輸后,目標地址指針固定不變
// .transfer_settings_word_b.repeat_area = TRANSFER_REPEAT_AREA_
→SOURCE,//源區(qū)域重復 (正常模式下無效)
// .transfer_settings_word_b.irq = TRANSFER_IRQ_END, ?
→//傳輸完成后中斷
// .transfer_settings_word_b.chain_mode = TRANSFER_CHAIN_MODE_
→DISABLED,//不使能(DMAC 沒有該功能,僅 DTC 有)
// .transfer_settings_word_b.src_addr_mode = TRANSFER_ADDR_MODE_FIXED,?
→//每次傳輸后,源地址指針固定不變
// .transfer_settings_word_b.size = TRANSFER_SIZE_2_BYTE, ?
→//每次傳輸 2 字節(jié)
// .transfer_settings_word_b.mode = TRANSFER_MODE_NORMAL, ?
→//正常傳輸模式
// .p_dest = (void *) DST_Buffer, ?
→//目標地址
// .p_src = (void const *) SRC_Buffer,
→//源地址
// .num_blocks = 0, //指定傳輸?shù)膲K數(shù)(正常模式下無效,僅在重復、塊或
重復-塊模式下有效)
// .length = 1, //指定傳輸?shù)拈L度(即正常和重復模式下的傳輸次數(shù)?
→或 塊和重復-塊模式下傳輸?shù)膲K大小)
//};
// 按照上述傳輸信息配置,期待的正確傳輸結(jié)果為:
uint32_tExpected_DST_Buffer[BUFFER_SIZE] = {
0x00000304,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000,
0x00000000,0x00000000,0x00000000,0x00000000};
可以看到,上述代碼中的傳輸信息結(jié)構(gòu)體變量fsp_transfer_info_normal被完全注釋掉了,因為在本例程中,永遠不會用到該變量,即使取消了注釋也是一樣,雖然取消注釋后編譯也不會報錯。該變量在這里的目的僅是方便與我們之前在FSP配置界面上的傳輸配置進行比較,兩者的配置基本上是等效的。
本例程中需要用到的是Expected_DST_Buffer數(shù)組,其中保存的數(shù)據(jù)是根據(jù)源數(shù)據(jù)SRC_Buffer和當前的傳輸配置得出的正確結(jié)果,我們在進行實際上的傳輸結(jié)束后也應該在DST_Buffer數(shù)組中獲得這樣的數(shù)據(jù)。換句話說,SRC_Buffer保存了要傳輸?shù)脑磾?shù)據(jù),DST_Buffer保存了傳輸后的實際結(jié)果,Expected_DST_Buffer則保存的是傳輸后的正確結(jié)果,后面還會通過DST_Buffer與Expected_DST_Buffer數(shù)組中數(shù)據(jù)的對比,來判斷傳輸是否成功。
19.7.1.6
使用代碼配置:正常傳輸模式
下面是DMAC在正常模式下傳輸?shù)呐渲么a:
列表5:代碼清單20?4 DMAC正常傳輸模式配置
左右滑動查看完整內(nèi)容
/* 正常傳輸模式 */
transfer_info_tmy_transfer_info_normal =
{
.transfer_settings_word_b.dest_addr_mode = TRANSFER_ADDR_MODE_
→INCREMENTED,//每次傳輸后,目標地址指針都會增加
.transfer_settings_word_b.repeat_area = TRANSFER_REPEAT_AREA_SOURCE,
→//源區(qū)域重復 (正常模式下無效)
.transfer_settings_word_b.irq = TRANSFER_IRQ_END, ?
→//傳輸完成后中斷
.transfer_settings_word_b.chain_mode = TRANSFER_CHAIN_MODE_
→DISABLED,//不使能(DMAC 沒有該功能,僅 DTC 有)
.transfer_settings_word_b.src_addr_mode = TRANSFER_ADDR_MODE_
→INCREMENTED,//每次傳輸后,源地址指針都會增加
.transfer_settings_word_b.size = TRANSFER_SIZE_4_BYTE, ?
→//每次傳輸 4 字節(jié)
.transfer_settings_word_b.mode = TRANSFER_MODE_NORMAL, ?
→//正常傳輸模式
.p_dest = (void*) DST_Buffer, ?
→//目標地址
.p_src = (voidconst *) SRC_Buffer, ?
→//源地址
.num_blocks =0,//指定傳輸?shù)膲K數(shù)(正常模式下無效,僅在重復、塊或重
復-塊模式下有效)
.length = BUFFER_SIZE,//指定傳輸?shù)拈L度(即正常和重復模式下的傳輸次數(shù) 或?
→塊和重復-塊模式下傳輸?shù)膲K大小)
};
// 按照上述傳輸信息配置,期待的正確傳輸結(jié)果為:
uint32_tExpected_DST_Buffer[BUFFER_SIZE] = {
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,
0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,
0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,
0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,
0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,
0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};
注
在本例程中使用以上代碼需在頭文件“bsp_dmac_m2m.h”中定義宏USE_MY_TRANSFER_INFOR_CONFIG,并且 定義宏DMAC_TRANSFER_MODE等DMAC_TRANSFER_NORMAL_MODE來選擇。傳輸模式為:正常傳輸模式。
傳輸信息結(jié)構(gòu)體變量my_transfer_info_normal用于對DMAC的傳輸進行重配置。
讀者可跳到本章后面的“下載驗證”小節(jié),編譯并下載程序來驗證本實驗例程運行結(jié)果。
-
存儲器
+關注
關注
39文章
7745瀏覽量
171999 -
瑞薩
+關注
關注
37文章
22500瀏覽量
91009 -
函數(shù)
+關注
關注
3文章
4419瀏覽量
67708 -
dma
+關注
關注
3文章
582瀏覽量
106124
原文標題:定義傳輸源和目標存儲器——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(55)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
瑞薩RA系列MCU FSP庫開發(fā)實戰(zhàn)指南(09)存儲器映射
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之常用存儲器介紹
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環(huán)境
【瑞薩RA6E2地奇星開發(fā)板試用】介紹、環(huán)境搭建、工程測試
【瑞薩RA4系列開發(fā)板體驗】開發(fā)環(huán)境搭建和新手點燈指南
【瑞薩RA4系列開發(fā)板體驗】1、開發(fā)板要來了(1)
【瑞薩RA4系列開發(fā)板體驗】體驗過程
瑞薩推出SH7216系列32-位片上Flash存儲器MCU
瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南之定義傳輸源和目標存儲器
評論