Renesa Version Board开发RT-Thread 之UART驱动应用

目录

概述

1 硬件介绍

2 软件配置

2.1 RT-Thread Studio配置参数

 2.2 FSP配置MCU

3 RT-Thread中UART的接口介绍

3.1 RT-Thread UART简介

3.2  RT-Thread 下的UART接口

4  UART的应用

4.1 应用功能实现

 4.2 源代码文件

5 测试


程序下载地址:

RenesaVersionBoard开发RT-Thread之UART驱动应用资源-CSDN文库

概述

本文主要介绍RT-Thread下UART接口的使用方法,笔者使用Renesa Version Board开发板,其开放的UART端口为UART2。文章介绍了使用RT-Studio使能UART,使用FSP配置和使能UART-2,然后编写基于RT-Thread下UART的驱动接口,并测试其功能。

1 硬件介绍

Renesa Version Board开发板扩展接口上提供一个UART接口,其对应Pin引脚为:

Renesa Version Board功能定义
P802RX
P801TX

2 软件配置

2.1 RT-Thread Studio配置参数

点击RT-thread Settings, 在Hardware中使能UART2,并保存配置信息

 2.2 FSP配置MCU

1) 在RT-Thread Studio中点击FSP,打开该软件

2)配置SCI下的UART

 

3) 创建UART对应的stack

 

4) 完成以上参数配置后就可以生成项目文件

在hal_data.c文件中,看见和uart相关的代码:

sci_b_uart_instance_ctrl_t     g_uart2_ctrl;

            sci_b_baud_setting_t               g_uart2_baud_setting =
            {
                /* Baud rate calculated with 0.160% error. */ .baudrate_bits_b.abcse = 0, .baudrate_bits_b.abcs = 0, .baudrate_bits_b.bgdm = 1, .baudrate_bits_b.cks = 0, .baudrate_bits_b.brr = 64, .baudrate_bits_b.mddr = (uint8_t) 256, .baudrate_bits_b.brme = false
            };

            /** UART extended configuration for UARTonSCI HAL driver */
            const sci_b_uart_extended_cfg_t g_uart2_cfg_extend =
            {
                .clock                = SCI_B_UART_CLOCK_INT,
                .rx_edge_start          = SCI_B_UART_START_BIT_FALLING_EDGE,
                .noise_cancel         = SCI_B_UART_NOISE_CANCELLATION_DISABLE,
                .rx_fifo_trigger        = SCI_B_UART_RX_FIFO_TRIGGER_MAX,
                .p_baud_setting         = &g_uart2_baud_setting,
                .flow_control           = SCI_B_UART_FLOW_CONTROL_RTS,
                #if 0xFF != 0xFF
                .flow_control_pin       = BSP_IO_PORT_FF_PIN_0xFF,
                #else
                .flow_control_pin       = (bsp_io_port_pin_t) UINT16_MAX,
                #endif
                .rs485_setting          = {
                    .enable = SCI_B_UART_RS485_DISABLE,
                    .polarity = SCI_B_UART_RS485_DE_POLARITY_HIGH,
                    .assertion_time = 1,
                    .negation_time = 1,
                }
            };

            /** UART interface configuration */
            const uart_cfg_t g_uart2_cfg =
            {
                .channel             = 2,
                .data_bits           = UART_DATA_BITS_8,
                .parity              = UART_PARITY_OFF,
                .stop_bits           = UART_STOP_BITS_1,
                .p_callback          = g_uart2_Callback,
                .p_context           = NULL,
                .p_extend            = &g_uart2_cfg_extend,
#define RA_NOT_DEFINED (1)
#if (RA_NOT_DEFINED == RA_NOT_DEFINED)
                .p_transfer_tx       = NULL,
#else
                .p_transfer_tx       = &RA_NOT_DEFINED,
#endif
#if (RA_NOT_DEFINED == RA_NOT_DEFINED)
                .p_transfer_rx       = NULL,
#else
                .p_transfer_rx       = &RA_NOT_DEFINED,
#endif
#undef RA_NOT_DEFINED
                .rxi_ipl             = (12),
                .txi_ipl             = (12),
                .tei_ipl             = (12),
                .eri_ipl             = (12),
#if defined(VECTOR_NUMBER_SCI2_RXI)
                .rxi_irq             = VECTOR_NUMBER_SCI2_RXI,
#else
                .rxi_irq             = FSP_INVALID_VECTOR,
#endif
#if defined(VECTOR_NUMBER_SCI2_TXI)
                .txi_irq             = VECTOR_NUMBER_SCI2_TXI,
#else
                .txi_irq             = FSP_INVALID_VECTOR,
#endif
#if defined(VECTOR_NUMBER_SCI2_TEI)
                .tei_irq             = VECTOR_NUMBER_SCI2_TEI,
#else
                .tei_irq             = FSP_INVALID_VECTOR,
#endif
#if defined(VECTOR_NUMBER_SCI2_ERI)
                .eri_irq             = VECTOR_NUMBER_SCI2_ERI,
#else
                .eri_irq             = FSP_INVALID_VECTOR,
#endif
            };

/* Instance structure to use this module. */
const uart_instance_t g_uart2 =
{
    .p_ctrl        = &g_uart2_ctrl,
    .p_cfg         = &g_uart2_cfg,
    .p_api         = &g_uart_on_sci_b
};

3 RT-Thread中UART的接口介绍

3.1 RT-Thread UART简介

RT-Thread官方网站提供了有关UART使用的详细介绍,其网站地址如下:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v1/uart

打开网站后,可以看见如下页面:

3.2  RT-Thread 下的UART接口

应用程序通过 RT-Thread提供的 I/O 设备管理接口来访问串口硬件,相关接口如下所示:

函数描述
rt_device_find()查找设备
rt_device_open()打开设备
rt_device_read()读取数据
rt_device_write()写入数据
rt_device_control()控制设备
rt_device_set_rx_indicate()设置接收回调函数
rt_device_set_tx_complete()设置发送完成回调函数
rt_device_close()关闭设备

一个使用范例:

void test_uart( void )
{
    #define SAMPLE_UART_NAME       "uart2"    /* 串口设备名称 */

    static rt_device_t serial;                /* 串口设备句柄 */
    char str[] = "hello RT-Thread!\r\n";

    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */
 
    /* 查找串口设备 */
    serial = rt_device_find(SAMPLE_UART_NAME);

    /* 以中断接收及轮询发送模式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
   
    /* 发送字符串 */
    rt_device_write(serial, 0, str, (sizeof(str) - 1));
}

4  UART的应用

4.1 应用功能实现

编写一个函数,实现发送字符串的功能,在PC端口使用调试助手接收数据

代码16行: 定义设备信息

代码29行: 创建接收句柄

代码41行: 查找设备

代码44行: 打开串口,同时使能接收和发送功能

代码46行:发送字符串

 发送数据函数接口:

回调函数接口,中断函数会调用该函数,程序员只需调用相关的接口就能进行数据处理。

 

 4.2 源代码文件

创建comm_uart.c文件,编写如下代码:

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-08-25     Administrator       the first version
 */
#include "hal_data.h"
#include "comm_uart.h"


#define TRANSFER_LENGTH   128

#define SAMPLE_UART_NAME       "uart2"    /* 串口设备名称 */
/* 接收模式参数 */
#define RT_DEVICE_FLAG_RX_BLOCKING        0x1000   /* 接收阻塞模式 */

#define RT_DEVICE_FLAG_RX_NON_BLOCKING    0x2000   /* 接收非阻塞模式 */

/* 发送模式参数 */
#define RT_DEVICE_FLAG_TX_BLOCKING        0x4000   /* 发送阻塞模式 */

#define RT_DEVICE_FLAG_TX_NON_BLOCKING    0x8000   /* 发送非阻塞模式 */

#define RT_DEVICE_FLAG_STREAM             0x040     /* 流模式      */

static rt_device_t serial;                          /* 串口设备句柄 */
uint8_t  g_out_of_band_received[TRANSFER_LENGTH];
uint32_t g_transfer_complete = 0;
uint32_t g_receive_complete  = 0;
uint32_t g_out_of_band_index = 0;


void comm_uartInit( void )
{
    char str[] = "hello RT-Thread, I am uart2!\r\n";

    /* 查找串口设备 */
    serial = rt_device_find(SAMPLE_UART_NAME);

    // 串口设备使用模式为 (发送阻塞 接收非阻塞) 模式
    rt_device_open(serial,RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);

    rt_device_write(serial, 0, str, (sizeof(str) - 1));
}


void com_uartSend( char *buff, int len )
{
    rt_device_write(serial, 0, buff, len);
}


void com_uartTest( void )
{
    char str[] = "hello RT-Thread, I am uart2!\r\n";
    rt_device_write(serial, 0, str, (sizeof(str) - 1));
}


void g_uart2_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 (sizeof(g_out_of_band_received) > g_out_of_band_index)
            {
                /* Write either the next one or two bytes depending on the receive data size */
                if (UART_DATA_BITS_8 >= g_uart2_cfg.data_bits)
                {
                    g_out_of_band_received[g_out_of_band_index++] = (uint8_t) p_args->data;
                }
                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:
        {
        }
    }
}


5 测试

编译代码,下载到板卡中,在终端输入如下命令,查看UART-2是否被使能

list device

 编写一个测试函数,在主函数中发送字符串:

void com_uartTest( void )
{
    char str[] = "hello RT-Thread, I am uart2!\r\n";
    rt_device_write(serial, 0, str, (sizeof(str) - 1));
}

运行代码,在串口终端上可以看见:

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误的直接原因是系统无法找到文件"c:\program files(x86)\renesa",这可能是由于该文件被误删除、文件路径被改变或者系统出现了错误等原因造成的。当尝试运行某个程序时,如果需要用到这个文件,但是系统无法找到该文件,则会产生以上的错误信息。针对这个错误,我们可以采取一些措施来尝试解决问题。首先,我们可以检查该文件是否已经被误删除或者被其他程序占用。如果文件没有问题,则我们可以尝试更改文件的路径,以避免与其他程序出现冲突。同时,我们也可以尝试重新安装软件,并确保安装过程中没有出现任何异常,这有可能会解决该问题。如果以上措施都无法解决问题,则可能需要联系软件的开发商,寻求更专业的技术支持。总之,针对这个错误,我们需要先了解其直接原因,并采取一些行动来解决问题,以确保软件能够正常运行。 ### 回答2: 这个错误提示意味着系统找不到指定路径下的"renesa"产品文件。通常几种情况会导致这个错误: 第一,该产品文件已经被删除或移动到其他位置。如果之前曾经在这个路径安装过该文件,但是现在找不到,那么很有可能是该文件被删除或者移动到了其他地方。在这种情况下,我们需要重新安装该产品文件。 第二,该产品文件被某种软件或者安全性程序误判为病毒或者不安全的文件。这种情况下,该文件可能被安全性程序给隔离或者删除了。如果是这种情况,我们需要先检查一下自己的安全性程序,看该文件是否被隔离,并将其恢复或者从白名单中添加该文件。 第三,该产品文件路径有误。有时候,我们可能会将该文件放在其他地方,或者修改了该文件的路径,这种情况下系统的程序就无法找到该文件。如果是这种情况,我们需要找到该文件的正确路径,并将其修改为正确路径。 总结来说,导致系统无法找到指定路径下的产品文件有多种情况。我们需要仔细检查程序文件的位置及其路径,确定路径是否正确,文件是否存在或者被误判为不安全文件。只有检测出具体原因,我们才能解决该问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值