2. LED闪烁

任务目标

本案例基于GD32V开发板,通过软件延时函数控制LED灯以固定周期交替点亮与熄灭,实现肉眼可见的闪烁效果。核心目的是掌握延时控制的基本写法与循环结构的应用。

硬件与依赖

  • GD32V开发板(板载LED连接到PC13引脚,低电平点亮)
  • RISC-V GCC工具链(如Nuclei Studio或riscv64-unknown-elf-gcc)
  • GD32VF103标准固件库(需包含gd32vf103.h、gd32vf103_gpio.h、gd32vf103_rcu.h)

完整代码

#include "gd32vf103.h"
#include "gd32vf103_gpio.h"
#include "gd32vf103_rcu.h"

/* 软件延时函数:空循环等待,约延时1ms(系统主频108MHz) */
void delay_1ms(uint32_t count)
{
    volatile uint32_t i;
    while(count--) {
        for(i = 0; i < 10800; i++);  /* 108MHz下约1ms */
    }
}

int main(void)
{
    /* 使能GPIOC时钟 */
    rcu_periph_clock_enable(RCU_GPIOC);
    
    /* 配置PC13为推挽输出,最大速度50MHz */
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
    
    while(1) {
        gpio_bit_reset(GPIOC, GPIO_PIN_13);  /* 输出低电平,LED点亮 */
        delay_1ms(500);                       /* 延时500ms */
        gpio_bit_set(GPIOC, GPIO_PIN_13);     /* 输出高电平,LED熄灭 */
        delay_1ms(500);                       /* 延时500ms */
    }
}

编译与烧录

  1. 将上述代码保存为main.c,并确保固件库头文件路径已包含在编译选项中。
  2. 编译命令示例(Nuclei Studio环境下可直接点击Build):
    riscv64-unknown-elf-gcc -march=rv32imac -mabi=ilp32 -O2 -o led_blink.elf main.c -T gd32vf103_flash.ld
  3. 使用调试器(如GD-Link)将生成的led_blink.elf烧录至开发板。

验证方法

烧录成功后,观察板载LED是否以约1Hz的频率(每500ms翻转一次)持续闪烁。若LED常亮或常灭,检查PC13引脚连接方向及GPIO初始化是否正确;若闪烁频率明显异常,调整delay_1ms中的循环次数以匹配实际系统主频。

预期输出

LED以亮500ms、灭500ms的周期循环闪烁,周期约为1秒。该结果由代码逻辑直接决定,不依赖外部输入。