一起游 手游攻略 手游评测 瑞萨RA系列FSP库开发实战指南之DMAC+UART串口收发实验

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

时间: 来源:互联网 浏览:0

19.8实验2:DMAC+UART串口收发19.8.1

软件设计19.8.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配置按照实验一相同的步骤添加两个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:代码清单2013测试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-Wildfire www.embedfire.com'};uint8_tsci_rx_data[BUFFER_SIZE];voidhal_entry(void){/*TODO:在此添加自己的代码*/LED_Init();//LED 初始化Debug_UART4_Init();//SCI4 UART 调试串口初始化printf('实验二: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-SCR0x53); //0x53=101 0011//R_SCI4-SCR=(uint8_t)(0xa0 | temp); //0x0a=1010 0000while(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{//红灯on - 接收失败、发送失败LED1_ON;LED2_OFF;LED3_OFF;}}#ifBSP_TZ_SECURE_BUILD/* 输入非安全代码*/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:代码清单2014DMAC初始化函数左右滑动查看完整内容/* 初始化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);断言(FSP_SUCCESS==err);err=g_transfer_on_dmac.enable(g_transfer_dmac_sci4_rx.p_ctrl);断言(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 * 易失性) _p_src;p_config-p_info-p_dest=(void* 易失性) _p_dest;}

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

列表17:代码清单2015DMAC回调函数左右滑动查看完整内容//DMA传输完成标志volatileeuint8_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-wildfirewww.embedfire.com”将被传输两次。第一次是通过CPU和中断,第二次是通过DMAC和中断。

然后使用串口调试助手向开发板发送同样的字符串“embedfire-Wildfire www.embedfire.com”并带回回车符。

如果只有蓝灯亮,则表示接收失败,发送成功。如果只有绿灯亮,则表示接收成功,发送失败。如果只有红灯亮,则表示接收失败或发送失败。如果蓝灯和绿灯同时亮,则接收和发送成功。

触发DMA的关键是禁用ICU中断使能寄存器中的中断。如果不这样做,CPU 和DMA 之间就会出现竞争条件,并且您将无法获得预期的结果。

标题:瑞萨RA系列FSP库开发实战指南之DMAC+UART串口收发实验
链接:https://yqqlyw.com/news/sypc/62340.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
  • 如何在IAR嵌入式集成开发环境中开
  • 神偷 3完全攻略:翻窗入室,搜刮财物,探
  • 绯红之境兑换码最新2021 礼包兑换码大全

    绯红之境兑换码最新2021 礼包兑换码大全[多图],绯红之境兑换码怎么领取?绯红之境兑换码有哪些?绯红之境在今日

    2025-12-26
    三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法

    三国群英传7霸王再临攻略 霸王再临攻略技巧开启方法[多图],三国群英传7霸王再临怎么玩?三国群英传7霸王再临

    2025-12-26
    妄想山海怎么加好友 加好友方法大全

    妄想山海怎么加好友 加好友方法大全[多图],妄想山海添加好友功能在哪里?妄想山海添加好友的方法是什么?好友添

    2025-12-26
    江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略

    江南百景图又见桃花村钓鱼位置在哪?又见桃花村钓鱼攻略[多图],江南百景图又见桃花村钓鱼怎么钓?又见桃花村钓

    2025-12-26