Renesas R7FA8D1BH (Cortex®-M85)的UART使用介绍

news2024/9/20 2:00:12

目录

概述

1 软硬件

1.1 软硬件环境信息

1.2 开发板信息

1.3 调试器信息

2 FSP配置UART

2.1 配置参数

2.2 UART模块介绍

3 接口函数介绍

3.1 R_SCI_B_UART_Open()

 3.2 R_SCI_B_UART_Close()

3.3  R_SCI_B_UART_Read()

3.4  R_SCI_B_UART_Write()

3.5  R_SCI_B_UART_BaudSet()

3.6  R_SCI_B_UART_CallbackSet() 

4 应用范例

4.1 编写应用代码

​4.2 源代码文件

5 测试

5.1 测试代码

5.2 运行


概述

本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)内部UART的应用的相关内容,包括使用FSP配置UART的参数,FSP提供的UART相关的应用函数接口,还编写一个Demo,调用UART的函数接口,实现数据的接收和发送功能。

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配置UART

2.1 配置参数

硬件连接框图

 1)在Pin面板配置IO参数

2)在Stacks面板创建UART模块

 3)配置UART的相关参数

2.2 UART模块介绍

1)功能介绍

SCI UART模块支持以下功能:

1)全双工UART通信
2)中断驱动的数据传输和接收
3)用事件代码调用用户回调函数(RX/TX完成,TX数据空,RX字符,错误等)
4)波特率在运行时改变
5)比特率调制和噪声消除
6)CTS/RTS硬件流控制(带关联引脚)
7)RS-485半双工驱动支持外部RS-485收发器
8)与DTC传输模块集成
9)中止正在进行的读/写操作
10)在支持的通道上支持FIO

2)硬件流配置 

当配置硬件CTS和软件RTS时,配置的流量控制引脚将用于RTS。当读取数据时,引脚将在接收ISR内部设置高电平。当读取所有数据时,它将被设置为低。当配置硬件CTS和硬件RTS时,CSTn_RTSn引脚将用于RTS功能,CTSn引脚将用于通道n上的CTS功能。


当选择“硬件CTS和硬件RTS”流控制时,CTSn_RTSn引脚连接到CTSn引脚时,驱动程序将遵循正确的硬件流控制功能。当CTSn_RTSn和CTSn断开时,数据仍然会传输,因为CTSn引脚在硬件上被内部拉低,而CTSn引脚被配置为SCI模块的外围引脚。如果不需要硬件流控制,请不要配置CTSn引脚。

 3)参数介绍

ConfigurationOptionsDefaultDescription
 General
NameName must be a valid C symbolg_uart0Module name.
ChannelValue must be a non-negative integer0Select the SCI channel.
Data Bits
  • 8bits
  • 7bits
  • 9bits
8bitsSelect the number of bits per word.
Parity
  • None
  • Odd
  • Even
NoneSelect the parity mode.
Stop Bits
  • 1bit
  • 2bits
1bitSelect the number of stop bits.
 Baud
 Flow Control
 Extra
 Interrupts
CallbackName must be a valid C symbolNULLA user callback function can be provided. If this callback function is provided, it will be called from the interrupt service routine (ISR).
Receive Interrupt PriorityMCU Specific OptionsSelect the receive interrupt priority.
Transmit Data Empty Interrupt PriorityMCU Specific OptionsSelect the transmit interrupt priority.
Transmit End Interrupt PriorityMCU Specific OptionsSelect the transmit end interrupt priority.
Error Interrupt PriorityMCU Specific OptionsSelect the error interrupt priority.

3 接口函数介绍

3.1 R_SCI_B_UART_Open()

函数原型


fsp_err_t R_SCI_B_UART_Open	(	uart_ctrl_t *const 	p_api_ctrl,
                                uart_cfg_t const *const 	p_cfg )	

返回值:

Return values

FSP_SUCCESSChannel opened successfully.
FSP_ERR_ASSERTIONPointer to UART control block or configuration structure is NULL.
FSP_ERR_IP_CHANNEL_NOT_PRESENTThe requested channel does not exist on this MCU.
FSP_ERR_INVALID_ARGUMENTFlow control is enabled but flow control pin is not defined.
FSP_ERR_ALREADY_OPENControl block has already been opened or channel is being used by another instance. Call close() then open() to reconfigure.

 3.2 R_SCI_B_UART_Close()

函数原型: 中止任何正在进行的传输。禁用中断、接收器和发送器。如果使用,关闭较低级别传输驱动程序。删除的权力。

fsp_err_t R_SCI_B_UART_Close	(	uart_ctrl_t *const 	p_api_ctrl	)	

返回值:

Return values

FSP_SUCCESSChannel successfully closed.
FSP_ERR_ASSERTIONPointer to UART control block is NULL.
FSP_ERR_NOT_OPENThe control block has not been opened

3.3  R_SCI_B_UART_Read()

函数原型:


fsp_err_t R_SCI_B_UART_Read	(	 uart_ctrl_t *const 	p_api_ctrl,
                                 uint8_t *const 	p_dest,
                                 uint32_t const 	bytes )	

返回值:

Return values

FSP_SUCCESSData reception successfully ends.
FSP_ERR_ASSERTIONPointer to UART control block is NULL. Number of transfers outside the max or min boundary when transfer instance used
FSP_ERR_INVALID_ARGUMENTDestination address or data size is not valid for 9-bit mode.
FSP_ERR_NOT_OPENThe control block has not been opened
FSP_ERR_IN_USEA previous read operation is still in progress.
FSP_ERR_UNSUPPORTEDSCI_B_UART_CFG_RX_ENABLE is set to 0

3.4  R_SCI_B_UART_Write()

函数原型:

fsp_err_t R_SCI_B_UART_Write	(	uart_ctrl_t *const 	p_api_ctrl,
                                    uint8_t const *const 	p_src,
                                    uint32_t const 	bytes )	

返回值:

Return values

FSP_SUCCESSData transmission finished successfully.
FSP_ERR_ASSERTIONPointer to UART control block is NULL. Number of transfers outside the max or min boundary when transfer instance used
FSP_ERR_INVALID_ARGUMENTSource address or data size is not valid for 9-bit mode.
FSP_ERR_NOT_OPENThe control block has not been opened
FSP_ERR_IN_USEA UART transmission is in progress
FSP_ERR_UNSUPPORTEDSCI_B_UART_CFG_TX_ENABLE is set to 0

3.5  R_SCI_B_UART_BaudSet()

函数原型:


fsp_err_t R_SCI_B_UART_BaudSet	(	uart_ctrl_t *const 	p_api_ctrl,
void const *const 	p_baud_setting 
)	

返回值:

Return values

FSP_SUCCESSBaud rate was successfully changed.
FSP_ERR_ASSERTIONPointer to UART control block is NULL or the UART is not configured to use the internal clock.
FSP_ERR_NOT_OPENThe control block has not been opened

3.6  R_SCI_B_UART_CallbackSet() 

函数原型:


fsp_err_t R_SCI_B_UART_CallbackSet	(  uart_ctrl_t *const 	p_api_ctrl,
                                       void(*)(uart_callback_args_t *) 	p_callback,
                                       void const *const 	p_context,
                                       uart_callback_args_t *const 	p_callback_memory 
)	

返回值:

Return values

FSP_SUCCESSCallback updated successfully.
FSP_ERR_ASSERTIONA required pointer is NULL.
FSP_ERR_NOT_OPENThe control block has not been opened.
FSP_ERR_NO_CALLBACK_MEMORYp_callback is non-secure and p_callback_memory is either secure or NULL.

4 应用范例

4.1 编写应用代码

1)初始化串口函数

代码60行: 计算baud

代码63行:设置baud

代码66行:打开串口

2)发送数据函数

3)接收数据中断回调函数

 4.2 源代码文件

创建.c文件,编写如下代码:

 /*
 FILE NAME  :  bluetooth.c
 Description:  user bluetooth interface 
 Author     :  tangmingfei2013@126.com
 Date       :  2024/09/15
 */
#include "bsp_uart.h"
#include "bluetooth.h" 
#include "hal_data.h"

#define TRANSFER_LENGTH       128

static uint8_t  g_out_of_band_received[TRANSFER_LENGTH];
static uint32_t g_transfer_complete = 0;
static uint32_t g_receive_complete  = 0;
static uint32_t g_out_of_band_index = 0;

static void r_sci_b_uart1_set_baud (uint32_t baud_rate);
void r_sci_b_uart1_sendArry ( uint8_t *str, uint32_t len);

void blueTooth_Init( void )
{
    r_sci_b_uart1_set_baud( SCI_B_UART_BAUDRATE_9600 );
}

void blueTooth_send( void )
{
    static int sec;
    rtc_time_t get_time;
    
    user_get_currentRtc(&get_time);
    if( get_time.tm_sec != sec  )
    {
        sec = get_time.tm_sec;
        r_sci_b_uart1_sendArry(g_out_of_band_received,TRANSFER_LENGTH );
    }
}

void r_sci_b_uart1_sendArry ( uint8_t *str, uint32_t len)
{
    fsp_err_t err;

    // send the messsage infor
    err = R_SCI_B_UART_Write(&g_uart1_ctrl,str, len);
    assert(FSP_SUCCESS == err);
    while (!g_transfer_complete)
    {
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
    }
    g_transfer_complete = 0;
}

static void r_sci_b_uart1_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_uart1_ctrl, (void *) &baud_setting);
    assert(FSP_SUCCESS == err);
    
    /* Open the transfer instance with initial configuration. */
    err = R_SCI_B_UART_Open(&g_uart1_ctrl, &g_uart1_cfg);
    assert(FSP_SUCCESS == err);

}

void g_uart1_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 (g_out_of_band_index < TRANSFER_LENGTH)
            {
                /* Write either the next one or two bytes depending on the receive data size */
                if (UART_DATA_BITS_8 >= g_uart1_cfg.data_bits)
                {
                    g_out_of_band_received[g_out_of_band_index] = (uint8_t) p_args->data;
                    g_out_of_band_index++;
                }
                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;
                }
            }
            else
            {
                g_out_of_band_index = 0;
            }
            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:
        {
        }
    }
}



/* End of this file */

5 测试

使用串口调试助手与板卡连接起来,实现数据发生和接收功能。

5.1 测试代码

代码功能介绍:间隔1s发送g_out_of_band_received中的数据,

间隔时间通过MCU内部的RTC模块获取

void blueTooth_send( void )
{
    static int sec;
    rtc_time_t get_time;
    
    user_get_currentRtc(&get_time);
    if( get_time.tm_sec != sec  )
    {
        sec = get_time.tm_sec;
        r_sci_b_uart1_sendArry(g_out_of_band_received,TRANSFER_LENGTH );
    }
}

5.2 运行

系统硬件环境:

测试数据log:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【iOS】——JSONModel源码

JSONModel用法 基本用法 将传入的字典转换成模型&#xff1a; 首先定义模型类&#xff1a; interface Person : JSONModel property (nonatomic, copy) NSString *name; property (nonatomic, copy) NSString *sex; property (nonatomic, assign) NSInteger age; end接…

Java 23 的12 个新特性!!

Java 23 来啦&#xff01;和 Java 22 一样&#xff0c;这也是一个非 LTS&#xff08;长期支持&#xff09;版本&#xff0c;Oracle 仅提供六个月的支持。下一个长期支持版是 Java 25&#xff0c;预计明年 9 月份发布。 Java 23 一共有 12 个新特性&#xff01; 有同学表示&…

Qwen 2.5:阿里巴巴集团的新一代大型语言模型

Qwen 2.5&#xff1a;阿里巴巴集团的新一代大型语言模型 摘要&#xff1a; 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展日新月异&#xff0c;它们在自然语言处理&#xff08;NLP&#xff09;和多模态任务中扮演着越来越重要的角色。阿里巴巴集…

「数据科学」清洗数据,使用Python语言处理数据集中的重复值

数据集中的重复值&#xff0c;产生的原因有很多&#xff0c;如果不进行处理的话&#xff0c;会对我们的后续分析过程&#xff0c;产生很大的影响。比如说&#xff0c;在统计汇总数据的时候&#xff0c;重复数据就会导致数据总数增多。要是重复数据多的话&#xff0c;会影响我们…

2024 go-zero社交项目实战

背景 一位商业大亨&#xff0c;他非常看好国内的社交产品赛道&#xff0c;想要造一款属于的社交产品&#xff0c;于是他找到了负责软件研发的小明。 小明跟张三一拍即合&#xff0c;小明决定跟张三大干一番。 社交产品MVP版本需求 MVP指&#xff1a;Minimum Viable Product&…

Java自定义集合-基于文件的泛型列表 LocalFileArrayList

Java实现基于文件的泛型列表 LocalFileArrayList 简介核心概念泛型文件操作实现细节构造函数读取和写入文件类型转换List 接口方法实现总结调用示例完整代码简介 LocalFileArrayList我自己随便起的,没怎么思考,不一定是最适合的名字。搞这东西主要是有些需求用到的数据量太大…

95分App引领年轻人省钱赚钱新风尚,闲置也能变宝藏

随着时代的发展&#xff0c;年轻一代的消费观念正经历着深刻的变革。他们不再盲目追求新品、奢侈品&#xff0c;而是喜欢上购买闲置物品来满足日常所需。在消费的同时&#xff0c;加入了卖家的行列。对自己拥有的闲置物品开启“断舍离”&#xff0c;纷纷在闲置平台进行售卖。这…

鸿蒙媒体开发系列05——音频并发播放管理与音量管理

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、多音频播放的并发管理 多音频并发&#xff0c;即多个音频流同时播放。此场景下&…

GAMES104:15 游戏引擎的玩法系统基础-学习笔记

文章目录 0&#xff0c;游戏性课程框架一&#xff0c;事件机制1.1 事件的定义1.2 callback的注册1.3 事件的分发系统 二&#xff0c;游戏逻辑与脚本系统2.1 特点和常见脚本语言2.2 脚本语言的GO管理2.3 脚本语言的架构2.4 可视化脚本 三&#xff0c;Gameplay 开发中的3C &#…

关雅荻发文批评某脱口秀节目审核问题:为博流量乱搞事情?

最近&#xff0c;针对某脱口秀节目中引发的网络舆情&#xff0c;电影制片人关雅荻发文严厉批评该视频平台的审核问题&#xff0c;指出“这家视频网站对应的节目审核环节严重失职&#xff0c;或者有意渎职&#xff0c;这个脱口秀节目制作方在自己内容策划和制作也有明显失职、严…

一招有效清理宠物浮毛,养宠搭子——质量好的宠物空气净化器推荐

害&#xff0c;好不容易毕业找到了工作进入社会&#xff0c;我以为可以自己决定事情了&#xff0c;结果上周又被我妈臭骂一通。因为我瞒着他们养猫了&#xff0c;他们来看我的时候才知道&#xff0c;说我刚出来养活自己都够呛&#xff0c;哪里还能照顾猫。在我好说歹说下&#…

数字电路与逻辑设计-触发器功能测试及其应用

一、实验目的 1&#xff0e;验证基本RS、JK、D、T和T’触发器的逻辑功能及使用方法&#xff1b; 2&#xff0e;能进行触发器之间的相互转换&#xff1b; 3&#xff0e;学习触发器的一些应用。 二、实验原理 触发器具有两个能够自行保持的稳定状态&#xff0c;用以表示逻辑状…

使用llama.cpp 在推理MiniCPM-1.2B模型

llama.cpp 是一个开源项目&#xff0c;它允许用户在C中实现与LLaMA&#xff08;Large Language Model Meta AI&#xff09;模型的交互。LLaMA模型是由Meta Platforms开发的一种大型语言模型&#xff0c;虽然llama.cpp本身并不包含LLaMA模型的训练代码或模型权重&#xff0c;但它…

vmware中的ubuntu系统扩容分区

1.虚拟机关机 右击虚拟机/设置&#xff0c;进入虚拟机设置 3.启动虚拟机&#xff0c;进入命令行 4.fdisk -l查看要扩展的分区名 5.resize要扩容的分区 su root parted /dev/sda resizepart 3 100% fdisk -l resize2fs /dev/sda3 df -T完成 6.其他 进入磁盘管理 fdisk /d…

MYSQL解说

MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于网站和应用程序的后端数据存储。 MySQL的基础知识&#xff1a; 1. 数据库和表 数据库&#xff08;Database&#xff09;&#xff1a;存储数据的逻辑容器。表&#xff08;Table&…

JAVA——打印流

目录 一、printStream 二、printWriter 三、打印流的应用——输出重定向 输出语句重定向的意义 一、printStream 1. 作用&#xff1a; 打印流可以实现更方便、更高效的打印数据出去 跟着黑马实现一下&#xff1a;printStream 的底层实现效率更高&#xff0c;println输什么…

关于实时数仓的几点技术分享

一、实时数仓建设背景 业务需求的变化&#xff1a;随着互联网和移动互联网的快速发展&#xff0c;企业的业务需求变得越来越复杂和多样化&#xff0c;对数据处理的速度和质量要求也越来越高。传统的T1数据处理模式已经无法满足企业的需求&#xff0c;实时数据处理成为了一种必…

floodfill+DFS(2)

文章目录 太平洋大西洋流水问题扫雷游戏迷路的机器人 太平洋大西洋流水问题 class Solution { public:vector<vector<int>> res;int m 0, n 0;vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m heights.size…

35.贪心算法2

1.按身高排序&#xff08;easy&#xff09; 2418. 按身高排序 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public String[] sortPeople(String[] names, int[] heights) {// 1. 创建⼀个下标数组int n names.length;Integer[] index …

tair性能挑战赛攻略心得-Zzzzz

关联比赛: 第二届数据库大赛—Tair性能挑战 赛题分析 赛题要求实现一个基于persistent memory&#xff08;AEP&#xff09;的持久化键值存储系统&#xff0c;并要求从数据正确性和系统读写性能两个方面来考虑系统设计。 正确性 数据正确性包括数据写入的持久性和原子性两个…