GD32VW553-IOT开发板利用新建的项目调通uart和灯闪烁

分享作者:wx17546329936248
评测品牌:萤火工场
评测型号:GD32VW553-IOT
发布时间:2025-08-28 13:04:13
1
概要
直接在IDE上新建工程稍微修改就可以使用了
开源口碑分享内容

1.前言

此实验将在搭建好环境的基础下,直接利用IDE新建的C项目稍微修改就可以实现UART通讯和定时器中断实现灯闪烁

因为新建好的demo用的uart组是usart0,对应的PB15,TX不方便我们调试,因为我的烧录用的PA6 PA7,烧录完后还要把线拨来拨去不方便,所以此项目会教你怎么修改uart组和映射的IO口

搭建环境的就不讲了,可以看我的上一篇文章

2.实验开始

gd32vw553h_eval.h

打开gd32vw553h_eval.h,将这几个宏内容进行替换,可以看下图PA6对应的UART2,AF10的复用功能,接下来在代码进行修改,RX没用到就暂时不管了,要用的话也是一样道理修改就行

#define COMn                             1U
#define EVAL_COM0                        UART2
#define EVAL_COM0_CLK                    RCU_UART2

#define EVAL_COM0_TX_PIN                 GPIO_PIN_6
// #define EVAL_COM0_RX_PIN                 GPIO_PIN_8

#define EVAL_COM0_TX_GPIO_PORT           GPIOA
#define EVAL_COM0_TX_GPIO_CLK            RCU_GPIOA
#define EVAL_COM0_TX_AF                  GPIO_AF_10

// #define EVAL_COM0_RX_GPIO_PORT           GPIOA
// #define EVAL_COM0_RX_GPIO_CLK            RCU_GPIOA
// #define EVAL_COM0_RX_AF                  GPIO_AF_2

#define LED1_PIN                         GPIO_PIN_3
#define LED1_GPIO_PORT                   GPIOA
#define LED1_GPIO_CLK                    RCU_GPIOA

#define LED2_PIN                         GPIO_PIN_4
#define LED2_GPIO_PORT                   GPIOA
#define LED2_GPIO_CLK                    RCU_GPIOA

#define LED3_PIN                         GPIO_PIN_5
#define LED3_GPIO_PORT                   GPIOA
#define LED3_GPIO_CLK                    RCU_GPIOA

LED灯可以改成自己想用的脚,我用的是PA3 PA4 PA5

main函数

我将里面一些功能进行删减和修改了,最终实验现象就是上电打印固件库的版本号和各个总线的速度,还有LED灯在不停的闪烁

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

/*!
    \brief      toggle the led every 500ms
    \param[in]  none
    \param[out] none
    \retval     none
*/
void led_spark(void)
{
    static __IO uint32_t timingdelaylocal = 0U;

    if(timingdelaylocal) {

        if(timingdelaylocal < 500U) {
            gd_eval_led_on(LED1);
            gd_eval_led_on(LED2);
            gd_eval_led_on(LED3);
        } else {
            gd_eval_led_off(LED1);
            gd_eval_led_off(LED2);
            gd_eval_led_off(LED3);
        }

        timingdelaylocal--;
    } else {
        timingdelaylocal = 1000U;
    }
}

int main(void)
{
#ifdef __FIRMWARE_VERSION_DEFINE
    // 定义固件版本号变量
    uint32_t fw_ver = 0;
#endif /* __FIRMWARE_VERSION_DEFINE */

    /* 配置系统滴答定时器 */
    /* configure systick */
    systick_config();
    /* 设置ECLIC优先级组为LEVEL3_PRIO1 */
    eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);

    /* 初始化LED、USART和按键 */
    /* initilize the LEDs, USART and key */
    gd_eval_led_init(LED1);
    gd_eval_led_init(LED2);
    gd_eval_led_init(LED3);
    gd_eval_com_init(EVAL_COM0);

#ifdef __FIRMWARE_VERSION_DEFINE
    // 获取固件版本号
    fw_ver = gd32vw55x_firmware_version_get();
    /* 打印固件版本 */
    /* print firmware version */
    printf("GD32VW55X series firmware version: V%d.%d.%d\n", (uint8_t)(fw_ver >> 24), (uint8_t)(fw_ver >> 16), (uint8_t)(fw_ver >> 8));
#endif /* __FIRMWARE_VERSION_DEFINE */

    /* 打印系统、AHB、APB1和APB2的时钟频率 */
    /* print out the clock frequency of system, AHB, APB1 and APB2 */
    printf("CK_SYS is %d\n", rcu_clock_freq_get(CK_SYS));
    printf("CK_AHB is %d\n", rcu_clock_freq_get(CK_AHB));
    printf("CK_APB1 is %d\n", rcu_clock_freq_get(CK_APB1));
    printf("CK_APB2 is %d\n", rcu_clock_freq_get(CK_APB2));

    while(1) {
        ;
    }
}

gd32vw55x_it.c

这是定时器中断的处理handle

#include "gd32vw55x_it.h"
#include "main.h"
#include "systick.h"

/*!
    \brief      core private timer handle function
    \param[in]  none
    \param[out] none
    \retval     none
*/
void eclic_mtip_handler(void)
{
    // 清除CLIC_INT_TMR的中断挂起标志
    ECLIC_ClearPendingIRQ(CLIC_INT_TMR);
    // 点亮LED灯
    led_spark();
    // 延迟递减 这个没用到
    delay_decrement();
}

gd32vw553h_eval.c

我只对gd_eval_com_init函数进行了修改


void gd_eval_com_init(uint32_t com)
{
    /* 使能GPIO时钟 */
    uint32_t COM_ID = 0U;
    if(EVAL_COM0 == com)
    {
        COM_ID = 0U;
    }

    /* 使能GPIO时钟 */
    rcu_periph_clock_enable(EVAL_COM0_TX_GPIO_CLK);
    // rcu_periph_clock_enable(EVAL_COM0_RX_GPIO_CLK);

    /* 使能USART时钟 */
    rcu_periph_clock_enable(COM_CLK[COM_ID]);

    /* 将端口连接到USARTx_Tx */
    gpio_af_set(EVAL_COM0_TX_GPIO_PORT, EVAL_COM0_TX_AF, COM_TX_PIN[COM_ID]);

    /* 将端口连接到USARTx_Rx */
    // gpio_af_set(EVAL_COM0_RX_GPIO_PORT, EVAL_COM0_RX_AF, COM_RX_PIN[COM_ID]);

    /* 配置USART Tx为复用推挽输出 */
    gpio_mode_set(EVAL_COM0_TX_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_TX_PIN[COM_ID]);
    gpio_output_options_set(EVAL_COM0_TX_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, COM_TX_PIN[COM_ID]);

    /* 配置USART Rx为复用推挽输出 */
    // gpio_mode_set(EVAL_COM0_RX_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, COM_RX_PIN[COM_ID]);
    // gpio_output_options_set(EVAL_COM0_RX_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, COM_RX_PIN[COM_ID]);

    /* USART配置 */
    usart_deinit(com);
    usart_baudrate_set(com, 115200U);
    // usart_receive_config(com, USART_RECEIVE_ENABLE);
    usart_transmit_config(com, USART_TRANSMIT_ENABLE);
    usart_enable(com);
}

3.实验结果

烧录完成后不需要拔线,烧录完成后还是这个端口直接复位就可以看到实验现象了,打印跟灯闪都有,完成!!!!!1

全部评论
暂无评论
0/144