RA4M2开发(1)----使用串口进行打印_ra4m2开发(3)----读取isl29035数据-程序员宅基地

技术标签: E2STUDIO  ##瑞萨  串口  RA4M2  瑞萨RA  单片机  

概述

本篇文章主要介绍如何使用e2studio对瑞萨RA4M2开发板进行串口打印配置。
最近在弄ST和瑞萨的课程,需要样片的可以加群申请:6_15061293 。

视频教学

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

瑞萨RA开发(1)----使用串口进行打印

csdn课程

csdn课程更加详细。
https://edu.csdn.net/course/detail/36131

样品申请

https://www.wjx.top/vm/wBbmSFp.aspx#

完整代码下载

硬件准备

首先需要准备一个开发板,这里我准备的是芯片型号R7FAM2AD3CFP的开发板:
在这里插入图片描述

样品申请

https://www.wjx.top/vm/wBbmSFp.aspx#

新建工程

在这里插入图片描述

工程模板

在这里插入图片描述

保存工程路径

在这里插入图片描述

芯片配置

本文中使用R7FA4M2AD3CFP来进行演示。
在这里插入图片描述

工程模板选择

在这里插入图片描述

时钟设置

开发板上的外部高速晶振为12M.
在这里插入图片描述
需要修改XTAL为12M。

在这里插入图片描述

管脚配置

查看原理图可以得知,串口为P109和P110。
在这里插入图片描述

UART配置

点击Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。
在这里插入图片描述

UART属性配置

在这里插入图片描述

printf()函数

printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf(“<式样化字符串>”,<参数表>);
其中式样化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出;另一部分是式样化规定字符, 以"%“开端, 后跟一个或几个规定字符, 用来确定输出内容式样。 参量表是需求输出的一系列参数, 其个数务必与式样化字符串所阐明的输出参数个数一样多, 各参数之间用英文逗号”,"分开, 且顺序逐一对应, 不然将会出现意想不到的错误。
注意:函数printf从右到左压栈,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所以我们看见的结果是,从右边开始处理的。

设置e2studio堆栈

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

e2studio的重定向printf设置

在这里插入图片描述
在e2studio中使用printf打印时,如果在链接器脚本文件中使用了–specs=rdimon.specs参数,则编译器会使用rdimon.specs文件中的系统调用函数来实现printf函数。
在这种情况下,printf函数的输出会被重定向到一个固定的地址(通常是RAM中的一段地址),而不是直接输出到控制台或串口。这样就需要在程序中实现一个驱动程序来读取这些输出并将其输出到控制台或串口。
如果希望printf函数的输出直接输出到控制台或串口,那么需要删除–specs=rdimon.specs参数。这样编译器就会使用标准的printf函数实现,输出就会直接输出到控制台或串口。
C++ 构建->设置->GNU ARM Cross C Linker->Miscellaneous去掉Other linker flags中的 “–specs=rdimon.specs”
在这里插入图片描述

R_SCI_UART_Open()函数原型

在这里插入图片描述

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

 /* Open the transfer instance with initial configuration. */
    fsp_err_t 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 语句后面的代码块将会执行。

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;
    }
}

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)
#endif

PUTCHAR_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;
}

完整代码

#include "hal_data.h"
#include <stdio.h>
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
/* Callback function */
void user_uart_callback(uart_callback_args_t *p_args)
{
    
    /* TODO: add your own code here */
    if(p_args->event == UART_EVENT_TX_COMPLETE)
     {
    
         uart_send_complete_flag = true;
     }



}


#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_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;
}


/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    
    /* TODO: add your own code here */

    /* Open the transfer instance with initial configuration. */
       err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
       assert(FSP_SUCCESS == err);
       printf("hello world!\n");
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */

实现效果

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_24312945/article/details/128797482

智能推荐

(附源码)计算机毕业设计SSM智慧消防维保系统后端设计与实现_智慧消防 代码货栈-程序员宅基地

文章浏览阅读545次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。_智慧消防 代码货栈

C# .NetCore知识点-程序员宅基地

文章浏览阅读6.6k次,点赞11次,收藏79次。1、.netCore的执行过程2、如何在controller中注入service?在Config Services方法中配置这个service在Controller的构造函数中 添加这个依赖注入3、.netCore比.net更具优势的地方是什么?跨平台,可以运行在 Windows 、Linux 和 MAC 系统上对框架本身安装没有依赖,所有依赖都和程序本身在一起.netCore处理请求的效率更高,进而可以处理更多的请求具有更多的安装配置方法4、.netCore主要的特性有哪些?依赖注入_.netcore

苹果电脑删除数据恢复该怎么做?恢复Mac电脑误删文件的4种方法_easyrecovery crack-程序员宅基地

文章浏览阅读1k次,点赞25次,收藏27次。如何在Mac上恢复误删除的文件?在日常使用Mac电脑时,无论是工作还是娱乐,我们都会创建和处理大量的文件。然而,有时候可能会不小心删除一些重要的文件,这无疑会给我们带来一些麻烦。那么,要在Mac电脑上恢复误删除的文件,我们可以采取以下4种方法,本文将详细介绍这些方法。_easyrecovery crack

C# Lambda表达式和linq表达式 之 匿名对象查询接收-程序员宅基地

文章浏览阅读376次。很多小伙伴都用过Lambda表达式和linq表达式,用起来也得心应手,但是有的小伙伴对匿名对象的查询与接收比较迷茫,(没有定义相应的实体),怎么在where()里面进行条件筛选呢?常规用法我就不说了,我们来说一下匿名对象怎么操作。我们先看一下Lambda表达式的形式:Lambda表达式说明x=>x*x返回参数值的平方x=>{r..._list>查询里面的数据并取值

进程在操作系统内核程序临界区不能进行调度与切换,在普通临界区能够调度与切换?什么是临界资源?什么是临界区_为什么访问普通临界区可以发生进程调度-程序员宅基地

文章浏览阅读3.9k次,点赞11次,收藏20次。操作系统考研真题进程在操作系统内核程序临界区不能进行调度与切换,在普通临界区能够调度与切换?什么是临界资源?什么是临界区_为什么访问普通临界区可以发生进程调度

[海思]--Hi3516a--GPIO(用户层)_海思sdk用户层控制gpio-程序员宅基地

文章浏览阅读5.6k次,点赞2次,收藏15次。[海思]–Hi3516a–GPIO(用户层)控制篇海思Hi3516aGPIO用户层控制篇gpio 玩过单片机的人都应该很熟悉了,然而在linux中,gpio操作属于内核层的范畴,用户想要直接配置gpio的模式和读取gpio的状态是比较困难的一件事情。那么本文主要讲述如何利用海思sdk已有的资源来实现用户层的gpio操作_海思sdk用户层控制gpio

随便推点

MetaGPT多智能体开发_metagpt调用qwen-程序员宅基地

文章浏览阅读971次,点赞15次,收藏16次。在MetaGPT看来,可以将智能体想象成环境中的数字人,其中智能体 = 大语言模型(LLM) + 观察 + 思考 + 行动 + 记忆这个公式概括了智能体的功能本质。举例说明:智能体为某后开发工程师角色那多智能体意味着什么呢如图例说明:你是一个软件公司的老板以上多智能体意味着一句话实现一个小型应用的开发:样例(由GPT-4生成)例如,如果你执行,将会得到包括数据类型&API设计在内的输出生成一个包含分析和设计内容的样例的成本约为(使用GPT-4),而生成一个完整项目的成本约为。在这里插入图片描述。_metagpt调用qwen

储能容量优化配置及经济调度模型:基于粒子群算法和遗传算法的混合发电系统调峰方案-程序员宅基地

文章浏览阅读282次。其次,引入粒子群算法,结合含有抽水蓄能机组的混合发电系统的调峰经济调度模型,提出双层储能容量优化配置的方法。而将粒子群算法与含有抽水蓄能机组的混合发电系统的调峰经济调度模型相结合,可以获得储能的最优容量配置,进一步提高混合发电系统的经济性和效益。通过介绍遗传算法和粒子群算法的原理及其在该问题中的应用,并进行实验验证,展示了双层储能容量优化配置的有效性和优越性。本人亲子编写,可修改,上层用遗传算法出容量配置,下层粒子群算法出运行调度计划,以成本最低得到含抽水蓄能机组的混合发电系统的调峰经济调度模型。

Python-PyCharm 报错解决:ImportError: cannot import name 'InteractiveConsole' from 'code'-程序员宅基地

文章浏览阅读5.4k次。此文首发于我的个人博客:Python-PyCharm 报错解决:ImportError: cannot import name ‘InteractiveConsole’ from ‘code’ — zhang0peter的个人博客早上在用PyCharm跑Python代码时遇到报错:Traceback (most recent call last): File "C:\Users\pete..._importerror: cannot import name 'interactiveconsole' from 'code

Layui下拉框赋值,局部刷新_layui刷新下拉框-程序员宅基地

文章浏览阅读645次。Layui下拉框_layui刷新下拉框

如何通过Vue.js脚手架工具搭建Vue.js项目_npm 安装脚手架-程序员宅基地

文章浏览阅读806次,点赞16次,收藏20次。通过npm全局安装@vue/cli脚手架 ,@3.10表示下载某个指定版本,如果不写,则默认下载最新版本。如果已经安装了 vue-cli (1.x或者2.x) ,需要先卸载,再重新全局安装vue-cli。(首次使用安装 vue 脚手架可跳过此步骤)_npm 安装脚手架

3DES加密解密_3des的加密过程为des加密--程序员宅基地

文章浏览阅读1.2w次。3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对数据进行三次加密。3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:3DES加密过程为:C_3des的加密过程为des加密-

推荐文章

热门文章

相关标签