19.7.1.3
定义传输源和目标存储器
首先,要使用DMA传输,就肯定要有一个源地址和一个目标地址,这里我们定义SRC_Buffer数组的首地址作为源地址,DST_Buffer数组的首地址作为DMAC传输的目标地址。SRC_Buffer数组由于有const声明为常量,因此其数据存储在内部Flash 中,DST_Buffer为普通的全局变量,其数据存储在RAM中。这两个数组的大小由宏定义BUFFER_SIZE来决定。
列表2:代码清单20‑1 定义传输源和目标存储器
左右滑动查看完整内容
// 用户要发送的数据大小
#defineBUFFER_SIZE 32
/**
* 定义 SRC_Buffer 数组作为 DMAC 传输数据源
* const 关键字将 SRC_Buffer 数组变量定义为常量类型,数据存储在内部的 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 传输目标存储器
* 存储在内部的 SRAM 中
*/
uint32_tDST_Buffer[BUFFER_SIZE] = {0};
19.7.1.4
设置源地址和目标地址函数
DMAC传输的配置,可以选择在FSP配置界面中进行配置,但是要注意,在FSP配置界面中进行配置的话是不方便配置传输地址的,所以此时我们其实还没有配置传输的源地址和目标地址,这部分需要在代码里面配置。
列表3:代码清单20‑2 设置源地址和目标地址函数
左右滑动查看完整内容
/* 设置传输的源地址和目的地址 */ 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文件中找到定义好的数据,重新复制一份,再改个变量名,在此基础上重新配置各个参数。在本例程中也使用了这种方法,主要是为了使用宏去方便切换不同模式的配置代码,在代码中配置DMAC。在头文件“bsp_dmac_m2m.h”中,默认定义了USE_MY_TRANSFER_INFOR_CONFIG来选择使用我们在代码里自定义的传输信息配置,但是现在让我们先注释掉这个宏定义,从而选择使用在FSP配置界面上的配置。
下面的是与我们之前在FSP配置界面上的配置等效的配置代码:
列表4:代码清单20‑3与FSP配置界面上的配置等效的配置代码
左右滑动查看完整内容
/* FSP 配置界面的传输信息配置(正常传输模式)等效于下面 fsp_transfer_info_normal 里
的配置(除了源地址和目标地址)
源地址和目标地址在 FSP 配置界面设置的话不太方便,我们会在 DMAC_Init 函数里设置。
关于偏移值(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,//源区域重复 (正常模式下无效)
// .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 字节
// .transfer_settings_word_b.mode = TRANSFER_MODE_NORMAL, ␣
→//正常传输模式
// .p_dest = (void *) DST_Buffer, ␣
→//目标地址
// .p_src = (void const *) SRC_Buffer,
→//源地址
// .num_blocks = 0, //指定传输的块数(正常模式下无效,仅在重复、块或
重复-块模式下有效)
// .length = 1, //指定传输的长度(即正常和重复模式下的传输次数␣
→或 块和重复-块模式下传输的块大小)
//};
// 按照上述传输信息配置,期待的正确传输结果为:
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};
可以看到,上述代码中的传输信息结构体变量fsp_transfer_info_normal被完全注释掉了,因为在本例程中,永远不会用到该变量,即使取消了注释也是一样,虽然取消注释后编译也不会报错。该变量在这里的目的仅是方便与我们之前在FSP配置界面上的传输配置进行比较,两者的配置基本上是等效的。
本例程中需要用到的是Expected_DST_Buffer数组,其中保存的数据是根据源数据SRC_Buffer和当前的传输配置得出的正确结果,我们在进行实际上的传输结束后也应该在DST_Buffer数组中获得这样的数据。换句话说,SRC_Buffer保存了要传输的源数据,DST_Buffer保存了传输后的实际结果,Expected_DST_Buffer则保存的是传输后的正确结果,后面还会通过DST_Buffer与Expected_DST_Buffer数组中数据的对比,来判断传输是否成功。
19.7.1.6
使用代码配置:正常传输模式
下面是DMAC在正常模式下传输的配置代码:
列表5:代码清单20‑4 DMAC正常传输模式配置
左右滑动查看完整内容
/* 正常传输模式 */
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,
→//源区域重复 (正常模式下无效)
.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 字节
.transfer_settings_word_b.mode = TRANSFER_MODE_NORMAL, ␣
→//正常传输模式
.p_dest = (void*) DST_Buffer, ␣
→//目标地址
.p_src = (voidconst *) SRC_Buffer, ␣
→//源地址
.num_blocks =0,//指定传输的块数(正常模式下无效,仅在重复、块或重
复-块模式下有效)
.length = BUFFER_SIZE,//指定传输的长度(即正常和重复模式下的传输次数 或␣
→块和重复-块模式下传输的块大小)
};
// 按照上述传输信息配置,期待的正确传输结果为:
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来选择。传输模式为:正常传输模式。
传输信息结构体变量my_transfer_info_normal用于对DMAC的传输进行重配置。
读者可跳到本章后面的“下载验证”小节,编译并下载程序来验证本实验例程运行结果。
-
存储器
+关注
关注
39文章
7716浏览量
170926 -
瑞萨
+关注
关注
36文章
22434浏览量
89839 -
函数
+关注
关注
3文章
4408浏览量
66899 -
dma
+关注
关注
3文章
578浏览量
105391
原文标题:定义传输源和目标存储器——瑞萨RA系列FSP库开发实战指南(55)
文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
瑞萨RA系列MCU FSP库开发实战指南(09)存储器映射
瑞萨e2studio(1)----瑞萨芯片之搭建FSP环境
【瑞萨RA2L1入门学习】RA2L1开发环境搭建
【瑞萨RA6E2地奇星开发板试用】介绍、环境搭建、工程测试
【瑞萨RA4系列开发板体验】体验过程
瑞萨推出SH7216系列32-位片上Flash存储器MCU

瑞萨RA系列FSP库开发实战指南之定义传输源和目标存储器
评论