RA6M3 HMI Board之UART实践介绍
1.1 前言说明 串口是MCU上最常见和使用最为频繁的外设之一,可以用作打印调试信息、远程登陆、控制支持串口通讯的外设等功能,了解和掌握串口是嵌入式开发中的一项必备技能。
(相关资料图)
1.1.1 本章内容 使用RT-ThreadStudio创建开发板的程序,编写UART的程序,实现串口打印数据的功能,同时使用Finsh Shell控制开发板上的LED。
1.1.2 模块介绍 开发板上提供了两个串口连接,分别是在P109和P110的串口9,通过调试器的虚拟串口与上位机通讯。
另一个串口位于P205和P206的串口4,TXD和RXD引脚引出到Ardinuo接口上,在开发板上也直接标出了。
1.1.3 开发软件 根据《实践指南说明》安装fsp3.5.0和RT-Thread Studio(2.2.6)。
1.2 步骤说明 安装好开发环境后,首先对RT-Thread Studio的SDK Manager中安装包进行检查,确定相关的软件支持包已经安装。
1.2.1 新建工程 点击工具栏中的文件->新建->RT-Thread项目
选择目标开发板以及工程默认位置,这里一定要选择HMI_Board,对应的BSP版本为1.0.3,如果选择RA6M3-HMI-Board,对应的BSP版本为1.0.2,在使用串口时有Bug存在,会导致程序无法正常运行。
给项目一个合适的名字
点击完成后,就可以得到一个打印信息以及一秒钟翻转LED的程序。
这个程序是一个完整的程序,点击编译后可以直接下载运行。在此基础上我们就可以根据自己的需要编写相应的驱动程序。
如果在下载过程中遇到上述问题,可以通过更新pyocd的版本来修正,这一问题的原因是pyocd的版本过低导致。安装0.2.0的pyocd添加对瑞萨的支持就可以解决这个问题。
由RT-Thread Studio创建的软件工程本身就是一个演示了LED翻转和串口功能的例程,我们上来就可以得到可以运行的使用了串口输出信息的程序。需要注意的是,rtthread为了方便开发者调试,在系统中嵌入了Finsh这个简易的控制台程序,根据用户使能的模块提供了不同的控制指令。
新创建的工程编译通过后,利用板载的daplink将固件烧写到开发板上。
在串口终端中输入help,可以查看当前支持的指令。
其中list的功能很多,后面跟随不同的参数可以实现不同的功能, 如图所示,可以产看当前系统中的线程、定时器、信号量、互斥量、事件、邮箱、消息队列以及设备的实例个数。可以帮助开发者掌握当前系统的运行状态。另外reboot功能可以减少设备上下电的次数,方便远程调试。
Finsh的除了上述已经定义好的功能,还支持自定义指令,可以帮助开发者自定义一些测试函数,方便针对特定情境进行测试。
开发板默认使用uart9作为调试串口,在开发板上的Ardinuo接口上,引出了uart4。开发板默认是不开启uart4,为了能使用uart4,首先使用FSP工具配置相关的引脚。
点击工程中的RA Smart Configurator,可以启动代码配置工具对MCU的外设进行配置。
在Stack栏中的New Stack->Connnectivity->UART添加新的UART实例。
修改General栏中的通道和设备名称
在Pins引脚栏中设定使用的引脚和引脚的工作模式。
点击“GenerateProject Content”,即可关闭FSP工具。
回到工程中点击RT-Thread Settings,对工程中要使用的硬件进行配置。
在配置界面的硬件一栏中勾选Enable UART4
保存文件后,就可以在工程中添加uart4,并在工程调用相关的串口函数。
1.3 代码验证
通过串口发送字符串,是嵌入式应用中的基本程序,检验串口是否正常工作。在hal_entry.c中添加以下代码:
#include #include "hal_data.h" #include #define LED_PIN BSP_IO_PORT_02_PIN_09 /* Onboard LED pins / #define SAMPLE_UART_NAME "uart4" /串口设备名称 / staticrt_device_t serial; /串口设备句柄 / char str[] = "hello RT-Thread!rn"; 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 #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] = "�"; /通过串口设备 serial 输出读取到的消息 / rt_device_write(serial, 0, rx_buffer, rx_length); /打印数据 */ rt_kprintf("%sn",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!rn"; 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); } }
在串口界面中输入控制指令
测试效果如图所示:
1.4 章节总结
使用RT-Thread和FSP进行开始还是很方便的,在FSP中修改相关引脚的功能,RT-Thread中使用配置工具对BSP进行使能。同时RT-Thread官网上还有详细的文档和示例代码,帮助新手快速搭建工程和入门嵌入式开发是一个不错的选择。
关键词:
相关阅读
-
RA6M3 HMI Board之UART实践介绍
RA6M3HMIBoard之UART实践介绍-串口是MCU上最常见和使用最为频繁的外设 -
河北洪灾普通人联手站在水中 河北多地...
大家好,今日关于【河北洪灾普通人联手站在水中河北多地遇山洪子弟兵抢 -
在八朝古都开封来一场“Citywalk”
头顶一条河,脚踏六座城,地处河南东部、黄河南岸的开封,两千多年的历 -
如货物一样被转卖!4年,“消失的他”终...
如货物一样被转卖!4年,“消失的他”终于回来了……“被当成货物卖... -
苹果力激活式耳机专利获授权
天眼查App显示,近日,苹果公司申请的“力激活式耳机”专利获得授权... -
朋友的男友在朋友已有身孕7个多月时要求...
朋友的男友在朋友已有身孕7个多月时要求分手并离开,女友生下孩子后半 -
墨界游戏和艺画开天联合开发的ARPG动作...
8月2日,由墨界游戏和艺画开天联合开发的新款ARPG动作角色扮演游戏《凡 -
安达维尔最新公告:拟5.05亿元投建天津...
安达维尔公告,公司拟与天津港保税区管理委员会投资合作协议,拟在天津 -
柳州车主注意!违停通知单有变化,与之...
8月1日上午,在城中区弯塘路,一辆机动车在人行道上违法停放,城中区城 -
涉嫌贿赂风波后,富力地产总裁张力回国...
本文来源:时代财经作者:刘新歌7月31日,据富力集团官方公众号消息, -
海南4所专门学校建成开学,招收这些学生...
海南日报记者从7月31日召开的全省“教育防护”专项行动年中工作会议... -
《读书破内卷——整本读经典1》新书发布...
2023年7月30日,《读书破内卷——整本读经典1》新书发布会在济南书... -
【行业观察】浅谈正确的信用卡“用卡观”
【行业观察】浅谈正确的信用卡“用卡观”,贷款,信贷,信用卡,用卡观,... -
缅甸各大金铺的这个重磅信息,你需要知道
缅甸各大金铺的这个重磅信息,你需要知道,缅甸,金铺,黄金,首饰,手工费, -
屯昌县乌坡镇推行“禁塑积分制” 以“...
为了进一步发动超市、农贸市场、餐饮等消费场所加入到禁塑活动当中,今 -
嘉兴举行党建引领个体工商户高质量发展...
嘉兴举行党建引领个体工商户高质量发展工作现场推进会暨《“骑士加... -
定西:让“孝善志愿之花”开在百姓心间
时值盛夏,山峦谷峰、满目锦绣。在这一片片翠绿、黛青和各色缤纷中,一 -
宁夏:夏日荷花“荷”其美
位于宁夏银川市兴庆区的鸣翠湖国家湿地公园荷花盛开。于晶摄盛夏时节, -
趁夜赶工搭违建,南京鼓楼城管当场查处
扬子晚报网8月1日讯(通讯员居泳吉记者张可)近日,南京鼓楼城管大队热 -
农遗良品敖汉小米再度亮相博览会
8月1日,由内蒙古自治区农牧厅、赤峰市人民政府联合主办,以“展示...