GD32VW553-IoT开发板调试——串口打印功能
分享作者:Qex_
作者昵称:CATH2
评测品牌:萤火工场
评测型号:GD32VW553-IOT
发布时间:2025-08-19 15:49:58
2
前言
本文将说明GD32VW553-IoT开发板的程序下载方式以及开发方式
开源口碑分享内容

今天收到了iCEasy送来的GD32VW553-IoT的开发板评测,实物如下图所示


这款开发板采用的是RISC-V架构,未来的主流了;具有320K的RAM和4M的Flash,同时这块开发板上还预留了一片Flash的接口,如果能带个串口芯片,下载程序还是会更加方便的

排针布局如下,放在这里方便自己查阅了:


串口接入PA6和PA7,这两个就是用于下载程序的引脚,注意,该款单片机貌似并不支持SWD下载,并且IDE与GD常规的MCU也不同;不过提前简单看了一下,函数的API还是基本和其他GD系列的MCU一样的,这一点就非常Nice,移植起来非常方便;


下载GD官方的IDE,GD32EmbeddedBuilder,和AT、ST等众多的MCU厂家的IDE一样,都是新建一个Cproject,

如图,选择RISC-V工具链;

工程创建完编译一下

使用了一下隔壁立创家的串口收发程序,新建一个工程,然后把main.c替换成一下内容就ok了;

这个程序中串口管脚更换到了PA8和PB15,注意一下,和烧录程序的串口不太一样的

#include "gd32vw55x.h"
#include "systick.h"

#ifndef BSP_USART_H
#define BSP_USART_H

#include "gd32vw55x.h"

//时钟定义
#define BSP_USART_RCU                          RCU_USART0
#define BSP_USART_TX_RCU                  RCU_GPIOB
#define BSP_USART_RX_RCU                  RCU_GPIOA

//串口发送引脚定义
#define BSP_USART_TX_PORT               GPIOB
#define BSP_USART_TX_PIN                    GPIO_PIN_15
#define BSP_USART_TX_AF                     GPIO_AF_8
//串口接收引脚定义
#define BSP_USART_RX_PORT               GPIOA
#define BSP_USART_RX_PIN                    GPIO_PIN_8
#define BSP_USART_RX_AF                     GPIO_AF_2

//串口定义
#define BSP_USART 									 USART0
#define    BSP_USART_IRQ    					 USART0_IRQn
#define BSP_USART_IRQHandler  			 USART0_IRQHandler

/* 串口缓冲区的数据长度 */
#define USART_RECEIVE_LENGTH	 255


extern uint8_t  g_recv_buff[USART_RECEIVE_LENGTH]; // 接收缓冲区
extern uint16_t g_recv_length; 											// 接收数据长度
extern uint8_t  g_recv_complete_flag;							 	// 接收完成标志位

/* 串口0初始化配置 */
void Uart0InitConfig(uint32_t dwbaud_rate);
/* 串口0发送单个字符 */
void UsartSendByte(uint8_t ucch);
/* 串口0发送字符串 */
void UsartSendString(uint8_t *ucstr);

#endif

#include "stdio.h"
uint8_t  g_recv_buff[USART_RECEIVE_LENGTH]={0}; // 接收缓冲区
uint16_t g_recv_length = 0; 											// 接收数据长度
uint8_t  g_recv_complete_flag = 0;							 	// 接收完成标志位

/**
 * 	串口0初始化配置
 * @param dwbaud_rate 	波特率设置
 */
void Uart0InitConfig(uint32_t dwbaud_rate)
{
	rcu_periph_clock_enable(BSP_USART_RCU); // 开启串口时钟
	rcu_periph_clock_enable(BSP_USART_TX_RCU); // 开启端口时钟
	rcu_periph_clock_enable(BSP_USART_RX_RCU); // 开启端口时钟

	/* 配置复用功能 */
	gpio_af_set(BSP_USART_TX_PORT,BSP_USART_TX_AF,BSP_USART_TX_PIN);
	gpio_af_set(BSP_USART_RX_PORT,BSP_USART_RX_AF,BSP_USART_RX_PIN);

	/* 配置TX为复用模式 上拉模式 */
	gpio_mode_set(BSP_USART_TX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_TX_PIN);
	/* 配置RX为复用模式 上拉模式 */
	gpio_mode_set(BSP_USART_RX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, BSP_USART_RX_PIN);
	/* 配置TX为推挽输出 50MHZ */
	gpio_output_options_set(BSP_USART_TX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, BSP_USART_TX_PIN);
	/* 配置RX为推挽输出 50MHZ */
	gpio_output_options_set(BSP_USART_RX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, BSP_USART_RX_PIN);

	/* 串口参数配置 */
	usart_deinit(BSP_USART);                            // 复位串口
	usart_baudrate_set(BSP_USART,dwbaud_rate);          // 设置波特率
	usart_parity_config(BSP_USART,USART_PM_NONE);       // 没有校验位
	usart_word_length_set(BSP_USART,USART_WL_8BIT);     // 8位数据位
	usart_stop_bit_set(BSP_USART,USART_STB_1BIT);       // 1位停止位

	/* 使能串口接收 */
	usart_receive_config(BSP_USART, USART_RECEIVE_ENABLE);
	/* 使能串口发送 */
	usart_transmit_config(BSP_USART, USART_TRANSMIT_ENABLE);

	/* 使能读数据缓冲区非空中断和过载错误中断 */
	usart_interrupt_enable(BSP_USART, USART_INT_RBNE);

	/* 配置中断优先级 */
	eclic_irq_enable(BSP_USART_IRQ, 2, 2);
	/* 使能串口 */
	usart_enable(BSP_USART);
}

/**
 *	发送单个字符
 * @param ucch		发送的单个字节字符
 */
void UsartSendByte(uint8_t ucch)
{
    usart_data_transmit(BSP_USART, (uint8_t)ucch);
    while(RESET == usart_flag_get(BSP_USART, USART_FLAG_TBE)); // 等待发送数据缓冲区标志置位
}

/**
 * 	发送字符串
 * @param ucstr		发送的字符串
 */
void UsartSendString(uint8_t *ucstr)
{
      while(ucstr && *ucstr)  // 地址为空或者值为空跳出
      {
    	  UsartSendByte(*ucstr++);
      }
}

/*!
    \brief     这个函数处理USART RBNE中断请求和空闲中断请求
    \param[in]  none
    \param[out] none
    \retval     none
*/
void BSP_USART_IRQHandler(void)
{
    // 接收缓冲区不为空
    if(usart_interrupt_flag_get(BSP_USART,USART_INT_FLAG_RBNE) != RESET)
    {
        /* 清除接收中断标志位 */
        usart_interrupt_flag_clear(BSP_USART, USART_INT_FLAG_RBNE);
        /* 把接收到的数据放到缓冲区中 */
        g_recv_buff[g_recv_length] = usart_data_receive(BSP_USART);
        /* 限制接收长度防止数据溢出 */
        g_recv_length=( g_recv_length + 1 ) % USART_RECEIVE_LENGTH;

        //判断空闲中断是否开启,如果没有开启 ( USART_CTL0 的 第4位是否为0,为0说明当前没有开启空闲中断 )
        if(  (USART_CTL0(BSP_USART) & (1<<4) ) == 0  )
        {
            /* 使能IDLE线检测中断 */
            usart_interrupt_enable(BSP_USART, USART_INT_IDLE);
            /* 清除空闲中断标志位 */
            usart_interrupt_flag_clear(BSP_USART, USART_INT_FLAG_IDLE);
        }
    }

     // 检测到空闲中断
    if(usart_interrupt_flag_get(BSP_USART,USART_INT_FLAG_IDLE) != RESET)
    {
        /* 清除空闲中断标志位 */
        usart_interrupt_flag_clear(BSP_USART, USART_INT_FLAG_IDLE);
        /* 数据结尾加上字符串结束符 */
        g_recv_buff[g_recv_length] = '\0';
        /* 接收完成标志位 */
        g_recv_complete_flag = 1;
        /* 关闭空闲中断 */
        usart_interrupt_disable(BSP_USART, USART_INT_IDLE);
    }
}


int main(void)
{

    /* 使能全局中断 */
	eclic_global_interrupt_enable();
	/* 中断分组 */
	eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2);

	// 滴答当定时器初始化
    systick_config();

    // 串口0初始化波特率位115200
    Uart0InitConfig(115200U);

    UsartSendString("UsartSendString test\r\n");
    printf("printf test. float:%f  int:%d\r\n", 12.512, 10);

    while(1)
    {
    		//等待数据传输完成
    	   if(g_recv_complete_flag==1)  //如果数据接收完成
    	   {
				g_recv_complete_flag = 0; // 等待下次接收
				printf("g_recv_length:%d ",g_recv_length);
				printf("Interrupt recv:%s\r\n",g_recv_buff);  // 打印接收的数据
				memset(g_recv_buff,0,g_recv_length);  // 清空数组
				g_recv_length = 0;//清空长度
    	   }
    }
}



接下来进入烧录模式,先拔电,这边需要操作跳线帽了;

如图所示,短接Boot0引脚到另一侧,然后Boot1引脚不动,这时候插上电,短接绿色圈起来的两个引脚,然后按下开发板上的Reset按键,就能进入下载模式;

然后打开GD官方的烧录工具GD32AllInOneProgrammer,使用TTL工具连接串口引脚,如下图所示;


先连接串口,然后选择下载的固件,随后点击Download就可以完成固件下载;


现在恢复跳线帽,重新上电,可以看到串口有打印信息;查看程序,里边使能了一个串口接收和空闲中断,用于打印接收到的信息和计算接收到的长度:


全部评论
暂无评论
0/144