e2studio开发RA2E1(12)----打印函数(printf、 sprintf)的实现

ops/2025/2/13 0:16:08/

e2studio开发RA2E1.12--打印函数printf、 sprintf的实现

  • 概述
  • 视频教学
  • 样品申请
  • 硬件准备
  • 参考程序
  • 源码下载
  • 新建工程
  • 工程模板
  • 保存工程路径
  • 芯片配置
  • 工程模板选择
  • 时钟设置
  • UART配置
  • UART属性配置
  • 设置e2studio堆栈
  • e2studio的重定向printf设置
  • R_SCI_UART_Open()函数原型
  • 回调函数user_uart_callback ()
  • R_SCI_UART_Write()函数原型
  • sprintf()函数
  • sprintf函数声明
  • printf输出重定向到串口
  • printf输出
  • 演示

概述

printf 和 sprintf 是 C 语言中常用的输出函数,广泛应用于各种嵌入式、桌面应用程序和调试过程中。这些函数可以将格式化的数据输出到标准输出(如控制台)或存储到字符串中。在系统开发中,了解它们的底层实现不仅能够帮助优化性能,还能提高代码的可移植性和灵活性。

最近在瑞萨RA的课程,需要样片的可以加qun申请:925643491。

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1zZNmeTE1u/

e2studio开发RA2E1(12)----打印函数(printf、 sprintf)的实现

样品申请

https://www.wjx.top/vm/rCrkUrz.aspx

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为R7FA2E1A72DFL#AA0

在这里插入图片描述

参考程序

https://github.com/CoreMaker-lab/RA2E1

https://gitee.com/CoreMaker/RA2E1

源码下载

新建工程

在这里插入图片描述

工程模板

在这里插入图片描述

保存工程路径

在这里插入图片描述

芯片配置

本文中使用R7FA2E1A72DFL#AA0来进行演示。

在这里插入图片描述

工程模板选择

在这里插入图片描述

时钟设置

开发板上的外部高速晶振为12M.

在这里插入图片描述

需要修改XTAL为12M。

在这里插入图片描述

UART配置

在这里插入图片描述

点击Stacks->New Stack->Connectivity -> UART(r_sci_uart)。

在这里插入图片描述

UART属性配置

在这里插入图片描述

设置e2studio堆栈

printf函数通常需要设置堆栈大小。这是因为printf函数在运行时需要使用栈空间来存储临时变量和函数调用信息。如果堆栈大小不足,可能会导致程序崩溃或不可预期的行为。
printf函数使用了可变参数列表,它会在调用时使用栈来存储参数,在函数调用结束时再清除参数,这需要足够的栈空间。另外printf也会使用一些临时变量,如果栈空间不足,会导致程序崩溃。
因此,为了避免这类问题,应该根据程序的需求来合理设置堆栈大小。

在这里插入图片描述

printf_114">e2studio的重定向printf设置

在这里插入图片描述

在嵌入式系统的开发中,尤其是在使用GNU编译器集合(GCC)时,–specs 参数用于指定链接时使用的系统规格(specs)文件。这些规格文件控制了编译器和链接器的行为,尤其是关于系统库和启动代码的链接。–specs=rdimon.specs 和 --specs=nosys.specs 是两种常见的规格文件,它们用于不同的场景。
–specs=rdimon.specs
用途: 这个选项用于链接“Redlib”库,这是为裸机(bare-metal)和半主机(semihosting)环境设计的C库的一个变体。半主机环境是一种特殊的运行模式,允许嵌入式程序通过宿主机(如开发PC)的调试器进行输入输出操作。
应用场景: 当你需要在没有完整操作系统的环境中运行程序,但同时需要使用调试器来处理输入输出(例如打印到宿主机的终端),这个选项非常有用。
特点: 它提供了一些基本的系统调用,通过调试接口与宿主机通信。
–specs=nosys.specs
用途: 这个选项链接了一个非常基本的系统库,这个库不提供任何系统服务的实现。
应用场景: 适用于完全的裸机程序,其中程序不执行任何操作系统调用,比如不进行文件操作或者系统级输入输出。
特点: 这是一个更“裸”的环境,没有任何操作系统支持。使用这个规格文件,程序不期望有操作系统层面的任何支持。
如果你的程序需要与宿主机进行交互(如在开发期间的调试),并且通过调试器进行基本的输入输出操作,则使用 --specs=rdimon.specs。
如果你的程序是完全独立的,不需要任何形式的操作系统服务,包括不进行任何系统级的输入输出,则使用 --specs=nosys.specs。

在这里插入图片描述

R_SCI_UART_Open()函数原型

在这里插入图片描述

故可以用 R_SCI_UART_Open()函数进行配置,开启和初始化UART。

    /* Open the transfer instance with initial configuration. */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);

回调函数user_uart_callback ()

当数据发送的时候,可以查看UART_EVENT_TX_COMPLETE来判断是否发送完毕。

在这里插入图片描述

在这里插入图片描述

可以检查检查 “p_args” 结构体中的 “event” 字段的值是否等于 “UART_EVENT_TX_COMPLETE”。如果条件为真,那么 if 语句后面的代码块将会执行。

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}

R_SCI_UART_Write()函数原型

在这里插入图片描述

故可以用 R_UARTA_Write()函数进行串口数据输出。

    unsigned char buff[]="RA E2STUDIO";uint8_t buff_len = strlen(buff);err = R_SCI_UART_Write(&g_uart9_ctrl, buff, buff_len);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;

在这里插入图片描述

printf_190">sprintf()函数

sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,…]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以考虑使用 snprintf函数,该函数可对写入字符数做出限制。

printf_193">sprintf函数声明

int sprintf(char *string, char *format [,argument,…]);
参数列表

● string-- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
● format-- 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是%[flags][width][.precision][length]specifier
● [argument]…:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

功能
● 把格式化的数据写入某个字符串缓冲区。

    unsigned char send_buff[100];sprintf(send_buff, "\nHello World!.\n");uint8_t len = strlen(send_buff);err = R_SCI_UART_Write(&g_uart9_ctrl, send_buff, len);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;memset(send_buff, '\0', sizeof(100));

printf_237">printf输出重定向到串口

打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include <stdio.h>

#ifdef __GNUC__                                 //串口重定向#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}

printf_271">printf输出

    int int_i=0;float float_i=66.20f;char char_i[]="hello e2studio";while(1){printf("int_i=%d\n",int_i);printf("float_i=%.2f\n",float_i);printf("char_i='%s'\n",char_i);int_i++;if(int_i>100)int_i=0;R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS); }

演示

在这里插入图片描述


http://www.ppmy.cn/ops/157901.html

相关文章

EtherNet/IP转Modbus TCP实现三菱变频器与西门子PLC通讯的配置案例

EtherNet/IP转Modbus TCP实现三菱变频器与西门子PLC通讯的配置案例 一、案例背景 某汽车制造公司拥有一条高度自动化的生产线&#xff0c;该生产线集成了来自不同品牌的机器人、传感器和检测设备。这些设备分别采用MODBUS TCP和EtherNet/IP协议进行通信&#xff0c;但由于协议…

疯狂前端面试题(二)

一、Webpack的理解 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。Webpack 能够将各种资源&#xff08;JavaScript、CSS、图片、字体等&#xff09;视为模块&#xff0c;并通过依赖关系图将这些模块打包成一个或多个最终的输出文件&#xff08;通常是一个或几个…

Java算法技术文章:深入解析排序、搜索与数据结构

引言 在软件开发的世界里&#xff0c;算法不仅是程序设计的基础&#xff0c;更是提升软件性能、优化用户体验的关键。Java&#xff0c;作为一种广泛使用的编程语言&#xff0c;提供了丰富的API和标准库来支持各种算法的实现。本文将深入探讨Java中的排序算法、搜索算法以及一些…

Transformer解码器终极指南:从Masked Attention到Cross-Attention的PyTorch逐行实现

Transformer 解码器深度解读 代码实战 1. 解码器核心作用 Transformer 解码器的核心任务是基于编码器的语义表示逐步生成目标序列&#xff08;如翻译结果、文本续写&#xff09;。它通过 掩码自注意力 和 编码器-解码器交叉注意力&#xff0c;实现自回归生成并融合源序列信息…

02.10 TCP之文件传输

1.思维导图 2.作业 服务器代码&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> …

Node.js笔记入门篇

黑马程序员视频地址&#xff1a; Node.js与Webpack-01.Node.js入门 基本认识 概念 定义&#xff1a;Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本 作用&#xff1a;使用Node.js 编写服务器端程序 ✓ …

输入框相关,一篇文章总结所有前端文本输入的应用场景和实现方法,(包含源码,建议收藏)

前言 本篇文章所有的代码&#xff0c;都是在 vue vite ts 项目基础之上实现的&#xff0c;这样也是为了方便大家直接用源码&#xff0c;在开始之前建议大家阅读这篇《零基础搭建 vite项 目教程》。此项目就是这个教程搭建的&#xff0c;本篇文章关于输入框的相关代码是此项目…

分享一款免费的AI大模型字幕工具,支持语音识别、字幕断句、优化、翻译、视频合成等全流程自动处理(支持抖音、B站、油管等国内外多平台视频下载与处理)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 AI字幕工具:全平台视频创作的福音 📒💡 功能与特点:一网打尽⚙️ 使用⚓️ 相关链接 ⚓️📖 介绍 📖 还在为视频加字幕抓狂?🤯 平台限制多,操作又繁琐?别再挠破头皮啦!今天给大家分享的这款AI神器,简直是视频创…