一、 开源软件及资料
https://www.gd32mcu.com/cn/download/7?kw=GD32VW5 这是GD官网下的开源资源及软件的链接,我们可以通过这里下载我们所需要的全套资料。
这里拥有全套的资料可以辅助我们开发,我们先来简单了解一下这款开发板。
通过上述资料,我们可以快速得到下面的信息:
- POWER IN:通过USB接口提供5V电源输入。
- KEY:按键,用于启动或复位等操作。
- FLASH N/C:未使用的闪存区域。
- GD32W553:核心芯片,其中GD32W553是微控制器单元(MCU),负责处理和控制任务。
- 40MHz晶振:为系统提供时钟源,确保定时器和其他时间敏感组件的正常工作。
- RESET按钮:用于手动复位系统。
- GPIO引脚:分布在板子边缘,方便用户连接外部设备或传感器。
- PCB ant:表示板载天线的位置,用于无线通信。
二、 编写样例程序
这里选择使用SEGGER Embedded Studio 8.22a作为我的开发平台。完成软件的安装后经行支持包的安装。在Tool中选择Package Manager选择GD32VW553 CPU的支持包并完成支持包的安装。
选择File点击New Project选择Create the project in a new solution(在新的解决方案中创建项目)

选择对应的设备,确定项目名称后一直next。完成项目的构建
初始界面为下图。
然后就可以快乐的写代码了。按照传统,拿到开发板就要会点灯,所以我们开始点灯。参考了官方的代码很快就能完成一个简单的点灯操作。这里我使用官方的延时代码及我参考官方后写的·一个ms定时器完成两个LED的交替闪烁。(官方提供的案例还有很多,这里就先用了最简单的两个Timer和GPIO)
#include <gd32vw55x.h>
#include "systick.h"
#include <stdio.h>
#include <stdlib.h>
#include "gd32vw55x_eclic.h"
void eclic_config(void)
{
eclic_global_interrupt_enable();
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
eclic_irq_enable(TIMER1_IRQn, 1, 0);
}
void Timer(void)
{
timer_parameter_struct initpara;
timer_ic_parameter_struct timer_icinitpara;
rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL2); //160MHZ 当APB1PSC或APB2PSC字段设置为0b0xx、0b100或0b101时,表示APB时钟是AHB时钟的一个直接分频值(分别是不分频、二分频或四分频),此时定时器时钟直接使用AHB时钟频率。
//如果APB1PSC或APB2PSC字段设置为其他值,则定时器时钟会是相应APB时钟的四倍。例如,如果APB1时钟被设置为某个频率,那么APB1域中的定时器时钟将会是该频率的四倍
rcu_periph_clock_enable(RCU_TIMER1); //使能TIMER1定时器
timer_deinit(TIMER1); //复位外设TIMERx
// 设置定时器参数
/* initialize TIMER init parameter struct */
timer_struct_para_init(&initpara);
initpara.alignedmode = TIMER_COUNTER_EDGE; // 边缘对齐模式
initpara.clockdivision = TIMER_CKDIV_DIV1; // 时钟分频
initpara.counterdirection = TIMER_COUNTER_UP; // 向上计数
initpara.period = 1000 - 1; // 计数周期,1ms的周期对应1000次计数
initpara.prescaler = 160 - 1; // 预分频值,系统时钟160MHz -> 定时器时钟1MHz
initpara.repetitioncounter = 0; // 重复计数器为0,默认值
// 初始化定时器1
timer_init(TIMER1, &initpara);
/* enable the TIMER interrupt */
timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
timer_interrupt_enable(TIMER1, TIMER_INT_UP);
timer_enable(TIMER1);
}
void TIMER1_IRQHandler(void)
{
// 中断处理逻辑
if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP))
{
// 清除中断标志
timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
static unsigned int i=0;
i++;
if(i==500)
{
// 你的处理代码
i=0;
gpio_bit_toggle(GPIOA,GPIO_PIN_7);
}
}
}
void GPIO(void)
{
rcu_periph_clock_enable(RCU_GPIOA);//使能GPIO时钟
gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_7);
gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_MAX,GPIO_PIN_7);
gpio_bit_set(GPIOA,GPIO_PIN_7);
gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_6);
gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_MAX,GPIO_PIN_6);
gpio_bit_reset(GPIOA,GPIO_PIN_6);
rcu_periph_clock_enable(RCU_GPIOB);//使能GPIO时钟
gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_1);
gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_MAX,GPIO_PIN_1);
gpio_bit_set(GPIOB,GPIO_PIN_1);
}
/*********************************************************************
*
* main()
*
* Function description
* Application entry point.
*/
int main(void) {
systick_config();
eclic_config();
Timer();
GPIO();
while(1)
{
delay_1ms(500);
gpio_bit_toggle(GPIOA,GPIO_PIN_6);
// gpio_bit_toggle(GPIOA,GPIO_PIN_7);
}
}
#include "gd32vw55x.h"
#include "systick.h"
volatile static uint32_t delay;
/*!
\brief configure systick
\param[in] none
\param[out] none
\retval none
*/
void systick_config(void)
{
SysTimer_SetControlValue(SysTimer_MTIMECTL_CMPCLREN_Msk);
SysTimer_SetCompareValue(SystemCoreClock / 4000);
__ECLIC_SetTrigIRQ(CLIC_INT_TMR, ECLIC_POSTIVE_EDGE_TRIGGER);
eclic_irq_enable(CLIC_INT_TMR, 0, 0);
}
/*!
\brief delay a time in milliseconds
\param[in] count: count in milliseconds
\param[out] none
\retval none
*/
void delay_1ms(uint32_t count)
{
delay = count;
while(0U != delay) {
}
}
/*!
\brief delay decrement
\param[in] none
\param[out] none
\retval none
*/
void delay_decrement(void)
{
if(0U != delay) {
delay--;
}
}
void eclic_mtip_handler(void)
{
ECLIC_ClearPendingIRQ(CLIC_INT_TMR);
delay_decrement();
}一、 烧录及现象


两个LED交替闪烁,一个在while(1)函数中delay延时闪烁,一个在500ms定时器中闪烁。
二、 总结及感想
通过GPIO引脚配置、延时函数的实现等。我参考了官方提供的代码示例,学会了如何利用定时器中断来实现精确的时间控制。最终实现了两个LED交替闪烁的效果。虽然这只是最基本的东西。后面还有很多复杂的代码没有看懂,但是不积跬步无以至千里。加油!(虽然但是这个开发板也设计的有点不合理,焊盘距离太小,引脚不引出只留焊盘,导致使用JLINK不方便)

