萤火工场 GD32VW553-IOT GD32W553开发板的介绍与评测

分享作者:floating
评测品牌:萤火工场
评测型号:GD32VW553-IOT
发布时间:2025-02-26 10:45:46
0
概要
GD32W553开发板的介绍与评测
开源口碑分享内容

一、       开源软件及资料

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不方便)

全部评论
暂无评论
0/144