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

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

3天内不再提示

软件设计及串口相关函数介绍

瑞萨嵌入式小百科 来源:瑞萨嵌入式小百科 2025-10-27 11:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

18.5.2

软件设计

18.5.2.1

新建工程

因为本章节的UART相关实验例程需要用到板子上的LED功能,因此我们可以直接以前面的“11_GPIO_LED”工程为基础进行修改。

对于e2studio开发环境:拷贝一份我们之前的e2s工程模板“11_GPIO_LED”,然后将工程文件夹重命名为“19_UART_Receive_Send”,最后再将它导入到我们的e2studio工作空间中。

对于Keil开发环境:拷贝一份我们之前的Keil工程模板“11_GPIO_LED”,然后将工程文件夹重命名为“19_UART_Receive_Send”,并进入该文件夹里面双击Keil工程文件,打开该工程。

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

列表1:文件结构

左右滑动查看完整内容

19_UART_Receive_Send
├─ ......
└─src
├─ led
│ ├─ bsp_led.c
│ └─ bsp_led.h
├─ debug_uart
│ ├─ bsp_debug_uart.c
│ └─ bsp_debug_uart.h
└─ hal_entry.c

18.5.2.2

FSP配置

下面以启明6M5开发板为例,进行FSP配置,另外两块开发板的FSP配置过程与启明6M5开发板的配置过程基本上是一样的。

首先打开“19_UART_Receive_Send”项目的FSP 配置界面进行配置。

在FSP配置界面里面点开“Pins”->“Peripherals”->“Connectivity:SCI”->“SCI4”来配置SCI模块,配置为“Asynchronous UART”模式,并选择开发板所使用的串口引脚,如图19_11。

389486a0-ab0f-11f0-8c8f-92fbcf53809c.png

图19-11 配置引脚

在配置界面底部点击“Stack”,如图19_12步骤加入串口UART:

38f7a8d4-ab0f-11f0-8c8f-92fbcf53809c.png

图19-12 加入串口

如图19_13点击刚刚加入的窗口,在左下角的“属性”窗口中配置名字(name)、通道(Channel)、回调函数(Callback)名字即可,引脚(Pins)、波特率(Baud Rate)等其他的属性按照默认的配置即可。

39594db4-ab0f-11f0-8c8f-92fbcf53809c.png

图19-13 配置串口属性

表3:实验所使用的UART属性描述

39b8beca-ab0f-11f0-8c8f-92fbcf53809c.png

使用printf函数时,需要使用到堆,默认情况下堆的大小为0,因此我们需要修改堆的大小。可以在FSP配置界面中的“BSP”属性栏的“RA Common”中通过修改“Heap size”来设置堆区大小。这里需要设置为8的整数倍,对于RA6M5推荐至少为4K(0x1000),如图19_14。

3a213054-ab0f-11f0-8c8f-92fbcf53809c.png

图19-14 修改堆的大小

最后点右上角的“Generate Project Content”按钮,让软件自动生成配置代码。

18.5.2.3

串口初始化函数

FSP配置并生成代码之后,首先需要使用R_SCI_UART_Open函数打开SCI4 UART模块,我们把这层调用封装为一个Debug_UART4_Init函数,如下所示。

列表2:代码清单19-1:文件bsp_debug_uart.c串口初始化

左右滑动查看完整内容

/* 调试串口 UART4 初始化 */
voidDebug_UART4_Init(void)
{
fsp_err_t err =FSP_SUCCESS;


err = R_SCI_UART_Open (&g_uart4_ctrl, &g_uart4_cfg);
assert(FSP_SUCCESS== err);
}

18.5.2.4

R_SCI_UART_Write函数

串口初始化完成之后,我们可以直接使用R_SCI_UART_Write函数来将字符串写入到串口输出,该函数的原型如下。

左右滑动查看完整内容

fsp_err_tR_SCI_UART_Write(uart_ctrl_t*constp_api_ctrl, uint8_tconst *␣
→constp_src, uint32_tconst bytes)

参数p_src指向要写入的字符串首地址

参数bytes为传入的要写入的字符的数目

我们在使用R_SCI_UART_Write函数需要注意的一些事项:若使用了R_SCI_UART_Write()来发送数据,在数据发送完成之后会导致uart_send_complete_flag这个标志位被置位,因此程序在调用R_SCI_UART_Write函数之后需要等待uart_send_complete_flag标志位被置位,然后将该标志位清零。否则当连续调用R_SCI_UART_Write函数时可能导致发送数据丢失。建议使用后文所述的printf函数将数据发送到串口。

18.5.2.5

串口中断回调函数

在前面的FSP配置步骤的时候,我们设置了串口中断回调函数的名字为:debug_uart4_callback。设置这么一个函数的原因是:每当串口发送或者接收完成一个字符时,都会默认触发串口的中断,而在串口中断中会调用函数 debug_uart4_callback,在函数里我们需要根据不同的中断情况进行相应的处理。

因此,我们也需要同时在我们的代码里面定义并实现这么函数debug_uart4_callback。我们把这个函数放到文件“bsp_debug_uart.c”中,该函数代码如下所示。

其中,需要定义一个额外的标志变量 uart_send_complete_flag来表示串口发送数据已完成。变量uart_send_complete_flag必须加上 volatile,否则可能被编译器优化。

列表3:代码清单19-2:文件bsp_debug_uart.c串口中断回调函数

左右滑动查看完整内容

/* 发送完成标志 */
volatilebool uart_send_complete_flag =false;


/* 串口中断回调 */
voiddebug_uart4_callback(uart_callback_args_t* p_args)
{
switch(p_args->event)
{
caseUART_EVENT_RX_CHAR:
{
/* 把串口接收到的数据发送回去 */
R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t*)&(p_args->data),1);
break;
}
caseUART_EVENT_TX_COMPLETE:
{
uart_send_complete_flag =true;
break;
}
default:
break;
}
}

18.5.2.6

重定向printf输出到串口

虽然我们可以直接使用R_SCI_UART_Write函数来将字符串输出到串口,但是这个函数在很多情况下没有printf函数那样方便。所以我们需要添加一段代码来将printf输出重定向到串口(UART4)。

我们将以下的代码添加到源文件“bsp_debug_uart.c”里面。由于不同C库的printf 函数的底层实现不同,这里使用条件编译选择我们需要重写的函数。

列表4:代码清单19-3:重定向printf输出到串口

左右滑动查看完整内容

/* 重定向 printf 输出 */
#ifdefined __GNUC__ && !defined __clang__
int_write(intfd,char*pBuffer,intsize);//防止编译警告
int_write(intfd,char*pBuffer,intsize)
{
(void)fd;
R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t*)pBuffer, (uint32_t)size);
while(uart_send_complete_flag ==false);
uart_send_complete_flag =false;


returnsize;
}
#else
intfputc(intch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t*)&ch,1);
while(uart_send_complete_flag ==false);
uart_send_complete_flag =false;


returnch;
}
#endif

在使用e2stdio的时候,需要修改C语言项目设置,按下图步骤修改即可。

3a750634-ab0f-11f0-8c8f-92fbcf53809c.png

图19-15 打开C/C++项目设置串口

3acc315c-ab0f-11f0-8c8f-92fbcf53809c.png

图19-16 修改项目工具设置

18.5.2.7

hal_entry入口函数

C语言程序的入口函数main函数调用了hal_entry函数。我们在hal_entry函数里面编写我们的应用代码。

列表5:代码清单19-4:main函数调用的hal_entry函数

左右滑动查看完整内容

voidhal_entry(void)
{
/*TODO:add your own code here */


LED_Init();// LED 初始化
Debug_UART4_Init();// SCI4 UART 调试串口初始化


printf("这是一个串口收发回显例程
");
printf("打开串口助手发送数据,接收窗口会回显所发送的数据
");
while(1)
{
LED1_ON;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
LED1_OFF;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
}


#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

首先我们调用LED_Init函数初始化板子上的LED 灯,然后调用Debug_UART4_Init函数初始化SCI4 UART作为调试串口来使用。之后就可以使用printf 函数了,我们调用printf输出提示信息到串口。接着在while循环里是一段让LED1每隔一秒钟闪烁的程序。3b2d57e8-ab0f-11f0-8c8f-92fbcf53809c.png

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

    关注

    243

    文章

    24454

    浏览量

    687878
  • 串口
    +关注

    关注

    15

    文章

    1607

    浏览量

    82008
  • uart
    +关注

    关注

    22

    文章

    1304

    浏览量

    106155
  • 函数
    +关注

    关注

    3

    文章

    4408

    浏览量

    66908
  • 开发环境
    +关注

    关注

    1

    文章

    253

    浏览量

    17555

原文标题:软件设计及串口相关函数介绍——瑞萨RA系列FSP库开发实战指南(47)

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    软件设计师全书

    软件设计师全书有软件设计师教程,软件设计师考试辅导,考点精讲,例题分析,强化训练,软件设计课程课件等内容。
    发表于 10-29 17:45 0次下载
    <b class='flag-5'>软件设计</b>师全书

    基于Vxworks的LANE软件设计探讨

    基于Vxworks的LANE软件设计探讨
    发表于 03-29 12:27 11次下载

    多功能函数发生器的波形分析计算与软件设计

    多功能函数发生器的波形分析计算与软件设计
    发表于 05-14 14:27 29次下载

    8051单片机C语言软件设计的艺术

    8051单片机C语言软件设计的艺术:主要介绍了8051单片机C语言软件设计的思维与解决方法。《8051单片机C语言软件设计的艺术》每一章都是一个精彩的例子,范例说明深入浅出。重点
    发表于 10-08 21:21 0次下载
    8051单片机C语言<b class='flag-5'>软件设计</b>的艺术

    基于Windows服务的网口与串口通信软件设计

    开发基于PC 机Windows 服务所实现的远程控制,在某些场合仍值得进一步研究。文中阐述了Windows 服务基本特性及架构设计,分析了网口与串口通信协议及其软件设计流程。就此,实
    发表于 12-25 15:23 52次下载

    微波自动测量系统软件设计

    微波自动测量系统软件设计:介绍了一套微波自动测量系统简易标量网络分析仪系统的软件设计. 该软件系统采用VC 编程下的Windows 用户界面,操作方便,交互性好,并结合几个测试功能模
    发表于 12-29 23:46 16次下载

    基于底层硬体的软件设计

    本内容介绍了基于底层硬体的软件设计
    发表于 05-09 16:04 60次下载
    基于底层硬体的<b class='flag-5'>软件设计</b>

    8051单片机C语言软件设计8051单片机C语言软件设计

    8051单片机C语言软件设计8051单片机C语言软件设计
    发表于 10-16 11:25 92次下载
    8051单片机C语言<b class='flag-5'>软件设计</b>8051单片机C语言<b class='flag-5'>软件设计</b>

    基于UML对象建模的财务软件设计研究

    本篇目的在于研究基于UML对象建模的财务软件设计。基于当前UML、财务软件设计相关知识,能够去优化分析基于UML的财务软件设计相关需求,开发
    发表于 11-13 17:16 6次下载
    基于UML对象建模的财务<b class='flag-5'>软件设计</b>研究

    ADS软件设计VCO的方法介绍

    本章内容是介绍使用ADS软件设计VCO的方法:包括原理图绘制,电路参数的调整优化、仿真等。 下面开始按顺序详细介绍ADS软件的使用方法。 设计振荡器这种有源器件,第一步要做的就是管子的
    发表于 12-11 17:16 1.3w次阅读
    ADS<b class='flag-5'>软件设计</b>VCO的方法<b class='flag-5'>介绍</b>

    关于Atmel的软件设计框架的介绍

    Atmel的软件设计框架
    的头像 发表于 07-06 04:49 3580次阅读
    关于Atmel的<b class='flag-5'>软件设计</b>框架的<b class='flag-5'>介绍</b>

    CapTIvateTM软件设计平台的应用介绍(2)

    CapTIvate Technology软件设计快速指南(三) - CapTIvate软件设计中心(CDC)介绍2
    的头像 发表于 08-13 00:20 3032次阅读

    CapTIvateTM软件设计平台的应用介绍(3)

    CapTIvate Technology软件设计快速指南(五) - CapTIvate软件设计中心(CDC)介绍3
    的头像 发表于 08-21 00:52 3876次阅读

    Quartus II软件设计系列的基础教程说明

    本文档的主要内容详细介绍的是Quartus II软件设计系列的基础教程说明。
    发表于 06-17 08:00 4次下载
    Quartus II<b class='flag-5'>软件设计</b>系列的基础教程说明

    STM32学习笔记--串口实验

    目录:一、实验任务二、硬件设计三、软件设计一、实验任务  用串口助手通过串口1向单片机发送数据,并将单片机接收到的数据通过串口返回到串口助手
    发表于 12-28 19:34 6次下载
    STM32学习笔记--<b class='flag-5'>串口</b>实验