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

embedded/2024/10/21 17:33:37/

目录

概述

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.cDescription:  user bluetooth interface Author     :  tangmingfei2013@126.comDate       :  2024/09/15*/
#include "bsp_uart.h"
#include "bluetooth.h" 
#include "hal_data.h"#define TRANSFER_LENGTH       128static 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 inforerr = 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.ppmy.cn/embedded/118227.html

相关文章

Go语言设计与实现 学习笔记 第七章 内存管理(2)

扫描对象 运行时会使用runtime.gcDrain函数扫描工作缓冲区中的灰色对象&#xff0c;它会根据传入gcDrainFlags的不同选择不同的策略&#xff1a; // 清空垃圾收集器的工作缓冲区 func gcDrain(gcw *gcWork, flags gcDrainFlags) {// 获取当前M上运行的Goroutinegp : getg().m…

【react案例】实现评论列表

1. 需求 展示评论列表实现删除功能 2.1 只有自己的评论才展示删除按钮 2.2 点击删除按钮&#xff0c;删除当前评论tab切换&#xff08;点击对应tab&#xff0c;对tab文案高亮处理&#xff09;评论高亮评论排序&#xff08;最新、最热&#xff09; 2. 实现思路 useState维护评…

Translation Consistent Semi-supervised Segmentation for 3D Medical Images 阅读

code: yyliu01/TraCoCo: [TMI24] Translation Consistent Semi-supervised Segmentation for 3D Medical Images (github.com) paper:Translation Consistent Semi-supervised Segmentation for 3D Medical Images (arxiv.org) Abstract 三维医学图像分割方法已经取得了成功…

数字游戏C++

题目: 题目就是让你输入一个长度为88的0101串&#xff0c;让你求出中间1有几个。 wo一看到这题&#xff0c;立马想到暴力求解&#xff1a;循环八遍&#xff0c;每次输入一个char&#xff0c;减掉四十八加一起&#xff0c;输出&#xff0c; 细细一想&#xff1a;诶&#xff0c;…

【Java】网络编程-地址管理-IP协议后序-NAT机制-以太网MAC机制

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 &#x1f434…

每天一个数据分析题(四百七十六)- 线性回归建模

关于线性回归建模&#xff0c;线性回归分析中&#xff0c;回归方程的检验是&#xff1f; A. t检验 B. 卡方检验 C. F检验 D. 正态检验 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Python&#xf…

发票OFD格式转换成PDF

引入依赖&#xff0c;低版本的报错&#xff0c;2.0.2能够实现转换 <dependency><groupId>org.ofdrw</groupId><artifactId>ofdrw-converter</artifactId><version>2.0.2</version><exclusions><exclusion><groupId&g…

线性代数复习笔记

∣ A ∣ ∑ j 1 n a i j A i j ( i 1 , 2 , . . . , n ) ∑ i 1 n a i j A i j ( j 1 , 2 , . . . , n ) ; A i j ( − 1 ) i j M i j . |A|\sum_{j1}^na_{ij}A_{ij}\ (i1,2,...,n)\sum_{i1}^na_{ij}A_{ij}\ (j1,2,...,n);\ A_ij(-1)^{ij}M_{ij}. ∣A∣∑j1n​aij​Aij…