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

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

3天内不再提示

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

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

扫码添加小助手

加入工程师交流群

19.8

实验2:DMAC+UART串口收发

19.8.1

软件设计

19.8.1.1

新建工程

本实验新建工程的步骤与上面的实验1基本一致。

对于e2studio开发环境:

拷贝一份我们之前的e2s工程“19_UART_Receive_Send”,然后将工程文件夹重命名为“20_DMAC_Using_UART”,最后再将它导入到我们的e2studio工作空间中。

对于Keil开发环境:

拷贝一份我们之前的Keil工程“19_UART_Receive_Send”,然后将工程文件夹重命名为“20_DMAC_Using_UART”,并进入该文件夹里面双击Keil工程文件,打开该工程。

工程新建好之后,在工程根目录的“src”文件夹下面新建“dmac”文件夹,再进入“dmac”文件夹里面新建源文件和头文件:“bsp_dmac.c”和“bsp_dmac.h”。工程文件结构如下。

列表14:文件结构

左右滑动查看完整内容

20_DMAC_Using_UART
├─ ......
└─src
├─ led
│ ├─ bsp_led.c
│ └─ bsp_led.h
├─ debug_uart
│ ├─ bsp_debug_uart.c
│ └─ bsp_debug_uart.h
├─ dmac
│ ├─ bsp_dmac.c
│ └─ bsp_dmac.h
└─ hal_entry.c

19.8.1.2

FSP配置

按照与实验1相同的步骤加入两个r_dmac的Stack,如下图所示。

596a9396-dafe-11f0-8c8f-92fbcf53809c.png

添加后,配置这两个DMAC模块,一个配置为用于UART发送,一个配置为用于UART接收。

UART4发送的DMAC配置如下:

59c93c16-dafe-11f0-8c8f-92fbcf53809c.png

UART4接收的DMAC配置如下:

5a238554-dafe-11f0-8c8f-92fbcf53809c.png

19.8.1.3

编写代码

hal_entry入口函数的代码如下。

列表15:代码清单20‑13测试dmac串口

左右滑动查看完整内容

/* 用户头文件包含 */
#include"led/bsp_led.h"
#include"debug_uart/bsp_debug_uart.h"
#include"dmac/bsp_dmac.h"
#defineBUFFER_SIZE (37)
uint8_tsci_tx_data[BUFFER_SIZE] = {"embedfire-野火 www.embedfire.com
"}
→;
uint8_tsci_rx_data[BUFFER_SIZE];
voidhal_entry(void)
{
/*TODO:add your own code here */
LED_Init();// LED 初始化
Debug_UART4_Init();// SCI4 UART 调试串口初始化
printf("
实验 2:DMAC+UART 串口收发
");
printf("- 蓝、绿灯亮 - 接收成功、发送成功
");
printf("- 蓝色灯亮 - 接收失败、发送成功
");
printf("- 绿色灯亮 - 接收成功、发送失败
");
printf("- 红色灯亮 - 接收失败、发送失败
");
printf("
发送内容如下:
");
/* 通过 CPU 和中断处理程序发送数据 */
R_SCI_UART_Write(&g_uart4_ctrl, &sci_tx_data[0], BUFFER_SIZE);
/* 等待传输完成中断 - 标志位在 UART 的回调函数中 debug_uart4_callback() */
while(false== uart_send_complete_flag );
uart_send_complete_flag =false;
/* 通过 DMAC 和中断处理程序发送数据 */
/* 清零 ICU IELSR 寄存器 */
R_ICU->IELSR[SCI4_RXI_IRQn] =0U;
R_ICU->IELSR[SCI4_TXI_IRQn] =0U;
/* 配置串口接收 DMA 源地址、目标地址、长度 */
set_transfer_dst_src_address(g_transfer_dmac_sci4_rx.p_cfg,
&R_SCI4->RDR,
&sci_rx_data[0]);
set_transfer_length(g_transfer_dmac_sci4_rx.p_cfg, BUFFER_SIZE);
/* 配置串口发送 DMA 源地址、目标地址、长度 */
set_transfer_dst_src_address(g_transfer_dmac_sci4_tx.p_cfg,
&sci_tx_data[0],
(void*)&R_SCI4->TDR);
set_transfer_length(g_transfer_dmac_sci4_tx.p_cfg, BUFFER_SIZE);
/* 开启 DMAC */
DMAC_Init();
/* 手动触发传输数据寄存器空中断 */
R_SCI4->SCR_b.TE =0;
R_SCI4->SCR_b.RE =0;
R_SCI4->SCR |= (0xF0);
// R_SCI4->SCR_b.TE = 0;
// R_SCI4->SCR_b.TIE = 0;
// uint8_t temp = (uint8_t)(R_SCI4->SCR & 0x53); //0x53 = 101 0011
// R_SCI4->SCR = (uint8_t)(0xa0 | temp); //0x0a = 1010 0000
while(1)
{
if((1== dmac_sci4_tx_flag ) && (1== dmac_sci4_rx_flag ))
{
//蓝、绿灯亮 - 接收成功、发送成功
LED1_OFF;
LED2_ON;
LED3_ON;
}
elseif((1== dmac_sci4_tx_flag ) && (0== dmac_sci4_rx_flag ))
{
//蓝色灯亮 - 接收失败、发送成功
LED1_OFF;
LED2_ON;
LED3_OFF;
}
elseif((0== dmac_sci4_tx_flag ) && (1== dmac_sci4_rx_flag ))
{
//绿色灯亮 - 接收成功、发送失败
LED1_OFF;
LED2_OFF;
LED3_ON;
}
else
{
//红色灯亮 - 接收失败、发送失败
LED1_ON;
LED2_OFF;
LED3_OFF;
}
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
/**
* 判断指定长度的两个数据源是否完全相等,
* 如果完全相等返回 1,只要其中一对数据不相等返回 0
*/
uint8_tBuffercmp(constuint32_t* pBuffer,uint32_t* pBuffer1,uint16_t␣
,
→BufferLength)
{
/* 数据长度递减 */
while(BufferLength--)
{
/* 判断两个数据源是否对应相等 */
if(*pBuffer != *pBuffer1)
{
/* 对应数据源不相等马上退出函数,并返回 0 */
return0;
}
/* 递增两个数据源的地址指针 */
pBuffer++;
pBuffer1++;
}
/* 完成判断并且对应数据相对 */
return1;
}

在bsp_dmac.c文件中编写DMAC初始化等函数,如下所示。

列表16:代码清单20‑14DMAC初始化函数

左右滑动查看完整内容

/* 初始化 DMAC 模块 */
voidDMAC_Init(void)
{
fsp_err_t err;
/* 配置发送 */
err = g_transfer_on_dmac.open(g_transfer_dmac_sci4_tx.p_ctrl, g_
→transfer_dmac_sci4_tx.p_cfg);
assert(FSP_SUCCESS== err);
err = g_transfer_on_dmac.enable(g_transfer_dmac_sci4_tx.p_ctrl);
assert(FSP_SUCCESS== err);
/* 配置接收 */
err = g_transfer_on_dmac.open(g_transfer_dmac_sci4_rx.p_ctrl, g_
→transfer_dmac_sci4_rx.p_cfg);
assert(FSP_SUCCESS== err);
err = g_transfer_on_dmac.enable(g_transfer_dmac_sci4_rx.p_ctrl);
assert(FSP_SUCCESS== err);
}
voidset_transfer_length(transfer_cfg_tconst * p_config, volatile uint16_
→t _length)
{
p_config->p_info->length = _length;
}
/* 设置传输的源地址和目的地址 */
voidset_transfer_dst_src_address(transfer_cfg_tconst *constp_config,
constvolatileuint8_t * _p_src, constvolatileuint8_t * _p_dest)
{
p_config->p_info->p_src = (voidconst * volatile) _p_src;
p_config->p_info->p_dest = (void* volatile) _p_dest;
}

在bsp_dmac.c文件中分别编写DMAC发送完成中断和接收完成中断的回调函数,如下所示。

列表17:代码清单20‑15DMAC回调函数

左右滑动查看完整内容

// DMA 传输完成标志位
volatileuint8_t dmac_sci4_tx_flag =0;
volatileuint8_t dmac_sci4_rx_flag =0;
/* DMAC 发送中断回调函数 */
voidtransfer_dmac_sci4_tx_callback(dmac_callback_args_t *p_args)
{
(void)(p_args);
dmac_sci4_tx_flag =1;
}
/* DMAC 接收回调函数 */
voidtransfer_dmac_sci4_rx_callback(dmac_callback_args_t *p_args)
{
(void)(p_args);
dmac_sci4_rx_flag =1;
}

19.8.2

实验现象

比较好的接收方式还是直接使用串口接收,使用环形队列,来接收不定长的数据。

运行代码时,数据字符串”embedfire-野火www.embedfire.com”将传输两次。第一次是通过CPU和中断,第二次是通过DMAC和中断。

然后,使用串口调试助手,向开发板发送相同字符串“embedfire-野火www.embedfire.com”,带回车换行字符。

如果只有蓝色灯亮则代表接收失败、发送成功,如果只有绿色灯亮则代表接收成功、发送失败,如果只有红色灯亮则代表接收失败、发送失败,蓝灯和绿灯同时亮起则是接收和发送都成功。

触发DMA的关键是禁用ICU中断使能寄存器中的中断。如果不这样做,则CPU和DMA之间存在争用情况,并且无法获得预期的结果。

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

    关注

    15

    文章

    1629

    浏览量

    83574
  • uart
    +关注

    关注

    22

    文章

    1324

    浏览量

    107146
  • 开发环境
    +关注

    关注

    1

    文章

    276

    浏览量

    17704

原文标题:实验2:DMAC+UART串口收发——瑞萨RA系列FSP库开发实战指南(58)

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    实验新建工程的步骤与上面的实验3基本一致。
    的头像 发表于 01-05 14:29 3579次阅读
    <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>DTC+<b class='flag-5'>UART</b><b class='flag-5'>串口</b><b class='flag-5'>收发</b><b class='flag-5'>实验</b>

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

    使用官方提供的FPS进行编程,官方提供的FPS具有方便、快捷、简洁的特性。
    的头像 发表于 01-27 10:02 3930次阅读
    <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<b class='flag-5'>实验</b>

    RA系列FSP开发实战指南QSPI读写外部Flash芯片实验

    因为本章节的QSPI Flash相关实验例程需要用到板子上的串口功能,因此我们可以直接以前面的“19_UART_Receive_Send”工程为基础进行修改。
    的头像 发表于 03-03 13:57 6563次阅读
    <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>QSPI读写外部Flash芯片<b class='flag-5'>实验</b>

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

    ADC在产品设计中是非常常用的MCU外设模块,当在某些复杂的应用下需要非常快的采样速度时,使用DMA进行数据搬运,可以更便捷的来实现对数据的高效搬运,结合本例在FSP上轻松配置您的所需,同时也让我们了解一下
    的头像 发表于 11-29 12:14 3820次阅读
    <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)

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

    调用R_DMAC_SoftwareStart函数来发起软件触发请求信号来启动DMAC传输。
    的头像 发表于 12-26 09:25 5177次阅读

    RA MCU众测宝典 | 串口RA-Eco-RA2L1】RTC日历及串口设置时间

    “RAMCU众测宝典”串口专题添硬核实操!开启宝典前言RAMCU众测宝典|串口RA2L1
    的头像 发表于 04-21 18:07 7237次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b> MCU众测宝典 | <b class='flag-5'>串口</b><b class='flag-5'>之</b>【<b class='flag-5'>RA-Eco-RA</b>2L1】RTC日历及<b class='flag-5'>串口</b>设置时间

    基于FPB-RA0E2开发板实现UART串口打印HELLO WORLD

    本篇文章主要介绍如何使用e2 studio灵活软件包(FSP)对FPB-RA0E2单片机开发板进行U
    的头像 发表于 05-19 11:19 3219次阅读
    基于<b class='flag-5'>瑞</b><b class='flag-5'>萨</b>FPB-<b class='flag-5'>RA</b>0E2<b class='flag-5'>开发</b>板实现<b class='flag-5'>UART</b><b class='flag-5'>串口</b>打印HELLO WORLD

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

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

    **RA2L1入门学习】+**UART测试实验

    RA2L1入门学习】+UART测试实验 本篇文章主要介绍如何使用e2studio对
    发表于 03-09 15:45

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

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

    RA4系列开发板体验】CoreMark移植完全指南——UART输出和SysTick计时的应用

    /chapter19.html【野火 RA系列FSP
    发表于 12-03 15:05

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

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

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

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

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

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

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

    感谢立创提供测试机会,学到RA0及MCU的相关使用。使用FSP
    的头像 发表于 02-25 09:27 1447次阅读
    基于<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>回显测试