Renesas R7FA8D1BH (Cortex®-M85)串口应用总结

目录

概述

1 软硬件

1.1 软硬件环境信息

1.2 开发板信息

1.3 调试器信息

2 FSP和KEIL配置串口

2.1 配置参数

2.2 生成基于Keil的软件架构

3 FSP代码

3.1 FSP中UART接口函数 

3.2 案例代码介绍

3.3 案例代码存在的问题

4 UART代码实现

4.1 功能函数介绍

4.2 完整代码

5 测试

5.1 测试功能描述

5.2 运行测试代码


源代码下载地址:

FSP-Project-RA8-uart-test:RenesasR7FA8D1BH(Cortex-M85)串口应用总结资源-CSDN文库

概述

本文主要记录使用Renesas R7FA8D1BH (Cortex®-M85)串口模块时,存在的问题,并详细的记录问题产生的实验现象。笔者通过仔细研究FSP中和UART相关的接口函数和实用案例,通过详细的测试,找到了解决printf函数在打印字符串中不能完整打印数据的问题,并给出解决方案。

1 软硬件

1.1 软硬件环境信息

软硬件信息版本信息
Renesas MCUR7FA8D1BH
KeilMDK ARM 5.38
FSP 版本5.3.0
调试工具:N32G45XVL-STBDAP-LINK

1.2 开发板信息

笔者选择使用野火耀阳开发板_瑞萨RA8,该板块的主控MCU为R7FA8D1BHECBD,7FA8D1BHECBD的内核为ARM Contex-M85。

1.3 调试器信息

对于R7FA8D1BHECBD芯片,其使用的内核为Cortex®-M85 Core, ST-LINK-V2或者J-LINK-V9不支持下载和调试功能。笔者经过多次尝试,发现N32G45XVL-STB板卡上自带的DAP-LINK可以下载和调试R7FA8D1BHECBD。

下图为N32G45XVL-STB开发板实物图:

2 FSP和KEIL配置串口

2.1 配置参数

根据原理图可知,debug UART使用的PIN引脚为PA14和PA15,其对应UART-9接口。

 在FSP上的配置参数如下:

 注意点:

使能SCI接口之后,必须保证该模块对应的时钟被使能,其具体配置方法如下:

 串口中断配置参数:

2.2 生成基于Keil的软件架构

 使用FSP完成参数配置之后,就可以生成基于Keil IED的软件架构,产出项目代码后,使用Keil打卡项目文件,其结果如下:

创建bsp_uart.c文件实现和串口相关的驱动程序。

3 FSP代码

3.1 FSP中UART接口函数 

打开RA Flexible Software Package Documentation  Release v5.3.0,可以看见如下函数

打开文档链接:

RA/sc_v2024-04_fsp_v5.3.0/fsp_documentation/v5.3.0/fsp_user_manual_v5.3.0/group___s_c_i___b___u_a_r_t.html

该页面上对上述函数做了详细的介绍,FSP还提供了一个UART应用的案例功供程序员参考。

3.2 案例代码介绍

案例代码实现功能:

1)在 r_sci_b_uart_basic_example (void)函数中,实现初始化串口,然后接收一个包的数据;完成数据接收后,由进行发送一个包的数据。

2)中断回调函数:void example_callback (uart_callback_args_t * p_args)

接收数据,并根据事件控制字,判断接收或者,发送数据是否完成

uint8_t  g_dest[TRANSFER_LENGTH];
uint8_t  g_src[TRANSFER_LENGTH];
uint8_t  g_out_of_band_received[TRANSFER_LENGTH];
uint32_t g_transfer_complete = 0;
uint32_t g_receive_complete  = 0;
uint32_t g_out_of_band_index = 0;
void r_sci_b_uart_basic_example (void)
{/* Initialize p_src to known data */for (uint32_t i = 0; i < TRANSFER_LENGTH; i++){g_src[i] = (uint8_t) ('A' + (i % 26));}/* Open the transfer instance with initial configuration. */fsp_err_t err = R_SCI_B_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);assert(FSP_SUCCESS == err);err = R_SCI_B_UART_Read(&g_uart0_ctrl, g_dest, TRANSFER_LENGTH);assert(FSP_SUCCESS == err);err = R_SCI_B_UART_Write(&g_uart0_ctrl, g_src, TRANSFER_LENGTH);assert(FSP_SUCCESS == err);while (!g_transfer_complete){}while (!g_receive_complete){}
}
void example_callback (uart_callback_args_t * p_args)
{/* Handle the UART event */switch (p_args->event){/* Received a character */case UART_EVENT_RX_CHAR:{/* Only put the next character in the receive buffer if there is space for it */if (sizeof(g_out_of_band_received) > g_out_of_band_index){/* Write either the next one or two bytes depending on the receive data size */if (UART_DATA_BITS_8 >= g_uart0_cfg.data_bits){g_out_of_band_received[g_out_of_band_index++] = (uint8_t) p_args->data;}else{uint16_t * p_dest = (uint16_t *) &g_out_of_band_received[g_out_of_band_index];*p_dest              = (uint16_t) p_args->data;g_out_of_band_index += 2;}}break;}/* Receive complete */case UART_EVENT_RX_COMPLETE:{g_receive_complete = 1;break;}/* Transmit complete */case UART_EVENT_TX_COMPLETE:{g_transfer_complete = 1;break;}default:{}}
}

3.3 案例代码存在的问题

笔者在使用案例程序,进行数据发送时,存在如下问题:

问题1:

使用如下代码发送数据时,如果连续发送多包数据,只有第一包发送成功:

err = R_SCI_B_UART_Write(&g_uart0_ctrl, g_src, TRANSFER_LENGTH);assert(FSP_SUCCESS == err);while (!g_transfer_complete){}

问题2: 

连续多次发送数据时,程序会卡在某一个位置,具体位置如下:

问题3:

 定义printf函数的接口,其详细代码如下:

int fputc(int ch, FILE *f)
{fsp_err_t err;(void)f;err = R_SCI_B_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);assert(FSP_SUCCESS == err);while (!g_transfer_complete){}g_transfer_complete = 0;return ch;
}

使用printf函数,打印一个字符串,会发现,其只能打印一个byte

4 UART代码实现

4.1 功能函数介绍

1)发送数据函数

代码24行:发送数据接口

代码25行: 判断发送数据是否成功

代码26行:等待中断函数中的发送完成控制字置位

代码28行:实现1ns的延时,这一条语句很重要, 解决了上述3.3小节中的问题

2)设置baud函数

代码40行:计算baud

代码42行:设置baud

代码46行:初始化串口

 3)中断函数

代码第57行:处理串口中断事件

代码第86行:发送数据完成事件函数

4)printf函数结构

代码第103行:串口写数据函数

代码第105行:接收数据完成标志位

代码第107行:延时1ns,这个函数非常重要,没有这句语句,printf发送数据时只发送一个byte

 

4.2 完整代码

 在bsp_uart.c文件中实现如下代码:

 /*FILE NAME  :  bsp_uart.cDescription:  debug uart function library  Author     :  tangmingfei2013@126.comDate       :  2024/06/03*/
#include "bsp_uart.h"
#include "string.h"
#include <stdarg.h> #define TRANSFER_LENGTH       128uint8_t  g_src[TRANSFER_LENGTH];
uint8_t  g_out_of_band_received[TRANSFER_LENGTH];
uint32_t g_transfer_complete = 0;
uint32_t g_receive_complete  = 0;
uint32_t g_out_of_band_index = 0;void r_sci_b_uart0_sendArry ( uint8_t *str, uint32_t len)
{fsp_err_t err;// send the messsage inforerr = R_SCI_B_UART_Write(&g_uart0_ctrl,str, len);assert(FSP_SUCCESS == err);while (!g_transfer_complete){R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);}g_transfer_complete = 0;
}void r_sci_b_uart0_set_baud (uint32_t baud_rate)
{fsp_err_t err ;sci_b_baud_setting_t baud_setting;bool                 enable_bitrate_modulation = false;uint32_t             error_rate_x_1000         = SCI_B_UART_BAUDRATE_ERROR_PERCENT_5;err = R_SCI_B_UART_BaudCalculate(baud_rate, enable_bitrate_modulation, error_rate_x_1000, &baud_setting);assert(FSP_SUCCESS == err);err = R_SCI_B_UART_BaudSet(&g_uart0_ctrl, (void *) &baud_setting);assert(FSP_SUCCESS == err);/* Open the transfer instance with initial configuration. */err = R_SCI_B_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);assert(FSP_SUCCESS == err);printf("Board message: R7FA8D1BHECBD-BTB \r\n");printf("next Board message: R7FA8D1BHECBD-BTB \r\n");
}void g_uart0_CallbackFunc (uart_callback_args_t * p_args)
{/* Handle the UART event */switch (p_args->event){/* Received a character */case UART_EVENT_RX_CHAR:{/* Only put the next character in the receive buffer if there is space for it */if (sizeof(g_out_of_band_received) > g_out_of_band_index){/* Write either the next one or two bytes depending on the receive data size */if (UART_DATA_BITS_8 >= g_uart0_cfg.data_bits){g_out_of_band_received[g_out_of_band_index++] = (uint8_t) p_args->data;}else{uint16_t * p_dest = (uint16_t *) &g_out_of_band_received[g_out_of_band_index];*p_dest              = (uint16_t) p_args->data;g_out_of_band_index += 2;}}break;}/* Receive complete */case UART_EVENT_RX_COMPLETE:{g_receive_complete = 1;break;}/* Transmit complete */case UART_EVENT_TX_COMPLETE:{g_transfer_complete = 1;break;}default:{}}
}int fputc(int ch, FILE *f)
{fsp_err_t err;(void)f;err = R_SCI_B_UART_Write(&g_uart0_ctrl, (uint8_t *)&ch, 1);assert(FSP_SUCCESS == err);while (!g_transfer_complete){R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);}g_transfer_complete = 0;return ch;
}/* End of this file */

5 测试

5.1 测试功能描述

使用printf函数打印字符串,PC端使用终端工具接收数据,测试函数如下:

void log_message(void)
{printf("\n   \\ |    /\n");printf("- Conxtex-M85 -   test System\n");printf(" /     |     \\    build %s %s\n", __DATE__, __TIME__);printf(" 2024 - 2029 Copyright by mingfei.tang\n");
}

5.2 运行测试代码

编译代码下载到板卡中,其运行结果如下:

串口终端上接收到的数据

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365484.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 插件推荐【一】

好使的插件可以让工作事倍功半。下面就推荐一些常用的IDEA插件&#xff0c;如果你有其他好使的插件&#xff0c;欢迎评论区留言分享出来~ 1.Key Promoter X Key Promoter X 插件&#xff0c;IDEA 快捷键提示工具。 在每次我们使用鼠标进行 IDEA 的某个操作&#xff0c;Key Pr…

Java基础(判断和循环)

一、流程控制语句-顺序结构 顺序结构语句是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 二、流程控制语句-分支结构&#xff08;分支结构包括if、switch) if语句&#xff1a;在程序中用来进行判断 1、If语句的第一种格式&#xf…

Django之阿里云短信

短信验证 短信验证,首先得选择一个短信发送服务器上,本文档使用阿里云实现短信发送功能 阿里云短信网 网址:短信服务_企业短信营销推广_验证码通知-阿里云 注册账号 新账号赠送100条,可以不用充值,即可进行测试 接入 短信 进行 个人实名认证 编写代码执行 安装依赖模块 p…

前端基础:HTML

目录 HTML概述 HTML基本语法 标签属性 代码基本语法注解 运行 ​编辑 基本常用标签 标题标签 代码 运行 段落标签 代码 运行 列表 无序列表 代码 运行 有序列表 代码 运行 ​编辑 超链接 代码 运行 图像标签 代码 运行 特殊符号转义 代码 运行 …

vscode的一些使用问题

vscode使用技巧 1、快捷键&#xff08;1&#xff09;打开命令面板&#xff08;2&#xff09;注释&#xff08;3&#xff09;删除行&#xff08;4&#xff09;上下移动光标&#xff08;5&#xff09;光标回退&#xff08;6&#xff09;复制行&#xff08;7&#xff09;插入空白行…

HTML5文旅文化旅游网站模板源码

文章目录 1.设计来源文旅宣传1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 文旅之行界面演示1.5 文旅之行文章内容界面演示1.6 关于我们界面演示1.7 文旅博客界面演示1.8 文旅博客文章内容界面演示1.9 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目…

前后端交互整合 - Wiki

集成 Http 库 axios 首先在前端工程中安装 axios ,切换为 wiki / web 目录下,安装命令行为 npm install axios --save 通过 axios 调用电子书列表接口: 定义 setup( ) 方法,页面被调用时便会执行此方法,在方法中要想使用 axios ,首先需要引入 axios 包: import axios f…

【MySQL】Linux下MySQL的目录结构、用户、权限与角色

一、Linux下MySQL的目录结构 1、MySQL相关目录 数据库文件存放路径&#xff1a;/var/lib/mysql数据库命令存放路径&#xff1a;/user/bin和/user/sbin配置文件目录&#xff1a;/usr/share/mysql-8.0/、/usr/share/mysql/和/etc/my.cnf 2、假设我们创建了一个数据库dbtest1&a…

探索视觉世界:深入了解目标检测算法的奥秘

目标检测算法 一、介绍目标检测算法的背景和意义1.1 目标检测的定义和应用场景1.2 目标检测算法的发展历程 二、目标检测算法分类2.1 传统目标检测算法2.1.1 基于分类器的目标检测算法2.1.2 基于模板匹配的目标检测算法 2.2 深度学习目标检测算法2.2.1 两阶段目标检测算法2.2.2…

firewalld防火墙转发流量到其他端口forward port rules

假设云主机eth0: 47.93.27.106 tun0: inet 10.8.0.1 netmask 255.255.255.0 Show rules for a specific zone (public) sudo firewall-cmd --zonepublic --list-all Add the tun0 interface to the public zone: sudo firewall-cmd --zonepublic --add-interfacetun0 --…

Linux基础篇——学习Linux基本工具安装教程视频链接

本篇文章就是记录一下学习Linux需要用到的基本工具的视频教程链接&#xff0c;方便以后查看 VMware15.5安装 安装视频教程&#xff1a;VMware15.5安装教程 centos7.6安装&#xff08;这个视频教程真的很nice&#xff09; 视频教程&#xff1a;centos7.6 虚拟机克隆、快照、…

【区块链+基础设施】区块链服务网络 BSN | FISCO BCOS应用案例

BSN&#xff08;Blockchain-based Service Network&#xff0c;区块链服务网络&#xff09;是一个跨云服务、跨门户、跨底层框架&#xff0c;用于部 署和运行各类区块链应用的全球性基础设施网络&#xff0c;旨在为开发者提供低成本和技术互通的区块链一站式服务。 2019 年 12…

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行&#xff08;RCE&#xff09;漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

零基础STM32单片机编程入门(五)FreeRTOS实时操作系统详解及实战含源码视频

文章目录 一.概要二.什么是实时操作系统三.FreeRTOS的特性四.FreeRTOS的任务详解1.任务函数定义2.任务的创建3.任务的调度原理 五.CubeMX配置一个FreeRTOS例程1.硬件准备2.创建工程3.调试FreeRTOS任务调度 六.CubeMX工程源代码下载七.讲解视频链接地址八.小结 一.概要 FreeRTO…

新版一键AI视频图片换脸神器来了!目前最强的AI视频换脸工具Swapface!

之前发过一款AI换脸工具&#xff0c;可惜部署门槛太高&#xff0c; 有没有换头换脸的AI工具&#xff1f; 今天就给你们安排到家&#xff01; Swapface AI工具一键开箱包‍&#xff08;一键整合包添加下方领取~&#xff09; 它使用先进的人工智能和计算机视觉技术,可以在几秒…

秋招突击——6/24——复习{完全背包问题——买书,状态转换机——股票买卖V}——新作{两数相除,LRU缓存实现}

文章目录 引言复习完全背包问题——买书个人实现 状态转换机——股票买卖V个人实现参考实现 新作两数相除个人实现 新作LRU缓存实现个人实现unordered_map相关priority_queue相关 参考实现自己复现 总结 引言 今天知道拼多多挂掉了&#xff0c;难受&#xff0c;那实习就是颗粒无…

体验升级:扫描全能王智能高清滤镜2.0全面测评

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【接口自动化测试】第四节.实现项目核心业务的单接口自动化测试

文章目录 前言一、登录单接口自动化测试 1.1 登录单接口文档信息 1.2 登录成功 1.3 登录失败&#xff08;用户名为空&#xff09;二、数据驱动的实现 2.1 json文件实现数据驱动总结 前言 一、登录单接口自动化测试 1.1 登录单接口文档信息 需求&#xff1…

LeetCode 子集

原题链接78. 子集 - 力扣&#xff08;LeetCode&#xff09; 这是一道暴力搜索问题参考大佬们的题解&#xff0c;对这类题目做出一下总结 1.确定递归参数变量 2.递归结束条件 3.做出选择&#xff0c;递归调用进入下一层 4.回溯&#xff0c;返回到递归前的状态 要完成前面这…

【Matlab函数分析】imread从图形文件读取图像

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…