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

news2024/11/16 1:57:09

目录

概述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open3D 最小点约束的体素滤波(34)

Open3D 最小点约束的体素滤波(34) 一、算法介绍二、算法流程三、算法代码四、实现效果一、算法介绍 体素滤波可以达到快速减少点云数量的目的,而海量点云往往是需要这一步骤才可以进行后续处理的,比如配准时使用千万级别的原始点云配准显然是不合理的,因此体素滤波是比较重…

Mybatis搭建配置文件基础用法参数传递

背景介绍 Mybatis原是Apache的一个开源项目iBatis 2010碾开发团队转移到谷歌旗下改名为Mybatis Mybatis介绍 Mybatis是一个优秀的数据持久层框架(dao层 数据访问层 数据持久层) Mybatis是对jdbc进行封装,比见面jdbc这手动设置参数,手动映射结果的操作 Mybatis是将jdbc中的…

高变比LLC谐振变换器中“十”字型低匝比平面变压器设计

导语 为了解决高变比LLC谐振变换器的变压器绕组匝数过多、绕组结构复杂这一技术瓶颈背后的核心科学问题,本文提出一种“十”字型低匝比平面变压器,用于高变比LLC谐振变换器。 1.0引言 大数据中心的建设离不开供配电系统—电源设备的建设,为大…

15天速通java基础:java(J2SE)阶段学习总结(数据类型、数组、方法、面向对象、异常处理、容器、流、多线程、网络编程)

有一段时间没有写博客了,我这段时间去学习java了,谁也不会想到,短短两周的时间,我的java学习已经学习了不少东西了,毕竟python这座山也可以去攻java这块玉,对应python那就是基础的大部分内容,不…

吴恩达机器学习课后作业-06支持向量机(SVM)

SVM 线性可分SVM题目绘制决策边界改变C,观察决策边界代码 线性不可分SVM核函数代码 寻找最优C、gamma垃圾邮件过滤 线性可分SVM 题目 数据分布 绘制决策边界 import numpy as np import matplotlib.pyplot as plt import scipy.io as sio from scipy.optimize import minimi…

电子电路学习之二极管-1

特别感谢:B站博主:唐老师讲电赛 工科男孙老师 本文图片出自两位博主视频 再次感谢 1 半导体 1. 本征半导体 (Intrinsic Semiconductor) 定义:本征半导体是指纯净的、不掺杂任何杂质的半导体材料,如硅(Si)…

日本人形机器人仿真环境搭建

机器人 官网在这里 http://ai2001.ifdef.jp/uvc/uvc.html 我们可以下载他们的源码 ODE引擎安装 这个是刚体动力学模拟引擎,我用的是windows,大家可以自己参考着官网来(http://ode.org/wiki/index.php/Manual#Install_and_Use)…

【SpringBoot】自定义spring-boot-starter

目录 定义和目的# 命名规范# 准备阶段# 开发步骤# 一、创建 Starter 项目# 二、导入必要的依赖# 三、编写属性类# 四、自定义业务类# 五、编写自动配置类# 六、编写 spring.factories# ​编辑 七、编写配置提示文件# 八、测试 starter# 测试 starter# 一、导入自…

如何玩转CentOS Linux内核升级?手把手教你内核编译升级至最新版本

文章目录 如何玩转CentOS Linux内核升级?手把手教你内核编译升级至最新版本1 升级环境2 升级需求2.1 升级前的内核版本2.2 升级后的内核版本 3 升级步骤3.1 安装编译环境3.2 更新GCC版本3.2.1 多GCC版本共存3.2.2 永久替换旧的GCC 3.3 下载内核源代码并解压3.4 配置…

《数据结构》(408代码题及应用题)(王道收编真题)

一、线性表 1、线性表的线性表示 分析: “循环”左移,那这个循环就应该是我们需要重点思考的点。先考虑最简单的我们可以设置两个数组,其中一个数组保存的是原数据,另一个初始为空。接着想要实现循环左移就只需要找出相对应的位…

2002-2023年中债国债3年期到期收益率

国债是一种政府发行的债券,它为投资者提供了一种相对安全的投资渠道,因为背后有国家信用的支撑。国债的发行可以帮助政府筹集资金,用于公共支出、基础设施建设、社会福利等项目。国债通常分为两种形式:固定利率国债和浮动利率国债…

PHP 7.4.21 development server 源码泄露漏洞复现

原漏洞地址&#xff1a;https://blog.projectdiscovery.io/php-http-server-source-disclosure/ 版本&#xff1a;PHP<7.4.21 漏洞成因&#xff1a; 通过&#xff1a;PHP -s 开启的内置web服务器存在源码泄露漏洞&#xff0c;可以将PHP文件作为静态代码直接输出源码 POC&…

【区间dp】 P1775 石子合并(弱化版) 题解

题目描述 设有 N ( N ≤ 300 ) N(N \le 300) N(N≤300) 堆石子排成一排&#xff0c;其编号为 1 , 2 , 3 , ⋯ , N 1,2,3,\cdots,N 1,2,3,⋯,N。每堆石子有一定的质量 m i ( m i ≤ 1000 ) m_i\ (m_i \le 1000) mi​ (mi​≤1000)。现在要将这 N N N 堆石子合并成为一堆。每…

20240825 每日AI必读资讯

超6亿&#xff01;文心大模型日调用量半年增长超10倍&#xff0c;AI成百度最强加速引擎 - 文心大模型日调用量超过6亿次&#xff0c;日均处理Tokens文本超1万亿。与23年Q4公布的5000万次日均调用量相比&#xff0c;半年增长超10倍。 - 第二季度&#xff0c;百度云业务营收51亿…

【计算机网络】socket网络编程 --- 实现简易UDP网络程序之字符串回响

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【北京仁爱堂】脖子歪斜,拉扯疼痛怎么办?规律的生活让痉挛性斜颈的恢复事半功倍!

痉挛性斜颈是一种肌张力障碍性疾病&#xff0c;也是一种让人非常痛苦不堪的疾病&#xff0c;他不仅影响患者的外貌&#xff0c;也会对患者的身体和心理造成双重的打击&#xff0c;严重影响正常的生活&#xff0c;社交和工作。 痉挛性斜颈的病因尚不明确&#xff0c;因为做任何仪…

Java Web —— 第八天(登录功能)

基础登录功能 LoginController 类 RestController //用于处理 HTTP 请求 Slf4j //记录日志 RequestMapping("/login") public class LoginController {Autowiredprivate EmpService empService;PostMappingpublic Result login(RequestBody Emp emp){log.info(&quo…

FFmpeg的入门实践系列六(编程入门之常见处理流程)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力 文章目录 前期博客参考书籍一、FFmpeg常见的处理流程复制编解码器的参数完整代码 二、创建并写入音视频文件三、总结附页 前期博客…

《黑神话:悟空》中的实景三维建模

这几天&#xff0c;国产游戏《黑神话:悟空》终于面世&#xff0c;迅速引爆了全球游戏市场。作为一款以《西游记》为背景的3A级动作角色扮演游戏&#xff0c;《黑神话:悟空》不仅在文化表达上极具吸引力&#xff0c;其背后的技术实力更是令人瞩目。本文将深入探讨&#xff0c;3A…

新“冰桶挑战”风靡奥运年,荣耀让科技有温度

巴黎奥运会落幕之后&#xff0c;残奥会即将在8月28日正式开赛&#xff0c;“超越自我&#xff0c;挑战极限”的拼搏精神仍在延续。 而挑战精神&#xff0c;不分场上或台下&#xff0c;存在于生活中的每个角落。 2024年不仅是奥运年&#xff0c;也是“冰桶挑战”的十周年&…