(实测可用)GD32F303RCT6开发板移植RT-Thread操作系统(添加串口RS485线程进行串口收发)

 一、开发板平台简介:

1、开发板资源简介

(1)开发板主芯片型号:GD32F303RCT6

(2)开发板主芯片封装:LQFP-64_10x10x05P

(3)开发板主芯片内核:ARM® Cortex®-M4

(4)开发板主芯片主频:120MHz

(5)开发板主芯片Flash大小:256KB

(6)开发板主芯片RAM大小:48KB

2、Debug调试串口简介

        串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。

(1)我们选用的GD32F303RCT6开发板串口0已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得安装CH340G驱动)。

(2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。

二、快速上手RT-Thread

1、选择合适的BSP

(1)我们这里选择GD32303E-EVAL BSP驱动进行移植。可通过如下参考链接下载bsp:

GD32303E-EVALhttps://github.com/RT-Thread/rt-thread/tree/master/bsp/gd32303e-eval

(2)下载上述bsp后就可以在开发板上进行移植尝试了。

2、移植BSP

        已下载的GD32303E-EVEL BSP工程文件,是使用 GD32F303ZET6 作为主控制器的,想要移植到我们的GD32F303RCT6开发板上,需要进行简单的修改,如下:

(1)找到gd32f303-bsp文件,并打开项目。

​​​

 (2)选择options for target-->选择GD32F303RC芯片。

​​​

(3)选择对应的下载器,我这里使用的是jlink ,并选择SWD下载模式。

​​​

(4) 设置Flash Download下载模式。

​​​

(5)那么接下来重点来了,直接下载的代码在GD32F303RCT6是无法运行的,因为GD32F303ZET6的RAM大小为64K,但是GD32F303RCT6的RAM大小为48K。此处需要在board.h头文件中把RAM大小(GD32_SRAM_SIZE)修改为48,如下所示:

​​​

 (6)修改后,重新编译下载,即可通过Debug串口看到打印的log信息。

​​​

三、添加RS485收发线程

1、新建线程并启动

在components.c文件中,找到rt_application_init(void)函数,并添加新建RS485线程的声明。

    rt_thread_t zyxc_rs485_thread;
    zyxc_rs485_thread=rt_thread_create("rs485", zyxc_rs485_thread_entry, RT_NULL,2048, 27, 20);	//创建485收发线程
    if(zyxc_rs485_thread!= RT_NULL)
    {
        rt_thread_startup(zyxc_rs485_thread);
				rt_kprintf("zyxc_rs485_thread create success!\r\n");
    }
		else
		{
				rt_kprintf("zyxc_rs485_thread create fail!\r\n");
		}

​​​

2、添加RS485驱动函数

(1)新建zyxc_rs485.c并添加所需的头文件。

#include <rtthread.h>
#include "zyxc_rs485.h"
#include <gd32f303e_eval.h>
#include "string.h"
#include <stdio.h>

(2)打开zyxc_rs485.c文件,并在其中编写485驱动函数执行语句。如下所示:

char uart1_rx_buf[512] = {0};
int uart1_rx_count = 0;
int uart1_rx_timeout = 0;
int uart1_rx_flag = 0;

/**
 * @brief uart1_init uart1初始化
 * @param
 * @return NULL
 */
void uart1_init(void)
{
    /* USART interrupt configuration */
    nvic_irq_enable(USART1_IRQn, 0, 0);
    /* configure UART1 */
    gd_eval_com_init(EVAL_COM2);
    /* enable USART RBNE interrupt */
    usart_interrupt_enable(USART1, USART_INT_RBNE);
}
/********************************************
*函数名称:void  gd_eval_en_init (void)
*函数功能:485使能脚处理
*备注:
********************************************/
void  gd_eval_en_init (void)
{
    /* enable the led clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* configure led GPIO port */
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
    GPIO_BC(GPIOA) = GPIO_PIN_1;
}
void gd_eval_en_in(void)
{
    GPIO_BC(GPIOA) = GPIO_PIN_1;
}
void gd_eval_en_out(void)
{
    GPIO_BOP(GPIOA) = GPIO_PIN_1;
}
/**
 * @brief uart_putc uart输出
 * @param send_buf 待输出的数据
 * @return 成功返回0,失败返回-1
 */
int uart_putc(char *send_buf)
{
    int i = 0;

    if(send_buf == RT_NULL)
    {
        rt_kprintf("Err, the send_buf is NULL\n");
        return -1;
    }

    for(i=0; i< strlen(send_buf); i++)
    {
        gd_eval_en_out();
        usart_data_transmit(EVAL_COM2, send_buf[i]);
        while(RESET == usart_flag_get(EVAL_COM2, USART_FLAG_TC));
    }

    return 0;
}

(3)新建zyxc_rs485.h头文件并声明调用函数。

#ifndef __ZYXC_RS485_H
#define __ZYXC_RS485_H

extern char uart1_rx_buf[512] ;
extern int uart1_rx_count ;
extern int uart1_rx_timeout ;
extern int uart1_rx_flag ;
void uart1_init(void);
void  gd_eval_en_init (void);
void gd_eval_en_in(void);
void gd_eval_en_out(void);
int uart_putc(char *send_buf);
void USART1_IRQHandler(void);
void zyxc_rs485_thread_entry(void *parameter);
#endif

(4)在components.c文件中包含头文件#include "zyxc_rs485.h"。

3、添加rs485线程执行语句

(1)打开zyxc_rs485.c文件,并在其中添加线程执行语句。

/********************************************
*函数名称:void zyxc_rs485_thread_entry(void *parameter)
*函数功能:485线程
*备注:处理485的收发
********************************************/
void zyxc_rs485_thread_entry(void *parameter)
{

    int res;
    char send_buf[1024] = {0};
    char log_buf[40] = "hello,please input the data...\r\n";
    uart1_init();
    gd_eval_en_init();
    rt_thread_delay(100);
    uart_putc(log_buf);
    //软件定时器
    while(1)
    {
				rt_thread_delay(1);
				if((strlen(uart1_rx_buf) != 0) && (uart1_rx_flag == 2))								//如果接收不为空且接收完成
        {		
            memset(send_buf, 0, sizeof(send_buf));
            sprintf(send_buf, "recv data is %s, return data %s \r\n", uart1_rx_buf, uart1_rx_buf);
            res = uart_putc(send_buf);																				//开始打印接收数据
            if(res == -1)
            {
                rt_kprintf("Err, uart_putc is error\r\n");
                continue;
            }
						uart1_rx_flag = 0;																								//打印完成后接收标志置为0
            memset(uart1_rx_buf, 0, sizeof(uart1_rx_buf));			

        }
        gd_eval_en_in();																											//发送完成后RS485置位为接收状态
        

    }

}

备注:485芯片在收发过程中需要进行EN使能脚的切换,等待接收状态时,使能脚置位为0,发送数据时,使能脚置位为1。

四、配置KEIL软件下载选项

(1)点击“options for target”——Debug——Jlink/J-TRACE cortex(小编这里用到下载器是

GD32 Jlink OB下载器)——settings——选择SW看到右侧有Device Name即下载器找到了对应的GD32F303RCT6芯片。

​​

 (2)选择Flash Download下载模式,这里端子了擦除整片芯片,以及下载程序后自动复位(Reset and run)。

​​

 (3)下载完成后,打开串口助手,通过发送区进行发送后,即可看到485收发数据。

备注:485串口为串口1、系统自带debug串口为串口0,接线时请注意区分。

如下所示:

 

(4) 备注:看到GD32F303RCT6开发板上LED1、LED2、LED3、LED4每隔1S闪烁一次,此功能为额外添加的idle空闲功能,用于提示开发板系统正常工作。

​​

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式ZYXC

谢爷的赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值