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

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

3天内不再提示

基于单片机的串口调试打印

CHANBAEK 来源:凌云物联网实验室 作者:郭工 2022-12-19 09:23 次阅读

3.1 原理图分析

查看EK-RA6M4的原理图,如下图所示,串口 UART0 挂在了Pmod2接口的 P411,P410 这两个引脚上,而这两个引脚又可以复用为 SPI1 功能的两个引脚。此时,我们将希望修改FSP配置,让这两个引脚作为程序的 printf() 标准输出调试打印。

图片

3.2 Pins引脚配置

接下来我们打开项目中的FSP配置文件,配置使能相应串口的Pin功能,并重新生成代码。

图片

3.3 Stack配置

接下来我们选择 Stacks , 点击 "New Stack" -> "Connectivity" -> "UART(r_sci_uart)" 添加串口通信功能协议栈。

图片

如下图所示,我们可以配置串口的相应属性,如波特率等。配置好之后,点击 “Generate Project Content” 按钮,将会自动生成串口的相关代码。

图片

  • 通过 Name 字段可以修改串口的设备名为 g_uart0,它将在IDE自动生成的文件 ra_gen/hal_data.c/h 中定义串口操作相关的变量;
  • 通过 Channel 字段可以修改串口通道,这里设置为0,下面的 Pins 将自动选择 TXD0、RXD0 的相关引脚;
  • 串口的波特率、奇偶校验位、数据位、停止位、误码率等都在这里设置,具体将定义在 ra_gen/hal_data.c 文件里的 g_uart0_cfg 变量中;

3.4 测试串口通信

接下来,我们可以修改 src/hal_entry.c 源文件,在里面添加串口的初始化 和 发送测试函数如下:

void hal_entry (void)
{
... ...
    #define HELLO_MSG  "Hello EK-RA6M4 Board
"
    R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
    R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)HELLO_MSG, strlen(HELLO_MSG));

    while (1)
    {
... ...
}

其中:

  • 串口的操作函数 R_SCI_UART_Open()R_SCI_UART_Write() 定义在 ra/fsp/src/r_sci_uart/r_sci_uart.c 源文件中,它由e2studio动态生成;
  • 打开串口函数里的两个参数 g_uart0_ctrlg_uart0_cfg ,定义在 ra_gen/hal_data.c/h 文件中,该C文件由上一步配置并动态生成;

使用 USB转串口连接 UART0的相应引脚( TxD0:P411, RxD0:P410 ),重新编译运行程序,串口上将会打印相应的字符串。

图片

3.5 printf函数实现

首先,我们在项目中创建 src/console.h 头文件如下。

#ifndef CONSOLE_H_
#define CONSOLE_H_

#include 
#include "r_sci_uart.h"
#include "hal_data.h"

#define g_console(x)    &g_uart0_##x
#define g_console_ctrl  g_console(ctrl)
#define g_console_cfg   g_console(cfg)

extern volatile bool g_console_txComplete;

/* Function declaration */
extern fsp_err_t console_initialize(void);
extern fsp_err_t deinit_console(void);
extern void console_callback(uart_callback_args_t *p_args);
extern int _write(int fd,char *pBuffer,int size);

#endif /* CONSOLE_H_ */

接下来创建 src/console.c 源文件如下:

#include "console.h"

/*  Tx complete flags */
volatile bool g_console_txComplete = false;

int _write(int fd,char *pBuffer,int size)
{
    fsp_err_t              err = FSP_SUCCESS;

    (void)fd;

    g_console_txComplete = false;
    err = R_SCI_UART_Write(g_console_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
    if(FSP_SUCCESS != err)
        __BKPT();

    while(g_console_txComplete == false)
    {
    }
    return size;
}

fsp_err_t console_initialize(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Initialize console UART */
    err = R_SCI_UART_Open (g_console_ctrl, g_console_cfg);
    FSP_ERROR_RETURN(FSP_SUCCESS == err, err);

    return FSP_SUCCESS;
}

fsp_err_t deinit_console(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Close module */
    err =  R_SCI_UART_Close (g_console_ctrl);
    FSP_ERROR_RETURN(FSP_SUCCESS == err, err);

    return FSP_SUCCESS;
}

void console_callback(uart_callback_args_t *p_args)
{
    switch (p_args->event)
    {
        case UART_EVENT_TX_COMPLETE:
            g_console_txComplete = true;
            break;

        default:
            break;
    }
}
  • Renesas MCU的printf()重定向函数为 _write(),在该函数中我们将通过调用串口发送函数将相关字符串发送出去;
  • 在使用串口发送函数时,我们应该要等待串口发送完成。所以在_write()函数里我们将等待 g_console_txComplete 标志完成;
  • 该标志将会在 console_callback() 函数里更新,这个是串口中断发送的回调函数。接下来我们需要在 FSP 配置中设置它。
  • 在该文件中,我们还添加 了 console 的初始化相关函数;

在添加上面的源文件后,我们需要把自己定义的 console 串口回调函数,加入到串口中断回调函数中去,这时需要修改 FSP 的相关配置。具体方式如下图所示:

图片

  • 这里通过Callback字段设置串口收发的中断回调函数 console_callback(),它将配置在 g_uart0_cfg 变量中,该函数需要我们自己实现;
  • 另外,我们也可以在这里修改串口中断的优先级;

另外,printf() 函数工作还需要修改堆栈大小,这里我们调整 Heap 的大小为 1024,然后重新生成代码即可。

图片

  • 如果使能了printf()函数,不用J-link调试的话,开发板上电重启后不能正常启动运行。这是因为printf将会阻塞在 J-link的semihosting输出 ,这时我们在编译时要取消semihosting的支持。这时只需要在下面的项目配置中,删除 --specs=rdimon.specs 链接选项即可。
  • 一般单片机的printf()函数默认并不支持浮点运行和浮点打印,因为它们比较占空间。如果想使能printf()打印浮点类型数的话,可以在项目配置中做如下设置。

图片

接下来再修改 src/hal_entry.c 源文件如下,此时 printf函数就能够正常工作了。

... ...
#include "console.h"
... ...

void hal_entry (void)
{
... ...
    console_initialize();
    printf("Hello EK-RA6M4 Board
");
    while (1)
    {    
... ...
}

编译重新运行后,串口上能够正常打印相应字符串。

图片

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

    关注

    6036

    文章

    44555

    浏览量

    634873
  • 串口
    +关注

    关注

    14

    文章

    1551

    浏览量

    76462
  • 串口通信
    +关注

    关注

    34

    文章

    1624

    浏览量

    55517
  • UART0
    +关注

    关注

    0

    文章

    5

    浏览量

    1698
收藏 人收藏

    评论

    相关推荐

    单片机串口模块调试方法

    笔者在调试某Cortex-M3内核单片机时遇到一个问题,此单片机不具备在线仿真功能,因此调试代码时只能使用UART输出Log的方式调试
    发表于 07-28 15:48 1540次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>串口</b>模块<b class='flag-5'>调试</b>方法

    怎样通过串口打印变量的值来调试单片机的代码呢

    调试单片机时,通过串口打印变量的值来调试代码是一种很好的调试方式,本文将讲述如何在PIC
    发表于 11-24 07:26

    串口调试工具

    串口调试工具 便于单片机下载 串口调试工具 串口调试
    发表于 11-20 16:35 42次下载

    单片机串口调试助手程序下载

    单片机串口调试助手程序下载,喜欢的朋友可以下载来学习。
    发表于 01-12 14:56 49次下载

    单片机多功能调试助手

    单片机多功能调试助手 串口、USB等调试用。
    发表于 03-11 10:34 8次下载

    如何进行单片机串口调试详细实例说明

    串口调试助手 发送一字节的数据,单片机马上会回发同样的数据在串口调试助手上显示,如果回发给串口
    发表于 07-08 17:14 1次下载
    如何进行<b class='flag-5'>单片机</b>的<b class='flag-5'>串口</b><b class='flag-5'>调试</b>详细实例说明

    单片机串口实验 串口介绍 串口原理

    文章目录1 串口的硬件初步认识2 中间桥梁芯片硬件电路3 电脑如何识别 中间桥梁芯片4 串口调试助手5 为什么需要CH340模块6 CH340模块可以换成别的吗7 单片机开发版设计理念
    发表于 11-10 20:20 16次下载
    <b class='flag-5'>单片机</b>的<b class='flag-5'>串口</b>实验 <b class='flag-5'>串口</b>介绍 <b class='flag-5'>串口</b>原理

    51单片机串口通讯详解

    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,
    发表于 11-11 17:06 15次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>串口</b>通讯详解

    单片机串口调试丢包验证过程记录 已解决

    单片机串口调试丢包验证过程记录 已解决
    发表于 11-16 15:36 80次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>串口</b><b class='flag-5'>调试</b>丢包验证过程记录 已解决

    MSP430 F5529 单片机 串口 测试 调试

    MSP430 F5529 单片机 串口 测试 调试
    发表于 11-19 18:21 15次下载
    MSP430 F5529 <b class='flag-5'>单片机</b> <b class='flag-5'>串口</b> 测试 <b class='flag-5'>调试</b>

    51单片机串口通信调试printf函数重定向输出打印

    51单片机串口通信以及printf调试串行通信1.串口初始化串口工作方式波特率设置通过软件直接生成串口
    发表于 11-20 16:36 16次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>串口</b>通信<b class='flag-5'>调试</b>printf函数重定向输出<b class='flag-5'>打印</b>

    【转】STC89C52RC单片机实现串口打印功能

    【转】STC89C52RC单片机实现串口打印功能
    发表于 11-25 16:06 19次下载
    【转】STC89C52RC<b class='flag-5'>单片机</b>实现<b class='flag-5'>串口</b><b class='flag-5'>打印</b>功能

    《电子DIY》之蓝牙的使用,Proteus仿真单片机串口的注意事项和实物调试注意事项。玩转单片机串口详细零基础版

    蓝牙的使用,Proteus仿真单片机串口的注意事项和实物调试注意事项。玩转单片机串口详细零基础版学习单片
    发表于 12-29 19:48 0次下载
    《电子DIY》之蓝牙的使用,Proteus仿真<b class='flag-5'>单片机</b><b class='flag-5'>串口</b>的注意事项和实物<b class='flag-5'>调试</b>注意事项。玩转<b class='flag-5'>单片机</b><b class='flag-5'>串口</b>详细零基础版

    单片机常用的调试方法

    单片机程序调试过程中,串口打印调试方法是非常重要的手段,在使用串口
    的头像 发表于 04-04 14:58 4882次阅读

    51单片机串口配置方法

    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,
    的头像 发表于 04-14 14:58 5108次阅读
    51<b class='flag-5'>单片机</b><b class='flag-5'>串口</b>配置方法