Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AB32VG1
RT-Thread
《玩转中科蓝讯(AB32VG1)开发板》第3章 串口设备的使用
发布于 2021-03-16 23:41:09 浏览:1689
订阅该版
[tocm] [原文链接](https://blog.bruceou.cn/2021/03/3-use-of-serial-port-equipment/766/) **开发环境:** RT-Thread版本:4.0.3 操作系统:Windows 10 RT-Thread Studio版本:2.0.0 开发板MCU:AB5301A RTT 中外设作为设备存在,在建立工程的时候,AB32VG1串口0被作为系统调试串口,假如现在有一个串口模块需要和单片机通讯,则可以再初始化一个串口。如果没有驱动,那么第一步就需要写驱动,针对AB32VG1开发板,已经写好的UART驱动设备,只需要打开相应的设备即可。 ## 3.1串口设备的简单使用 ### 3.1.1实现串口的收发 **UART0**已经被用作了下载和调试串口,因此这里使用UART1。我们先来看看电路。  从电路图可以看出,这里使用的PA3和PA4,因此需要将**PA3和PA4**通过USB转串口接到PC上通过串口调试助手查看收发信息。 该工程默认使能了UART0和UART1,通过finish终端也能看到UART的设备。  这里直接写应用代码就行。在`applications`新建`task.c`和`task.h`文件。 **[task.c]** ```c /** ****************************************************************************** * @file task.c * @author BruceOu * @lib version V3.5.0 * @version V1.0 * @date 2021-01-10 * @blog https://blog.bruceou.cn/ * @Official Accounts 嵌入式实验楼 * @brief RTT任务 ****************************************************************************** */ /*Includes**********************************************************************/ #include "task.h" struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 初始化配置参数 */ /* 用于接收消息的信号量 */ static struct rt_semaphore rx_sem; static rt_device_t serial; /** * @brief uart_input //接收数据回调函数 * @param dev * size * @retval RT_EOK */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ rt_sem_release(&rx_sem); return RT_EOK; } /** * @brief serial_thread_entry * @param parameter * @retval None */ static void serial_thread_entry(void *parameter) { char ch; while (1) { /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ while (rt_device_read(serial, -1, &ch, 1) != 1) { /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ rt_sem_take(&rx_sem, RT_WAITING_FOREVER); } /* 读取到的数据输出 */ rt_kprintf("%c",ch); } } /** * @brief thread_serial * @param None * @retval ret */ int thread_serial(void) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; char str[] = "hello RT-Thread!\r\n"; 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; } /* 修改串口配置参数 */ config.baud_rate = BAUD_RATE_9600; //修改波特率为 9600 config.data_bits = DATA_BITS_8; //数据位 8 config.stop_bits = STOP_BITS_1; //停止位 1 config.bufsz = 64; //修改缓冲区 buff size 为 128 config.parity = PARITY_NONE; //无奇偶校验位 /* 控制串口设备。通过控制接口传入命令控制字,与控制参数 */ rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config); /* 初始化信号量 */ rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); /* 以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 设置接收回调函数 */ 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(thread_serial, uart device sample); ``` **[task.h]** ```c #ifndef _TASK_H_ #define _TASK_H_ /* Standard includes. */ #include
/* rtthread includes. */ #include
#include
#define SAMPLE_UART_NAME "uart1" int thread_serial(void); #endif ``` 代码很简单,创建了一个线程,在线程中使用了**中断接收以及轮询数据**,主要函数如下: ```c 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() //关闭设备 ``` ### 3.1.2实验现象 编译,下载。在finish终端输入`thread_serial`:  使用串口调试助手即可查看uart1的输出信息。  同样也可通过串口调试助手发送数据,finish终端可看到接收的数据。  关于UART应用程序的详细使用请移步RTT文档中心。 [UART 设备](https://www.rt-thread.org/document/site/programming-manual/device/uart/uart/) ## 3.2串口设备优化 熟悉RTT的都知道,RTT中的所有设备都是通过宏定义来开关设备,但是AB32VG1该部分没有完善,那么要怎么做才能和其他BSP一样可通过配置的方式来开关UART设备呢?接下来就一一讲解。 首先我们要知道AB32VG1的UART初始化调用的是`drv_uart.c中`的`rt_hw_usart_init()`函数。  这里uart_config定义了UART的基地址,同时决定了UART的大小,因此,需要将该变量的定义修改如下:  其实就增加了几条宏,同样将枚举修改如下:  另外还需要修改UART的中断函数:  接下来我们就可以通过 ```c #define BSP_USING_UART0 #define BSP_USING_UART1 ``` 控制UART设备的打开和关闭。到这里还没有完,要想实现可是话的配置还需要修改board的Kconfig文件,修改后的内容如下:  到此就修改完了,接下来就可使用刚才的配置了。这里RT-Thread Studio配置,打开RT-Thread Setting,就可进行UART的配置了。  至于UART0为了不能取消配置,是因为UART0做了调试串口,已经强制配置了。 当然,也可ENV工具配置,进入工程目录,打开**env控制台**,输入 `menuconfig` 命令后即可打开其界面。依次进入以下选项: ``` → Hardware Drivers Config → On-chip Peripheral → Enable UART ``` 使能UART1,保存退出即可。  和RT-Thread Studio添加串口设备的结果一样,最终都会在rtconfig.h中添加以下宏定义。  好了,串口设备的优化就到这里了。现在UART设备就可以打开和关闭。
------------ ### 欢迎访问我的网站 [BruceOu的哔哩哔哩](https://space.bilibili.com/338944611) [BruceOu的主页](https://www.bruceou.cn/) [BruceOu的博客](https://blog.bruceou.cn/) [BruceOu的CSDN博客](https://blog.csdn.net/bruceoxl) [BruceOu的gitee](https://gitee.com/ouxiaolong/)
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
BruceOu
这家伙很懒,什么也没写!
文章
27
回答
0
被采纳
0
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
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
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1520
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
550
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部