1.首先我们来看一看GD32VW553-IOT-V2的引脚图与原理图。


2.在官网下载需要的软件包。
3.代码原理:按键接控制器输入引脚、LED接输出引脚,按键未按下时输入引脚电平稳定,控制器不动作、LED 不亮,按下后输入引脚电平跳变,控制器检测到信号后,按预设程序改变输出引脚电平,让电流流过 LED 实现亮灭,这种模式还能通过编程实现按一次亮再按一次灭等复杂逻辑。
4.源代码
#include "gd32vw55x.h"
#include "systick.h"
#include <stdio.h>
#include "gd32vw553h_eval.h"
/* 引脚定义:A0(输入)控制A1(LED) */
#define INPUT_GPIO_PORT GPIOA // 输入引脚端口(A0)
#define INPUT_GPIO_PIN GPIO_PIN_0 // 输入引脚(A0,上拉输入)
#define LED_GPIO_PORT GPIOA // LED引脚端口(A1)
#define LED_PIN GPIO_PIN_1 // LED引脚(A1)
/* 函数声明 */
void system_init(void);
void gpio_input_config(void);
void gpio_led_config(void);
uint8_t gpio_level_read_stable(void);
void led_control_by_input(void);
int main(void) {
system_init();
printf("A0控制A1:高电平灭,低电平亮\r\n");
printf("Input: A0 | Output: A1\r\n");
while(1) {
led_control_by_input(); // 根据A0电平控制A1
delay_1ms(10);
}
}
/* 系统初始化 */
void system_init(void) {
systick_config();
gpio_input_config();
gpio_led_config();
}
/* 配置A0为上拉输入(默认高电平) */
void gpio_input_config(void) {
rcu_periph_clock_enable(RCU_GPIOA);
// 上拉输入:未接信号时默认高电平,接低电平(如GND)时为低电平
gpio_mode_set(INPUT_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, INPUT_GPIO_PIN);
}
/* 配置A1为推挽输出 */
void gpio_led_config(void) {
// GPIOA时钟已在gpio_input_config中使能
gpio_mode_set(LED_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_PIN);
gpio_output_options_set(LED_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, LED_PIN);
gpio_bit_reset(LED_GPIO_PORT, LED_PIN); // 初始状态:灭
}
/* 带防抖的A0电平读取 */
uint8_t gpio_level_read_stable(void) {
uint8_t level1, level2, level3;
level1 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);
delay_1ms(5);
level2 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);
delay_1ms(5);
level3 = gpio_input_bit_get(INPUT_GPIO_PORT, INPUT_GPIO_PIN);
return (level1 == level2 && level2 == level3) ? level1 : level2;
}
/* 核心控制逻辑:A0高电平灭,低电平亮 */
void led_control_by_input(void) {
uint8_t input_level = gpio_level_read_stable();
if(input_level == SET) { // A0为高电平(未按按键)
gpio_bit_reset(LED_GPIO_PORT, LED_PIN); // A1输出低电平→灯灭
} else { // A0为低电平(按键按下,接GND)
gpio_bit_set(LED_GPIO_PORT, LED_PIN); // A1输出高电平→灯亮
}
}
/* 必要的中断服务函数 */
void HardFault_Handler(void) { while(1); }
void SysTick_Handler(void) { delay_decrement(); }
