Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
HMI-Board
串口
RA6M3 HMI Board 之 UART实践
发布于 2023-06-26 21:43:17 浏览:549
订阅该版
#第1章 RT-Thread Studio 上的UART实践 ##1.1 前言说明 串口是MCU上最常见和使用最为频繁的外设之一,可以用作打印调试信息、远程登陆、控制支持串口通讯的外设等功能,了解和掌握串口是嵌入式开发中的一项必备技能。 ###1.1.1 本章内容 使用RT-Thread Studio创建开发板的程序,编写UART的程序,实现串口打印数据的功能,同时使用Finsh Shell控制开发板上的LED。 ###1.1.2 模块介绍 开发板上提供了两个串口连接,分别是在P109和P110的串口9,通过调试器的虚拟串口与上位机通讯。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230624/b09b18a44ff6b7544a2bb658c3640af0.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230624/5a16bf2e8af36dcb5c113846f64abc9b.png) 另一个串口位于P205和P206的串口4,TXD和RXD引脚引出到Ardinuo接口上,在开发板上也直接标出了。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230625/a6065d442e4f7587e19a1a2a2daa23c4.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230625/56ea3ce40ac30a40622c2ac71c556309.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230625/e8cf3c8bde65580ece6710d43731e473.png.webp) ###1.1.3 开发软件 根据《实践指南说明》安装fsp3.5.0和RT-Thread Studio(2.2.6)。 ##1.2 步骤说明 安装好开发环境后,首先对RT-Thread Studio的SDK Manager中安装包进行检查,确定相关的软件支持包已经安装。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/f35b0b466c610daad89972d454b3983a.png) ###1.2.1 新建工程 点击工具栏中的文件->新建->RT-Thread项目 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/a5340be6a29442dbb657575a5e72942e.png.webp) 选择目标开发板以及工程默认位置,这里一定要选择HMI_Board,对应的BSP版本为1.0.3,如果选择RA6M3-HMI-Board,对应的BSP版本为1.0.2,在使用串口时有Bug存在,会导致程序无法正常运行。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/07a47d2b67d0ff0a5cf6a584333f2919.png) 给项目一个合适的名字 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/3e765662bb72d467a2d768bf92c72e65.png.webp) 点击完成后,就可以得到一个打印信息以及一秒钟翻转LED的程序。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/ae1eadda123c6e135c343b32ea95bbdf.png.webp) 这个程序是一个完整的程序,点击编译后可以直接下载运行。在此基础上我们就可以根据自己的需要编写相应的驱动程序。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/ab6604be7293b7ef4b211b57194dfd07.png.webp) 如果在下载过程中遇到上述问题,可以通过更新pyocd的版本来修正,这一问题的原因是pyocd的版本过低导致。安装0.2.0的pyocd添加对瑞萨的支持就可以解决这个问题。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/8f37e2f5cba6d1c0ce4f4419bd37a17e.png.webp) 由RT-Thread Studio创建的软件工程本身就是一个演示了LED翻转和串口功能的例程,我们上来就可以得到可以运行的使用了串口输出信息的程序。需要注意的是,rtthread为了方便开发者调试,在系统中嵌入了Finsh这个简易的控制台程序,根据用户使能的模块提供了不同的控制指令。 新创建的工程编译通过后,利用板载的daplink将固件烧写到开发板上。 在串口终端中输入help,可以查看当前支持的指令。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/926d8be2c208d0e0738fd5714bf4a392.png.webp) 其中list的功能很多,后面跟随不同的参数可以实现不同的功能, 如图所示,可以产看当前系统中的线程、定时器、信号量、互斥量、事件、邮箱、消息队列以及设备的实例个数。可以帮助开发者掌握当前系统的运行状态。另外reboot功能可以减少设备上下电的次数,方便远程调试。 Finsh的除了上述已经定义好的功能,还支持自定义指令,可以帮助开发者自定义一些测试函数,方便针对特定情境进行测试。 开发板默认使用uart9作为调试串口,在开发板上的Ardinuo接口上,引出了uart4。开发板默认是不开启uart4,为了能使用uart4,首先使用FSP工具配置相关的引脚。 点击工程中的RA Smart Configurator,可以启动代码配置工具对MCU的外设进行配置。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/53a01a273f9267aa115d652ddcc4f0e7.png.webp) 在Stack栏中的New Stack->Connnectivity->UART添加新的UART实例。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/eadd7523181081a184dc6d9638b660e8.png.webp) 修改General栏中的通道和设备名称 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/907db9dbeeea5ce14678f1affff22106.png) 在Pins引脚栏中设定使用的引脚和引脚的工作模式。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/7ff80ebf694bec5a736f0df896fd9f77.png.webp) 点击“Generate Project Content”,即可关闭FSP工具。 回到工程中点击RT-Thread Settings,对工程中要使用的硬件进行配置。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/99445d848fe763b66ad04242103b3a6b.png.webp) 在配置界面的硬件一栏中勾选Enable UART4 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/8755f2d9cf37906089dee684c4b1484d.png.webp) 保存文件后,就可以在工程中添加uart4,并在工程调用相关的串口函数。 ###1.3 代码验证 通过串口发送字符串,是嵌入式应用中的基本程序,检验串口是否正常工作。在hal_entry.c中添加以下代码: ```c #include
#include "hal_data.h" #include
#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)); } } ``` 硬件连接如图 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/13a2ebcc899d7f46ec7bd3e53f8a020a.png.webp) 串口打印的效果如下图所示。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/c4a3bee43bdbd7028d0b930d6fc07de9.png.webp) 下面使用Finsh的自定义功能实现uart4的回环功能。具体的代码如下 ```c #include
#include "hal_data.h" #include
#define LED_PIN BSP_IO_PORT_02_PIN_09 /* Onboard LED pins */ #define SAMPLE_UART_NAME "uart4" /* 串口设备名称 */ static rt_device_t serial; /* 串口设备句柄 */ /* 串口接收消息结构 */ struct rx_msg { rt_device_t dev; rt_size_t size; }; /* 消息队列控制块 */ 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[BSP_UART4_RX_BUFSIZE + 1]; while (1) { rt_memset(&msg, 0, sizeof(msg)); /* 从消息队列中读取消息 */ result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result == RT_EOK) { /* 从串口读取数据 */ 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_loop_sample(int argc, char *argv[]) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; static char msg_pool[256]; 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); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ /* 以 非阻塞接收及阻塞发送方式打开串口设备 */ 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_loop_sample, uart device loop sample); 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); } } ``` 在串口界面中输入控制指令 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/638508721be51b4847eba70018b625fa.png.webp) 测试效果如图所示: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230626/9baae6f476f083e9194b728fd69299ac.png.webp) ###1.4 章节总结 使用RT-Thread和FSP进行开始还是很方便的,在FSP中修改相关引脚的功能,RT-Thread中使用配置工具对BSP进行使能。同时RT-Thread官网上还有详细的文档和示例代码,帮助新手快速搭建工程和入门嵌入式开发是一个不错的选择。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
EPTmachine
Big Maker
文章
4
回答
4
被采纳
0
关注TA
发私信
相关文章
1
串口DMA发送数据时,数据被覆盖
2
关于串口DMA模式下rt_device_close问题
3
利用stm32f427实现usb转串口,电脑端什么也没有识别到
4
finsh 控制台 适配 RS 485请大神指点????
5
uart_sample.c 中,读串口设备时偏移量pos要设置为-1而不是0?
6
【结贴】at_device软件包中对串口接收数据缺少判断导致数据接收异常
7
串口无法接受数据,但可以发送
8
串口如何有效的清除掉接收缓冲,而不必一个一个的去读取
9
串口接收使用方式问题
10
雅特力FINSH问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部