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

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

3天内不再提示

瑞萨RA系列FSP库开发实战指南之DMAC中断回调函数等

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

扫码添加小助手

加入工程师交流群

19.7.1.11

DMAC中断回调函数

DMAC中断回调函数如下所示:

列表10: 代码清单20‑9DMAC中断回调函数

左右滑动查看完整内容

// DMA 传输完成标志位
volatilebool dmac0_complete_transmission_sign =false;
// 传输次数计数(中断次数)
volatileuint16_t dmac0_transfer_count;
/* DMAC 中断回调函数 */
voiddmac0_callback(dmac_callback_args_t *p_args)
{
(void)(p_args);
dmac0_complete_transmission_sign =true;
dmac0_transfer_count ++;
}

dmac0_transfer_count用于记录DMAC产生中断的次数。

19.7.1.12

hal_entry 入口函数

在hal_entry函数中,程序遵循以下步骤来执行:

调用DMAC_Init函数初始化DMAC。

调用R_DMAC_Enable函数使能DMAC使之可以响应传输请求。

调用R_DMAC_SoftwareStart函数来发起软件触发请求信号来启动DMAC传输。

通过一定的延时等待所有传输完成,因为在产生多次的中断的情况下,仅通过中断标志位判断可能出错。

在传输完成之后,比较传输目标地址的数据(DST_Buffer)和期待的正确数据(Expected_DST_Buffer)是否一致。

传入R_DMAC_SoftwareStart函数的参数 TRANSFER_START_MODE_SINGLE和TRANS-FER_START_MODE_REPEAT的区别如下:

传入参数为TRANSFER_START_MODE_SINGLE时,正常模式和重复模式下每发起一次软件请求只会传输一个数据单元大小(transfer_size_tsize)的数据。块模式下则是只会传输一个块大小(transfer_info_t::length)的数据。

传入参数为TRANSFER_START_MODE_REPEAT时,会自动重复地触发传输,期间可能会产生多次中断,直至所有数据都传输完成为止。

hal_entry入口函数如下所示。

列表11:代码清单20‑10hal_entry入口函数

左右滑动查看完整内容

/*用户头文件包含*/
#include"led/bsp_led.h"
#include"debug_uart/bsp_debug_uart.h"
#include"dmac/bsp_dmac_m2m.h"
externconstuint32_tSRC_Buffer[BUFFER_SIZE];
externuint32_tDST_Buffer[BUFFER_SIZE];
externuint32_tExpected_DST_Buffer[BUFFER_SIZE];
externvolatilebooldmac0_complete_transmission_sign;
externvolatileuint16_tdmac0_transfer_count;
uint8_tBufferCompare(constuint32_t*pBuffer1,constuint32_t*pBuffer2,␣
→uint16_tBufferLength);
voidBufferShow_HexData(constuint32_t*pBuffer,uint16_tBufferLength);
voidhal_entry(void)
{
/*TODO:addyourowncodehere*/
fsp_err_terr= FSP_SUCCESS;
uint8_tres;
LED_Init();
// LED 初始化
Debug_UART4_Init();// SCI4 UART 调试串口初始化
/* 初始化 DMAC */
DMAC_Init();
dmac0_complete_transmission_sign =false;//传输完成标志位清零
printf("这是一个 DMAC 存储器到存储器的传输实验例程
");
printf("打开串口助手,查看接收窗口打印的相关提示信息
");
printf("观察板载 LED 灯,本实验使用两个 LED 灯来指示 DMAC 传输结果
");
printf("- DMA 数据传输失败,则 LED1 亮(红色)
");
printf("- DMA 数据传输成功,则 LED2 亮(蓝色)
");
printf("--------------------------------------------
");
/* 使能 DMAC 使之可以响应传输请求 */
R_DMAC_Enable(&g_transfer_dmac0_ctrl);
/************************************/
/* 使用软件触发的方式启动 DMAC 传输 */
/************************************/
#ifndefUSE_MY_TRANSFER_INFOR_CONFIG
/* 根据 FSP 配置界面的传输信息配置进行传输 */
//可以用下面这种方式:
R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_
→REPEAT);
//也可以用这种方式:
//for (uint16_t i = 0; i < 1; i++)
//{
//
err = R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_
→START_MODE_SINGLE);
//
assert(FSP_SUCCESS == err);
//}
#else// 下面的这些是使用自定义的传输配置信息配置
#if (DMAC_TRANSFER_MODE == DMAC_TRANSFER_NORMAL_MODE)
(相当于重复次数为 1 的重复模式)
//可以用下面这种方式:
R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_
→REPEAT);
//也可以用这种方式:
//for (uint16_t i = 0; i < BUFFER_SIZE; i++)
//{
//
//正常模式
err = R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_
→START_MODE_SINGLE);
//
assert(FSP_SUCCESS == err);
//}
#elif (DMAC_TRANSFER_MODE == DMAC_TRANSFER_REPEAT_MODE)
//可以用下面这种方式:
R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_
→REPEAT);
//也可以用这种方式:
//for (uint16_t i = 0; i < BUFFER_SIZE; i++)
//{
//
//重复模式
err = R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_
→START_MODE_SINGLE);
//
assert(FSP_SUCCESS == err);
//}
#elif (DMAC_TRANSFER_MODE == DMAC_TRANSFER_BLOCK_MODE)
//可以用下面这种方式:
R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_
→REPEAT);
//块模式
//也可以用这种方式:
//for (uint16_t i = 0; i < 4; i++)
//{
//
err = R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_
→START_MODE_SINGLE);
//
assert(FSP_SUCCESS == err);
//
//
出错
//
//}
//加个小延时,确保 DMAC 通道 0 传输完成之后才再次软件触发启动,否则传输可能
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
#elif (DMAC_TRANSFER_MODE == DMAC_TRANSFER_REPEAT_BLOCK_MODE) //重复-块模
式
//可以用下面这种方式:
R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_START_MODE_
→REPEAT);
//也可以用这种方式:
//for (uint16_t i = 0; i < 4; i++)
//{
//
err = R_DMAC_SoftwareStart(&g_transfer_dmac0_ctrl, TRANSFER_
→START_MODE_SINGLE);
//
assert(FSP_SUCCESS == err);
//
//
出错
//
//}
//加个小延时,确保 DMAC 通道 0 传输完成之后才再次软件触发启动,否则传输可能
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
#endif//DMAC_TRANSFER_MODE
#endif//USE_MY_TRANSFER_INFOR_CONFIG
/* 判断传输完成中断(需至少触发过 1 次) */
while (false == dmac0_complete_transmission_sign);
/* 等待所有传输完成(如果是 TRANSFER_IRQ_EACH 模式,传输过程中可能会触发多次中断)
*/
R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MILLISECONDS); //加上延时确保所
有传输都已完成
printf("
传输计数(中断次数):dmac0_transfer_count = %d
", dmac0_
→transfer_count);
/* 将传输后的数据与我们所期待的结果相比较 */
res = BufferCompare(DST_Buffer, Expected_DST_Buffer, BUFFER_SIZE);
printf("传输结果:");
/* 根据两者数据的比较结果进行判断 */
if( res != 0)
{
/* 源数据与传输后数据不相等时,LED1 亮(红色),表示传输失败 */
LED1_ON;
printf("< 传输失败>
");
}
else
{
/*源数据与传输后数据相等时,LED1亮(蓝色),表示传输成功*/
LED2_ON;
printf("<传输成功>
");
}
printf("
SRC:");
BufferShow_HexData(SRC_Buffer,BUFFER_SIZE);
printf("
DST:(应与Expected_DST一致)");
BufferShow_HexData(DST_Buffer,BUFFER_SIZE);
printf("
Expected_DST:");
BufferShow_HexData(Expected_DST_Buffer,BUFFER_SIZE);
while(1)
{
}
#ifBSP_TZ_SECURE_BUILD
/*Enternon-securecode*/
R_BSP_NonSecureEnter();
#endif
}

19.7.1.13

缓冲区数据比较函数

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

列表12:代码清单20‑11缓冲区数据比较函数

左右滑动查看完整内容

/*缓冲区数据比较函数
返回0表示两个缓冲区数据一致
*/
uint8_tBufferCompare(constuint32_t*pBuffer1,constuint32_t*pBuffer2,␣
→uint16_tBufferLength)
{
/*数据长度递减*/
while(BufferLength--)
{
/*判断两个数据源是否对应相等*/
if(*pBuffer1!= *pBuffer2)
{
/*对应数据源不相等马上退出函数,并返回1*/
return1;
}
/*递增两个数据源的地址指针*/
pBuffer1++;
pBuffer2++;
}
/*完成判断并且两组数据完全一致*/
return0;
}

19.7.1.14

打印缓冲区数据函数

列表13:代码清单20‑12打印缓冲区数据函数

左右滑动查看完整内容

/*打印缓冲区数据函数
打印缓冲区数据:十六进制格式
*/
voidBufferShow_HexData(constuint32_t*pBuffer,uint16_tBufferLength)
{
while(BufferLength)
{
if((BufferLength%4)==0)
printf("
	");
printf("0x%08X",*pBuffer);
pBuffer++;
BufferLength--;
}
printf("
");
}

19.7.2

下载验证

首先通过宏USE_MY_TRANSFER_INFOR_CONFIG(在bsp_dmac_m2m.h文件中)来选择是使用我们自定义的传输信息,还是使用在FSP配置界面配置的传输信息。

其次通过宏DMAC_TRANSFER_MODE(在bsp_dmac_m2m.h文件中)来选择不同的传输模式。

最后编译工程并下载到开发板上,打开串口助手可以查看程序运行打印的提示信息。如果DMAC传输成功,则蓝色LED2亮起,如果传输失败则红色LED1亮起。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    920

    浏览量

    43868
  • 编译
    +关注

    关注

    0

    文章

    696

    浏览量

    35275
  • 回调函数
    +关注

    关注

    0

    文章

    95

    浏览量

    12236

原文标题:DMAC中断回调函数等——瑞萨RA系列FSP库开发实战指南(57)

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RA系列FSP开发实战指南DMAC+UART串口收发实验

    拷贝一份我们之前的e2s工程“19_UART_Receive_Send”,然后将工程文件夹重命名为“20_DMAC_Using_UART”,最后再将它导入到我们的e2studio工作空间中。
    的头像 发表于 12-26 09:28 4501次阅读
    <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'>DMAC</b>+UART串口收发实验

    RA系列FSP开发实战指南I2C读写EEPROM实验

    使用官方提供的FPS进行编程,官方提供的FPS具有方便、快捷、简洁的特性。
    的头像 发表于 01-27 10:02 3751次阅读
    <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>I2C读写EEPROM实验

    RA6M4系列DMAC和ADC的详细介绍(1)

    ADC在产品设计中是非常常用的MCU外设模块,当在某些复杂的应用下需要非常快的采样速度时,使用DMA进行数据搬运,可以更便捷的来实现对数据的高效搬运,结合本例在FSP上轻松配置您的所需,同时也让我们了解一下
    的头像 发表于 11-29 12:14 3720次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>6M4<b class='flag-5'>系列</b><b class='flag-5'>DMAC</b>和ADC的详细介绍(1)

    e2studio(1)----芯片搭建FSP环境

    视频教学 样品申请 请勿添加外链 e2studio软件 e2studio是的集成开发环境,FSP 提供了众多可提高效率的工具,用于开发
    发表于 09-30 15:28

    RA4系列开发板体验】开发环境搭建和新手点灯指南

    RA4系列开发板体验】开发环境搭建和新手点灯指南
    发表于 11-24 22:54

    RA4系列开发板体验】10. 我的试用总结

    之前发帖:【RA4系列开发板体验】1. 新建工程+按键控制LED【
    发表于 12-10 22:34

    RA4系列开发板体验】体验过程

    拿到板子之后,做了几个实验过程,过程如下:1、在好奇心驱动下,逐步接触;参照网上的实例,学习开发环境一、开箱验货二、搭建环境参考“ 【
    发表于 12-18 16:20

    【野火启明6M5开发板体验】开箱+认识开发板+资料

    按键检测29. WiFi——模块通讯板尺寸:3、资料:*附件:[野火EmbedFire]《RA系列FSP
    发表于 12-20 23:28

    STM32Cube HAL中断处理机制 以及函数实现原理

    STM32Cube HAL中断处理机制,以及函数实现原理
    的头像 发表于 03-03 14:01 1.5w次阅读

    HAL中断处理以及相关的函数

    驱动的开发时间,把重心放在应用代码上。   但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数(API接口),以及HAL中断
    的头像 发表于 01-07 11:46 1.1w次阅读
    HAL<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>

    【有奖直播预报名】电子RA系列产品开发工具FSP4.0.0新特性介绍

    为使用电子RA系列ARM微控制器的嵌入式系统设计提供简单易用且可扩展的高质量软件。 直播主题
    的头像 发表于 11-22 12:20 1689次阅读

    【视频教程】RA单片机FSP开发(3)FSP架构-解释Blinky架构[上]

    干货分享 前篇回顾 【视频教程】RA单片机FSP开发(1)环境搭建(带RASC) 【视频教程】
    的头像 发表于 12-06 12:15 2133次阅读

    RA产品家族初学者指南-第11章(3)

    RA产品家族初学者指南系列文章 已收录成合集,欢迎点击上方查看合集并订阅! 11. 安全性和TrustZone 本章目录 什么是Tr
    的头像 发表于 02-03 01:55 1442次阅读

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

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

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

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