2. GPIO按键输入与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 */
}
}
编译与烧录
- 将上述代码保存为
main.c,并确保固件库头文件路径已包含在编译选项中。 - 编译命令示例(Nuclei Studio环境下可直接点击Build):
riscv64-unknown-elf-gcc -march=rv32imac -mabi=ilp32 -O2 -o led_blink.elf main.c -T gd32vf103_flash.ld - 使用调试器(如GD-Link)将生成的
led_blink.elf烧录至开发板。
验证方法
烧录成功后,观察板载LED是否以约1Hz的频率(每500ms翻转一次)持续闪烁。若LED常亮或常灭,检查PC13引脚连接方向及GPIO初始化是否正确;若闪烁频率明显异常,调整delay_1ms中的循环次数以匹配实际系统主频。
预期输出
LED以亮500ms、灭500ms的周期循环闪烁,周期约为1秒。该结果由代码逻辑直接决定,不依赖外部输入。