一、开发板平台简介:
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_Hextern 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; //打印完成后接收标志置为0memset(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空闲功能,用于提示开发板系统正常工作。