0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

瑞萨RA系列FSP库开发实战指南之DMAC在重复传输模式下的配置代码

瑞萨嵌入式小百科 来源:野火电子 2025-12-15 11:15 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

19.7.1.7

使用代码配置:重复传输模式

上面使用完正常传输模式,下面我们来试一下重复传输模式,其实无非就是在正常模式下多了可以指定重复传输的次数的功能,就变成了重复传输模式。可以结合地址递增模式、重复区域,来实现环形队列。

下面是DMAC在重复传输模式下传输的配置代码:

列表6:代码清单20‑5 DMAC重复传输模式配置

左右滑动查看完整内容

/* 重复传输模式 */
transfer_info_tmy_transfer_info_repeat =
{
.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_REPEAT, ␣
→//重复传输模式
.p_dest = (void*) DST_Buffer, ␣
→//目标地址
.p_src = (voidconst *) SRC_Buffer, ␣
→//源地址
.num_blocks =8,//指定传输的块数(正常模式下无效,仅在重复、块或重
复-块模式下有效)
.length =4,//指定传输的长度(即正常的传输次数或重复模式下重复
大小 或 块和重复-块模式下传输的块大小)
};
// 按照上述传输信息配置,期待的正确传输结果为:
uint32_tExpected_DST_Buffer[BUFFER_SIZE] = {
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10};

在本例程中使用以上代码需在头文件“bsp_dmac_m2m.h”中定义宏USE_MY_TRANSFER_INFOR_CONFIG,并且定义宏DMAC_TRANSFER_MODE等于DMAC_TRANSFER_REPEAT_MODE来选择传输模式为:重复传输模式

传输信息结构体变量my_transfer_info_repeat用于对DMAC的传输进行重配置。

读者可跳到本章后面的“下载验证”小节,编译并下载程序来验证本实验例程运行结果。

19.7.1.8

使用代码配置:块传输模式

下面是DMAC在块传输模式下传输的配置代码:

列表7:代码清单20‑6 DMAC块传输模式配置

左右滑动查看完整内容

/* 块传输模式 */
transfer_info_tmy_transfer_info_block =
{
.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_BLOCK, ␣
→//块传输模式
.p_dest = (void*) DST_Buffer, ␣
→//目标地址
.p_src = (voidconst *) SRC_Buffer, ␣


.num_blocks =4,//指定传输的块数(正常模式下无效,仅在重复、块或重
复-块模式下有效)
.length =8,//指定传输的长度(即正常的传输次数或重复模式下重复
大小 或 块和重复-块模式下传输的块大小)
};
// 按照上述传输信息配置,期待的正确传输结果为:
uint32_tExpected_DST_Buffer[BUFFER_SIZE] = {
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,
0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,
0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20};

在本例程中使用以上代码需在头文件“bsp_dmac_m2m.h”中定义宏USE_MY_TRANSFER_INFOR_CONFIG,并且定义宏DMAC_TRANSFER_MODE等于DMAC_TRANSFER_BLOCK_MODE来选择传输模式为:块传输模式

传输信息结构体变量my_transfer_info_block用于对DMAC的传输进行重配置。

读者可跳到本章后面的“下载验证”小节,编译并下载程序来验证本实验例程运行结果。

19.7.1.9

使用代码配置:重复-块传输模式

下面是DMAC在重复-块传输模式下传输的配置代码:

列表8:代码清单20‑7 DMAC重复-块传输模式配置

左右滑动查看完整内容

/* 重复-块传输模式 */
transfer_info_tmy_transfer_info_repeat_block =
{
.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_EACH, ␣
→//每次传输完成后都触发中断
.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_REPEAT_BLOCK,␣
→//重复-块传输模式
.p_dest = (void*) DST_Buffer, ␣
→//目标地址
.p_src = (voidconst *) SRC_Buffer, ␣
→//源地址
.num_blocks =4,//指定传输的块数(正常模式下无效,仅在重复、块或重
复-块模式下有效)
.length =2,//指定传输的长度(即正常的传输次数或重复模式下重复大
小 或 块和重复-块模式下传输的块大小)
};
// 按照上述传输信息配置,期待的正确传输结果为:
uint32_tExpected_DST_Buffer[BUFFER_SIZE] = {
0x01020304,0x01020304,0x01020304,0x01020304,
0x01020304,0x01020304,0x01020304,0x01020304,
0x01020304,0x01020304,0x01020304,0x01020304,
0x01020304,0x01020304,0x01020304,0x01020304,
0x01020304,0x01020304,0x01020304,0x01020304,
0x01020304,0x01020304,0x01020304,0x01020304,
0x01020304,0x01020304,0x01020304,0x01020304,
0x01020304,0x01020304,0x01020304,0x01020304};

在本例程中使用以上代码需在头文件“bsp_dmac_m2m.h”中定义宏USE_MY_TRANSFER_INFOR_CONFIG,并且定义宏DMAC_TRANSFER_MODE等于DMAC_TRANSFER_REPEAT_BLOCK_MODE来选择传输模式为:重复-块传输模式

传输信息结构体变量my_transfer_info_repeat_block用于对DMAC的传输进行重配置。

读者可跳到本章后面的“下载验证”小节,编译并下载程序来验证本实验例程运行结果。

19.7.1.10 DMAC初始化函数

若是使用FSP配置,需要设置传输地址,通过调用set_transfer_dst_src_address函数来设置。

然后,调用R_DMAC_Open函数打开DMAC。需要注意,R_DMAC_Open函数需要在set_transfer_dst_src_address函数之后调用,因为在R_DMAC_Open函数内部会根据我们的传输信息(包括传输地址等)来配置底层寄存器

若是使用代码配置DMAC的传输信息(即定义了宏USE_MY_TRANSFER_INFOR_CONFIG),则还需要对DMAC进行重配置,方法是调用R_DMAC_Reconfigure函数,并传入用于DMAC 的传输信息配置的结构体变量(比如my_transfer_info_normal)的首地址。

本例程中使用宏DMAC_TRANSFER_MODE来判断传输模式,并根据不同的传输模式选择使用以下的传输信息变量来进行重配置:my_transfer_info_normal / my_transfer_info_repeat /

my_transfer_info_repeat / my_transfer_info_block / my_transfer_info_repeat_block。

DMAC初始化函数如下所示:

列表9:代码清单20‑8 DMAC初始化函数

左右滑动查看完整内容

/* DMAC 初始化函数 */
voidDMAC_Init(void)
{
fsp_err_terr;
/* 使用 FSP 界面的配置:需要先重新设置传输的源地址和目的地址 */
#ifndefUSE_MY_TRANSFER_INFOR_CONFIG
set_transfer_dst_src_address(&g_transfer_dmac0_cfg, SRC_Buffer, DST_
→Buffer);
#endif
/* 打开 DMAC 模块 */
err =R_DMAC_Open(&g_transfer_dmac0_ctrl, &g_transfer_dmac0_cfg);
assert(FSP_SUCCESS == err);
/* 使用我们新的自定义的传输信息:重新配置传输 */
#ifdefUSE_MY_TRANSFER_INFOR_CONFIG
// 根据我们要使用的传输模式进行选择配置:
#if(DMAC_TRANSFER_MODE == DMAC_TRANSFER_NORMAL_MODE)//正常模式
err =R_DMAC_Reconfigure(&g_transfer_dmac0_ctrl, &my_transfer_info_
→normal);
assert(FSP_SUCCESS == err);
#elif(DMAC_TRANSFER_MODE == DMAC_TRANSFER_REPEAT_MODE)//重复模式
err =R_DMAC_Reconfigure(&g_transfer_dmac0_ctrl, &my_transfer_info_
→repeat);
assert(FSP_SUCCESS == err);
#elif(DMAC_TRANSFER_MODE == DMAC_TRANSFER_BLOCK_MODE)//块模式
err =R_DMAC_Reconfigure(&g_transfer_dmac0_ctrl, &my_transfer_info_
→block);
assert(FSP_SUCCESS == err);
#elif(DMAC_TRANSFER_MODE == DMAC_TRANSFER_REPEAT_BLOCK_MODE)//重复-块模式err = R_DMAC_Reconfigure(&g_transfer_dmac0_ctrl, &my_transfer_info_→repeat_block);assert(FSP_SUCCESS == err);#endif //DMAC_TRANSFER_MODE#endif //USE_MY_TRANSFER_INFOR_CONFIG}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4408

    浏览量

    66897
  • 代码
    +关注

    关注

    30

    文章

    4944

    浏览量

    73201
  • 初始化
    +关注

    关注

    0

    文章

    52

    浏览量

    12298

原文标题:使用代码配置:重复传输模式——瑞萨RA系列FSP库开发实战指南(56)

文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RA系列FSP开发实战指南定义传输源和目标存储器

    首先,要使用DMA传输,就肯定要有一个源地址和一个目标地址,这里我们定义SRC_Buffer数组的首地址作为源地址,DST_Buffer数组的首地址作为DMAC传输的目标地址。SRC_Buffer
    的头像 发表于 12-15 11:09 178次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b><b class='flag-5'>系列</b><b class='flag-5'>FSP</b><b class='flag-5'>库</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b><b class='flag-5'>指南</b><b class='flag-5'>之</b>定义<b class='flag-5'>传输</b>源和目标存储器

    灵活配置软件包FSP 6.2.0版本的更新内容

    FSP(Flexible Software Package)灵活配置软件包是电子(Renesas)为RA
    的头像 发表于 12-11 16:42 464次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b>灵活<b class='flag-5'>配置</b>软件包<b class='flag-5'>FSP</b> 6.2.0版本的更新内容

    RA6E2地奇星开发板试用】介绍、环境搭建、工程测试

    RA6E2开发板 - 立创开源硬件平台 . 开发环境 开发环境支持 e^2^ studio 和 Keil ,这里主要介绍和使用前者。 下载并安装
    发表于 12-07 15:27

    RA系列MCU中的DMAC和DTC关键特性对比

    FSP库里边的传输API可以由DMAC或者DTC实现,因此理论上来说我们可以DMAC和DTC之间切换使用。但是
    的头像 发表于 12-02 13:56 7635次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b><b class='flag-5'>系列</b>MCU中的<b class='flag-5'>DMAC</b>和DTC关键特性对比

    RA6E2】E2S软件安装过程,等待过程玩97_e2 studio_ZGZZ

    ;amp;vd_source=7ab92f6a337b22fda39554fd6e70f01a 本报告旨在记录基于RA6E2 MCU评估板的初步开发体验。主要内容包括: 软件
    发表于 12-01 22:42

    RA6E2】 配置Keil开发环境+使用按键控制LED+串口/调试器烧录程序

    不同的程序烧录方法 2. 开发体会 通过本次RA6E2评估板的实践开发,深刻体验到RA
    发表于 11-26 20:53

    RA2L1 MCU e² studio和FSP的使用指南

    本期“RA MCU众测宝典” 继续聚焦 “环境搭建” 专题,带大家走进【RA-Eco-RA2L1-48PIN-V1.0】的世界,查看e² studio和FSP的下载、安装及使用指南从零
    的头像 发表于 08-04 13:45 2474次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>2L1 MCU e² studio和<b class='flag-5'>FSP</b>的使用<b class='flag-5'>指南</b>

    RA4L1-SENSOR】DMAC传输数据

    中断请求激活时传输数据。 DTC 也可以不占用 CPU 的情况将数据传输,它的功能与 DMAC 的功能其实是相似的。 这里我们简单介绍
    发表于 07-05 08:23

    RA4L1-SENSOR】RA4L1-SENSOR开发版开箱评测+e2studio软件安装

    和调试的开发工具。 e2 studio 基于开源Eclipse IDE和与相关的C/C++开发工具(CDT)。 e2 studio 托管了
    发表于 06-12 23:23

    电子RA系列微控制器的可扩展性强的配置软件包 (FSP)安装下载与使用指南

    电子RA系列微控制器的可扩展性强的配置软件包 (FSP)安装下载与使用
    的头像 发表于 06-11 17:21 1411次阅读

    e²studio和Keil简介及如何安装e²studio开发环境

    (简称为e2或e2s)是电子的一款包含代码开发、构建和调试的开发工具。e²studio基于开源EclipseIDE和与
    的头像 发表于 03-13 17:27 2326次阅读
    e²studio和Keil简介及如何安装e²studio<b class='flag-5'>开发</b>环境

    RA2L1入门学习】RA2L1开发环境搭建

    e² studio 和 FSP 的下载、安装及使用指南 1. 什么是 e² studio 和 FSP? e² studio 是电子(Re
    发表于 03-07 11:33

    基于RA0E1开发板的ThreadX实时操作系统串口回显测试

    感谢立创提供测试机会,学到RA0及MCU的相关使用。使用FSP
    的头像 发表于 02-25 09:27 946次阅读
    基于<b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>0E1<b class='flag-5'>开发</b>板的ThreadX实时操作系统串口回显测试

    RA2L1入门学习】1. 点亮LED

    首次使用单片机,先说一使用感受。 本次学习使用的是RA-Eco-RA2L1-48PIN-V1.0开发板+e2studio(官方的集成
    发表于 01-29 22:17

    RA-Eco-RA4E2-64PIN-V1.0开发板试用】+小白折腾RA系列全过程02

    基本框架的软件,这个软件可以图形化设定引脚模式以及一键生成项目框架,生成的项目可以直接使用KEIL5来进行新增代码和删减代码RA 可扩展性强的配置
    发表于 12-22 13:08