瑞萨RA6M3开发实践指南-UART实践

1.背景说明

本文是参考`瑞萨RA6M3开发实践指南`文章教程,基于瑞萨HMI-Board BSP :1.1.1 版本 RT-Thread 5.0.1 版本操作步骤进行记录,整理成的文档。

1.1 本章内容

使用RT-Thread Studio创建开发板的程序,编写UART的程序,实现串口打印数据的功能,同时使用Finsh Shell控制开发板上的LED。

1.2 模块介绍

开发板上提供了两个串口连接,分别是在P109和P110的串口9,通过调试器的虚拟串口与上位机通讯。(UART9 为默认日志输出端口)

另一个串口位于P205和P206的串口4,TXD和RXD引脚引出到Ardinuo接口上,在开发板上也直接标出了。

1.3 开发软件

根据《实践指南说明》安装fsp3.5.0和RT-Thread Studio(2.2.6)。

2. 步骤说明

安装好开发环境后,首先对RT-Thread Studio的SDK Manager中安装包进行检查,确定相关的软件支持包已经安装。

2.1.新建工程

点击工具栏中的文件->新建->RT-Thread项目

选择目标开发板以及工程默认位置,这里一定要选择HMI_Board,对应的BSP版本为1.1.1。

点击完成后,就可以得到一个打印信息、支持Finsh以及一秒钟翻转LED的程序。

这个程序是一个完整的程序,点击编译后可以直接下载运行。在此基础上我们就可以根据自己的需要编写相应的驱动程序。

由RT-Thread Studio创建的软件工程本身就是一个演示了LED翻转和串口功能的例程,我们上来就可以得到可以运行的使用了串口输出信息的程序。需要注意的是,rtthread为了方便开发者调试,在系统中嵌入了Finsh这个简易的控制台程序,根据用户使能的模块提供了不同的控制指令。新创建的工程编译通过后,利用板载的daplink将固件烧写到开发板上。

其中list的功能很多,后面跟随不同的参数可以实现不同的功能。

如图所示,可以产看当前系统中的线程、定时器、信号量、互斥量、事件、邮箱、消息队列以及设备的实例个数。可以帮助开发者掌握当前系统的运行状态。另外reboot功能可以减少设备上下电的次数,方便远程调试。

Finsh的除了上述已经定义好的功能,还支持自定义函数,可以帮助开发者自定义一些测试函数,方便针对特定情境进行测试。

开发板默认使用uart9作为调试串口,在开发板上的Ardinuo接口上,引出了uart4。开发板默认是不开启uart4,为了能使用uart4,首先使用FSP工具配置相关的引脚。

点击工程中的RA Smart Configurator,可以启动代码配置工具对MCU的外设进行配置。

在Stack栏中的New Stack->Connnectivity->UART添加新的UART实例。

修改General栏中的通道和设备名称

在Pins引脚栏中设定使用的引脚和引脚的工作模式。

点击右上角 “Generate Project Content”,即可关闭FSP工具。

回到工程中点击RT-Thread Settings,对工程中要使用的硬件进行配置。

在配置界面的硬件一栏中勾选Enable UART4,

保存文件后,就可以在工程中添加uart4,并在工程调用相关的串口函数。

2.2. 编写测试程序

通过串口发送字符串,是嵌入式应用中的基本程序,检验串口是否正常工作。在hal_entry.c中添加以下代码:

/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author        Notes
 * 2021-10-10     Sherman       first version
 */

#include <rtthread.h>
#include "hal_data.h"
#include <rtdevice.h>

#define LED_PIN    BSP_IO_PORT_02_PIN_09 /* Onboard LED pins */

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

void hal_entry(void)
{
    rt_kprintf("\nHello RT-Thread!\n");
    /* 查找串口设备 */
        serial = rt_device_find(SAMPLE_UART_NAME);

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

    while (1)
    {
        rt_pin_write(LED_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED_PIN, PIN_LOW);
        rt_thread_mdelay(500);
        /* 发送字符串 */
        rt_device_write(serial, 0, str, (sizeof(str) - 1));
    }
}

硬件连接如图:

下面使用Finsh的自定义功能实现uart4的回环功能。具体的代码如下:

#include <rtthread.h>
#include "hal_data.h"
#include <rtdevice.h>

#define LED_PIN    BSP_IO_PORT_02_PIN_09 /* Onboard LED pins */

void hal_entry(void)
{
    while (1)
    {
        rt_pin_write(LED_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}

#include <rtthread.h>
#include <rtdevice.h>

#define SAMPLE_UART_NAME       "uart4"      /* 串口设备名称 */

/* 串口接收消息结构 */
struct rx_msg
{
    rt_device_t dev;
    rt_size_t size;
};
/* 串口设备句柄 */
static rt_device_t serial;
/* 消息队列控制块 */
static struct rt_messagequeue rx_mq;

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    struct rx_msg msg;
    rt_err_t result;
    msg.dev = dev;
    msg.size = size;

    result = rt_mq_send(&rx_mq, &msg, sizeof(msg));
    if (result == -RT_EFULL)
    {
        /* 消息队列满 */
        rt_kprintf("message queue full!\n");
    }
    return result;
}

static void serial_thread_entry(void *parameter)
{
    struct rx_msg msg;
    rt_err_t result;
    rt_uint32_t rx_length;
    static char rx_buffer[1024 + 1];

    while (1)
    {
        rt_memset(&msg, 0, sizeof(msg));
        /* 从消息队列中读取消息 */
        result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
        rt_kprintf("recv result = %d \r\n",result);
        if (result > 0)
        {
            /* 从串口读取数据 */
            rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
            rx_buffer[rx_length] = '\0';
            /* 通过串口设备 serial 输出读取到的消息 */
            rt_device_write(serial, 0, rx_buffer, rx_length);
            /* 打印数据 */
//            rt_kprintf("%s\n",rx_buffer);
        }
    }
}

static int uart_dma_sample(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX];
    static char msg_pool[1024];
    char str[] = "hello RT-Thread!\r\n";

    if (argc == 2)
    {
        rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
    }
    else
    {
        rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
    }

    /* 查找串口设备 */
    serial = rt_device_find(uart_name);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }

    /* 初始化消息队列 */
    rt_mq_init(&rx_mq, "rx_mq",
               msg_pool,                 /* 存放消息的缓冲区 */
               sizeof(struct rx_msg),    /* 一条消息的最大长度 */
               sizeof(msg_pool),         /* 存放消息的缓冲区大小 */
               RT_IPC_FLAG_FIFO);        /* 如果有多个线程等待,按照先来先得到的方法分配消息 */

    /* 以 DMA 接收及轮询发送方式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
    /* 设置接收回调函数 */
    rt_device_set_rx_indicate(serial, uart_input);
    /* 发送字符串 */
    rt_device_write(serial, 0, str, (sizeof(str) - 1));
    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }

    return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(uart_dma_sample, uart device dma sample);

测试效果如图所示:

4.章节总结

使用RT-Thread和FSP进行开始还是很方便的,在FSP中修改相关引脚的功能,RT-Thread中使用配置工具对BSP进行使能。同时RT-Thread官网上还有详细的文档和示例代码,帮助新手快速搭建工程和入门嵌入式开发是一个不错的选择。

工业物联网是将具有监控能力的给中采集作用传感器有控制器,结合移动通信、智能分析等先进技术不断融入到工业生产过程的各个阶段,从而提升制造效率,提高产品质量,降低生产成本,最终目的是实现将传统工业提生到智能化阶段。工业物联网的应用,具有实时性高、自动化程度高、安全性高、信息互联性强等特点。 2017年我国工业物联规模达到2400亿元,在整个物联网产业中的占比约为19.8%。预计在国家相关政策推动及应用需求带动下,到2020年,工业物联在整个物联网产业中的占比将达到25%,规模将突破4400亿元。据GE发布的《工业互联网:打破智慧与机器的边界》,在未来15年内,几个关键的工业领域,1%的效率提高将带来巨大的收益。据安信证券计算,工业互联网在工业领域提升1%的效率相当于给我国带来2980亿元的经济增值。 (资料来源于:GE发布的《工业互联网:打破智慧与机器的边界》) 大联大世平集团,针对目前 工业物联网 市场,推出基于Renesas MCU RA6M3的工业物联网方案,该方案具有HMI、支持以太网传输、工业级传感数据采集等功能。本方案组成包含 MCU Board & Sensor Board。方案硬件设计说明1. MCU Board 本工业物联网应用方案的主控芯片采用的是 Renesas MCU RA6M3,具有 Cortex-M4 架构, 120MHz,具有低功耗、高性能的 特点,此芯片支持HMI & 以太网,内置 JEPG Codec编码解码器,2D Drawing Engine,支持加密功能,其他详细功能如下图所示 除此之外,MCU Board 还提供以太网、HMI、Arduino 、PMOD 接口,详细位置示意如下图 2. Sensor Board Pathfinder Sensor Board 集成了 OLED 显示屏、振动马达、RGB 彩灯、UV Sensor、H&T 温湿度 Sensor 、Light Sensor等功能,支持多种数据采集。与MCU Board 通过 Arduino接口连接。 方案原理图设计: 主控芯片原理图(部分) HMI 屏幕模式选择原理图(部分) 方案 Layout 设计: 方案采用两层板设计,如下面图片所示 TOP 层 Bottom 层 方案软件设计说明 e2studio 是 Renesas MCU 基于 Eclipse 的集成开发环境。 除 Eclipse 自带强大的代码编辑器外,e2studio 还提供了丰富的扩展功能。e2studio涵盖了全部所有开发过程,从示例代码的下载到调试。而瑞萨电子的 RA 灵活软件包 Flexible Software Package ( FSP ) 提供了一种快速且通用的方法,以使用瑞萨电子 RA 微控制器( MCU )系列构建安全的连接的物联网( IoT )设备。FSP 提供了可用于生产环境的外围设备驱动程序,Amazon FreeRTOS和中间件堆栈,以利用 FSP 生态系统。 e2studio开发环境下载与安装(部分) Step1. 登录 Renesas 官网:https://www2.renesas.cn/cn/zh/,选择“产品→RA MCU” Step2. 进入RA介绍页面后点击选择灵活软件包(FSP) Step3. 点击“下载最新版本”如下图: Step4. 点击下载包含的所有文件,包括 e2studio安装包以及FSP 软件包 Step5. 打开.exe安装程序,依据指引安装。安装完成,运行e2studio,并可查看FSP 用户手册,点击“OK”完成安装并运行,至此,安装结束,并可开始开发软件 场景应用图产品实体图展示板照片方案方块图演示板正面图片( MCU Board )演示板正面图片( Sensor Board )核心技术优势1. 具备 HMI 应用功能,支持TFT-LCD 屏幕、内置 JPEG Codec 编码解码器、2D Drawing Engine 2. 具备以太网接口功能 3. 支持加密功能如:AES (128/192/256)、SHA1/SHA224/SHA256、3DES/ARC4 4. 64KB DataFlash 用作资料储存(类似 EEPROM) 5. 最多有 21 PIN 支持 5V 电压输入输出方案规格1. 处理器:ARM Cortex M4 32位处理器,(R7FA6M3AH2CFB LQFP-144) 2. 工作温度:-40℃ 至 + 85℃ 3. 屏幕规格:2.4寸电阻式 TFT-LCD 屏幕 4. 屏幕分辨率:240 × 320 5. 支持接口:以太网接口、TFT-LCD 屏幕接口、Arduino 接口、PMOD 接口 6. 烧录方式:J-Link SWD 接口 7. 开发环境:Rene
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值