编写RT-Thread环境下GD32F103的UART2程序源码
一、RT-Thread是一个实时操作系统,支持多种微控制器,包括GD32F103。以下是在RT-Thread环境下编写GD32F103的UART2程序源码的方法和示例代码。
1.硬件配置 :查芯片手册第40页有定义。
确保GD32F103RCT6的UART2引脚已正确连接:
◦ UART2_TX: PB10 (默认)
◦ UART2_RX: PB11 (默认)
二、查看BSP中drivers文件夹下drv_usart.c程序源码。
1.源码中相关定义与实际芯片引脚完全对应。
三、编写UART2程序代码。
UART和其他设备一样,应用程序通过统一的设备管理接口来访问串口硬件,相关接口如下所示:
函数 描述
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() 关闭设备
程序源码
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2025-08-22 10545 the first version
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define BSP_USING_UART2 //第一步打开BSP工程 添加 UART2 使能宏
#define SEND_INTERVAL 1000 /* 发送间隔,单位:毫秒 */
#define SAMPLE_UART2_NAME "uart2" /* 需要操作的设备 */
/* 线程控制块 */
static rt_thread_t send_thread = RT_NULL;
static rt_device_t serial2; /* 设备句柄 */
static char str[] = "hello RT-Thread2!\r\n"; /* 需要发送的数据 */
static rt_uint8_t send_data = 0x00; /* 测试发送次数 */
rt_size_t send_len = 0; /* 发送数据长度 */
/* 发送线程函数 */
static void uart2_send_thread(void *parameter)
{
while (1)
{
/* 发送字符串 */
send_len = rt_device_write(serial2, 0, str, (sizeof(str) - 1));
/* 数据自增,循环发送 */
send_data++;
/* 延时1秒 */
rt_thread_mdelay(SEND_INTERVAL);
}
}
static int uart2_sample(void)
{
rt_err_t ret2 = RT_EOK;
/* 查找系统中的串口设备 */
serial2 = rt_device_find(SAMPLE_UART2_NAME);
if (!serial2)
{
rt_kprintf("find %s failed!\n", SAMPLE_UART2_NAME);
return -RT_ERROR;
}
/* 配置UART参数 */
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 默认配置 */
config.baud_rate = BAUD_RATE_9600; /* 波特率 */
config.data_bits = DATA_BITS_8; /* 数据位 */
config.stop_bits = STOP_BITS_1; /* 停止位 */
config.parity = PARITY_NONE; /* 校验位 */
/* 控制UART设备 */
rt_device_control(serial2, RT_DEVICE_CTRL_CONFIG, &config);
/* 以中断接收及轮询发送模式打开串口设备 */
ret2 = rt_device_open(serial2, RT_DEVICE_FLAG_INT_RX);
if (ret2 != RT_EOK)
{
rt_kprintf("open device2 failed\r\n");
return -RT_ERROR;
}
/* 发送字符串 */
send_len = rt_device_write(serial2, 0, str, (sizeof(str) - 1));
if (send_len != sizeof(str) - 1)
{
rt_kprintf("send data failed\r\n");
return -RT_ERROR;
}
/* 关闭设备
ret2 = rt_device_close(serial2);
if (ret2 != RT_EOK)
{
rt_kprintf("close device2 failed\r\n");
return -RT_ERROR;
}*/
rt_kprintf("serial device2 test successful\r\n");
/* 创建发送线程 */
send_thread = rt_thread_create("uart_send",
uart2_send_thread,
RT_NULL,
512,
10,
10);
/* 启动线程 */
if (send_thread != RT_NULL)
{
rt_thread_startup(send_thread);
}
else
{
return -RT_ERROR;
}
return RT_EOK;
}
/* 导出到自动初始化 */
INIT_APP_EXPORT(uart2_sample);
四、仿真测试。
————————————————
版权声明:本文为CSDN博主「兴园电子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36598085/article/details/150926567
|
|