GD32VW553-IoT开发板调试——串口打印功能
分享作者:Qex_
作者昵称:CATH2
评测品牌:萤火工场
评测型号:GD32VW553-IOT
发布时间:2025-08-19 15:49:58
2 2
前言
开源口碑分享内容
今天收到了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