[GD32VW553-IOT_V2]26年开箱即用教程+串口通信按键rgb灯实验demo

分享作者:wx17819845865695
评测品牌:萤火工场
评测型号:GD32VW553-IOT-V2
发布时间:2026-07-06 10:27:25
1
概要
任务一:部署开箱即用教程 任务二:利用串口与pico进行通信,按下按键切换RGB灯的状态
开源口碑分享内容

1.由于在资料下载页面的软件过于老旧,所以无法在gd32build里面直接创建risk的的项目工程,所以我们选择去兆易创新官网下载最新的软件包

兆易创新中文下载页:https://www.gd32mcu.com/cn/download

下载箭头所指的三个压缩包


解压并安装ide,在ide左上角点击File->New->Projiect,选择芯片型号:GD32vw553HMQ7

2.利用串口与pico进行通信,按下按键切换RGB灯的状态

对于新接触到的新框架,新库文件,我们可以通过查看其api(.h文件)快速实现编程,如:

对模板文件进行轻微修改

#include "gd32vw553h_eval.h"
#include "systick.h"
#include "uart.h"


void  gd_eval_led_init ()
{
    rcu_periph_clock_enable(LED1_GPIO_CLK);
    gpio_mode_set(LED1_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,LED1_PIN);
    gpio_output_options_set(LED1_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ,LED1_PIN);
    GPIO_BC(LED1_GPIO_PORT) =LED1_PIN;
}

void gd_eval_led_on()
{
    GPIO_BOP(LED1_GPIO_PORT) = LED1_PIN;
}

void gd_eval_led_off()
{
    GPIO_BC(LED1_GPIO_PORT) = LED1_PIN;
}

void gd_eval_led_toggle()
{
    GPIO_TG(LED1_GPIO_PORT) = LED1_PIN;
}

void  key_gpio_init ()
{
	rcu_periph_clock_enable(KEY1_GPIO_CLK);
	gpio_mode_set(KEY1_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE,KEY1_PIN);
}



uint32_t  key_gpio_debouncing ()
{
	if(gpio_input_bit_get(KEY1_GPIO_PORT, KEY1_PIN)!=SET)
	{
		delay_1ms(1);
		if(gpio_input_bit_get(KEY1_GPIO_PORT, KEY1_PIN) == RESET)
		    {
		            // 阻塞等待按键松开
		            while(gpio_input_bit_get(KEY1_GPIO_PORT, KEY1_PIN) == RESET);
		            delay_1ms(1); // 松手消抖
		            return 1; // 只有完整按下+松开才返回1
		    }
	}
	return 0;
}

void key_logic()
{
	if(key_gpio_debouncing ()==1)
	{
		gd_eval_led_toggle();
		RGB_Change();
	}
}


对main函数稍微修改

#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32vw553h_eval.h"
#include "uart.h"


int main(void)
{

    systick_config();
    gd_eval_led_init();
    uart1_init();
    
    gd_eval_led_on();
    while(1) {
    	key_logic();
    }
}

创建uart.c文件


#include "gd32vw55x.h"
#include "systick.h"
#include "uart.h"
#include "string.h"

void uart1_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_UART1);

   
    usart_deinit(UART1);
    usart_disable(UART1);

    // TX PA4 复用推挽输出,无上下拉
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, UART1_TX_PIN);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, UART1_TX_PIN);
    // RX PA5 复用带上拉输入
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, UART1_RX_PIN);

    
    gpio_af_set(GPIOA, GPIO_AF_0, UART1_TX_PIN);
    gpio_af_set(GPIOA, GPIO_AF_0, UART1_RX_PIN);

    usart_baudrate_set(UART1, UART1_BAUDRATE);
    usart_word_length_set(UART1, UART1_WORD_LENGTH);
    usart_stop_bit_set(UART1, UART1_STOP_BITS);
    usart_parity_config(UART1, UART1_PARITY_MODE);

    usart_transmit_config(UART1, USART_TRANSMIT_ENABLE);
    usart_receive_config(UART1, USART_RECEIVE_ENABLE);
    usart_enable(UART1);
}

void uart1_send(uint8_t *data, uint32_t len)
{
    for(uint32_t i = 0; i < len; i++)
    {      
        while(RESET == usart_flag_get(UART1, USART_FLAG_TBE));
        usart_data_transmit(UART1, data[i]);   
        while(RESET == usart_flag_get(UART1, USART_FLAG_TC));
        delay_1ms(1);
    }
}

void uart1_test(void)
{
    uint8_t buf[] = "ABCDEF";
    uart1_send(buf, sizeof(buf)-1);
}

static const uint8_t* rgb[]=
{
	"RGB0",
	"RGB1",
	"RGB2",
	"RGB3",
	"RGB4",
	"RGB5",
	"RGB6",
};

static UART_RGB rgb_num=PRESET0;

void RGB_Change(void)
{
	uint32_t rgb_len=strlen((const char*)rgb[rgb_num]);
	uart1_send((uint8_t*)rgb[rgb_num],rgb_len);
	rgb_num++;
	if(rgb_num==PRESET6+1)rgb_num=PRESET0;
}



至此,完成gd32端代码的窜写,boot1上拉进入下载模式,下载完成后将boot1位置复原

接下看看最终效果:

当按键按下,void RGB_Change(void)函数更新串口值。

全部评论
暂无评论
0/144