首页 > 其他分享 >Renesa Version Board开发RT-Thread 之UART驱动应用

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

时间:2024-08-25 17:52:56浏览次数:15  
标签:RT rt Thread UART Version device uart2

目录

概述

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

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

标签:RT,rt,Thread,UART,Version,device,uart2
From: https://blog.csdn.net/mftang/article/details/141528671

相关文章

  • [RT-Thread记录]DFS虚拟文件系统文件夹操作异常
    项目场景:系统:RT-Thread5.0.2硬件:STM32H743问题描述1.文件系统打开文件夹再关闭后,申请的内存没有释放2.elm-fatFs文件系统重复操作同一个文件夹,如复制,会引起系统崩溃原因分析:        DFS虚拟文件系统文件打开关闭逻辑错误,文件系统版本升级更新后,dfs_file结......
  • pthread线程
    线程概念线程是轻量级进程,一般是一个进程中的多个任务。进程是系统中最小的资源分配单位进程是操作系统中资源分配的最小单位。每个进程都有自己的地址空间,并且拥有独立的资源(如内存、文件句柄等)进程之间通常是相互独立的,彼此不能直接访问对方的内存空间线程是系统中......
  • SmartDeviceControl_FreeRTOS_Hal_Zet6
    SmartDeviceControl_FreeRTOS_Hal_Zet6系统框图显示子设备框图我们不想让文件互相调用遇到的问题:OLED无响应,I2C无法工作解决:使用的是软件I2C,问题在于OLED的驱动中已经包含获取从机应答的函数更新:屏幕为2.8TFT-LCD使用FSMC来模拟8080并口驱动LCDFSMC_D0-FSMC_D......
  • 数论 Part : Dirichlet 卷积 & 莫比乌斯反演 & 杜教筛
    \(\text{-1前言}\)\(\text{-1.0日志}\)24.08.24:启动本文企划,正式着笔。\(\text{-1.1本文记号说明}\)本文使用\(\cdot\)表示乘号,\(*\)表示卷积,\(\mathbb{P}\)表示质数集。\(\text{0基础函数科技}\)单位函数\({\bf1}(x)=1\)。幂函数\(id^k(x)=x^k\)。恒等函数(幂......
  • 基于STM32F103的FreeRTOS系列(十一)·信号量·二值信号量与计数信号量详细使用以及移植
    目录1. 信号量简介1.1 同步和互斥1.1.1 同步1.1.2 互斥1.1.3 总结1.2 分类1.2.1 二值信号量1.2.2 计数信号量1.2.3 互斥信号量1.2.4 递归信号量2. 信号量控制块3. 常用信号量API函数3.1 创建信号量函数3.1.1 创建二值信号量 xSe......
  • 【大模型理论篇】Mixture of Experts(混合专家模型, MOE)
    1.MoE的特点及为什么会出现MoE1.1MoE特点         MixtureofExperts(MoE,专家混合)【1】架构是一种神经网络架构,旨在通过有效分配计算负载来扩展模型规模。MoE架构通过在推理和训练过程中仅使用部分“专家”(子模型),优化了资源利用率,从而能够处理复杂任务。   ......
  • USART之串口发送+接收应用案例
    文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1USART模块初始化3.1.1RCC开启时钟3.1.2GPIO初始化3.1.3配置USART3.1.4开启中断、配置NVIC3.1.5开启USART3.2USART串口收发模块3.2.1Serial_SendByte(发送一个字节数据)3.2.2USART1_IRQHandler(串口......
  • Writing your first Django app, part 1
    使用以下代码查看django的版本信息。$python-mdjango--version进入项目文件夹创建一个名为mysite的django项目。$django-adminstartprojectmysite会创建一个项目目录mysite/manage.pymysite/__init__.pysettings.pyurls.......
  • Study Plan For Algorithms - Part11
    1.合并两个有序链表题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。classSolution:defmergeTwoLists(self,list1:Optional[ListNode],list2:Option......
  • WebRTC 实时通信:构建高效网页视频通话的秘诀
    标题:WebRTC实时通信:构建高效网页视频通话的秘诀WebRTC(WebReal-TimeCommunications),即网页实时通信技术,是一种支持浏览器间无需额外插件即可实现音视频实时通信的API。本文将深入探讨WebRTC的基本概念、关键技术,并通过示例代码展示如何在网页中实现实时视频通话功能,让您快......