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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

绪论​ “少年没有乌托邦 心向远方自明朗”,本章是应用层常用且重要的协议htttp,没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。 话不多说安全带系好,发车啦(建议电脑观看)。 1.Http协…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载:MySQL :: Download MySQL Community Server 本文也绑定该资源包,免费提供下载学习。 1.系统版本 2.新建目录,存放数据库安装包,并且上传 需要用到的工具:yum -y install vim lrzsz tar 上传解压&…

探索Python交互式编程的新境界:Python-prompt-toolkit的魔法

文章目录 探索Python交互式编程的新境界:Python-prompt-toolkit的魔法背景:为何选择Python-prompt-toolkit?Python-prompt-toolkit是什么?如何安装Python-prompt-toolkit?简单使用:Python-prompt-toolkit的…

C++,std::queue 详解

文章目录 1. 概述2. 包含头文件3. 基本操作3.1 构造函数3.2 赋值操作3.3 成员函数 4. 迭代器5. 示例6. 注意事项参考 1. 概述 std::queue 是 C 标准模板库(STL)中的一个容器适配器,它提供了一种先进先出(FIFO)的数据结…

【研发日记】嵌入式处理器技能解锁(五)——TI C2000 DSP的中断系统

文章目录 前言 背景介绍 中断框架 外设中断 ePIE模块 CPU中断 中断嵌套 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见…

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件,伴随着社区规模的不断扩大和住户的不断增多,本系统的主要目的是辞别帐本以及传统的单一数据管理系统,快捷的保存用户各种数据信息。本系统针对Java系统展开,使用Java、SpringB…

无人机RTK定位定向技术详解

无人机RTK(Real-Time Kinematic,实时动态差分技术)定位定向技术,是无人机领域的一项高精度导航与定位技术。它结合了全球导航卫星系统(如GPS、GLONASS、Galileo、BDS等)与实时差分技术,通过地面…

超越GPT4V,最强多模态MiniCPM-V2.6模型分享

MiniCPM-V2.6是由OpenBMB开发的一款多模态大型语言模型(MLLM),专为视觉-语言理解设计。 MiniCPM-V2.6模型能够处理图像、视频和文本输入,并提供高质量的文本输出。 MiniCPM-V 2.6模型在单图像理解方面超越了广泛使用的专有模型&…

机器学习课程学习周报九

机器学习课程学习周报九 文章目录 机器学习课程学习周报九摘要Abstract一、机器学习部分1.1 Word Embedding1.1.1 词嵌入的基本概念1.1.2 word2vec连续词袋模型CBOW1.1.3 word2vec跳字模型Skip-gram 1.2 Transformer代码实践DatasetDataloaderModelLearning rate scheduleModel…

windows javascript 打开、关闭摄像头

1. 效果 打开摄像头 关闭摄像头&#xff08;包括指示灯也关了的&#xff09; 2. 代码 open_close_camera.html // open_close_camera.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>use camera</title>…

使用Dotween制作按钮弹性动画效果

效果&#xff1a; 方式&#xff1a; 优点&#xff0c;不需要写任何代码、稳定、可自定义效果

Agent实际落地的应用 未来生活的无形助手

在这个信息爆炸的时代&#xff0c;我们每个人都在追求更高效的生活方式。想象一下&#xff0c;如果有一个无形的助手&#xff0c;能够理解我们的需求&#xff0c;自动处理繁琐的任务&#xff0c;甚至为我们提供个性化的建议&#xff0c;那将是多么美好的体验&#xff01;这正是…

数字模拟IC设计前端、后端、前仿、后仿新版虚拟机

虚拟化平台&#xff1a;VMware Workstation 15 Pro以上版本 操作系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 一、射频模拟IC设计必备软件 Cadence IC06.18.350/IC23.10.080&#xff08;virtuoso&#xff09; Cadence SPECTRE23.10.538-isr10 Cadence ASSURA04.…

Spring Boot OAuth2.0应用

本文展示Spring Boot中&#xff0c;新版本OAuth2.0的简单实现&#xff0c;版本信息&#xff1a; spring-boot 2.7.10 spring-security-oauth2-authorization-server 0.4.0 spring-security-oauth2-client 5.7.7 spring-boot-starter-oauth2-resource-server 2.7.10展示三个服务…

远程供水无障碍,管线车助力全面消防防护_鼎跃安全

夏季是各类自然灾害的高发季节&#xff0c;其中森林火灾尤为频繁。这一时期的气候特征是干旱少雨&#xff0c;伴随着高温和强风&#xff0c;使得森林火灾的发生频率大幅增加。由于夏季空气湿度低&#xff0c;植被含水量减少&#xff0c;一旦出现火源&#xff0c;火势极易蔓延。…

数据结构-链表-第二天

结合leetcode学习c 链表比数组更易增加和删除数据&#xff0c;但访问速度更慢 定义 链表&#xff08;linked list&#xff09;是一种线性数据结构&#xff0c;其中的每个元素都是一个节点对象&#xff0c;各个节点通过“引用”相连接。 引用记录了下一个节点的内存地址&#…

windows本地搭建zookeeper和kafka环境

zookeeper 1.1 下载zookeeper 下载地址 随便进一个站点&#xff0c;默认是新版本&#xff0c;旧版本点击archives进入&#xff0c;选择合适的版本下载&#xff0c;本文使用的是3.7.2 下载时候选择apache-zookeeper-3.7.2-bin.tar.gz 格式的&#xff0c;编译后的&#xff0c;解…

centos 虚拟机器刚刚安装没有ip地址的问题

刚刚安装好的虚拟机器&#xff0c;我们通过 ip addr 查看ip发现是这样的 该虚拟机器没有ip地址&#xff0c;那么怎么办 原来是在/etc/sysconfig/network-scripts/ifcfg-ens33中关于网络的配置有问题 ONBOOTno 表示不开启网卡&#xff0c;我们需要将这个值进行修改为yes 当前…

prolog 基础 - 关系和属性

首先进入环境&#xff1b; 看一下一开始的提示符是 ?- &#xff0c;现在可以用write语句输出一些东西&#xff1b; 根据资料&#xff0c;在prolog中&#xff0c; 两个对象之间的关系&#xff0c;使用括号表示。比如&#xff0c;jack的朋友是peter&#xff0c;写成friend(ja…

嵌入式堆栈、ARM寄存器

栈里面存放的内容&#xff1a;局部变量和系统信息&#xff0c;函数调用链路也是系统信息的一环 ARM寄存器 LR&#xff1a;程序跳转的时候&#xff0c;返回到的地址就保存到此处 PC&#xff1a;程序计数器&#xff0c;pc 要执行的下一条指令地址&#xff0c;就存放在此处&#…