打印
[研电赛技术支持]

GD32的按键控制与状态显示

[复制链接]
73|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
引言
本文基于GD32F4xx系列微控制器,通过多个功能模块的实现(GPIO控制、SysTick延时、按键检测、状态机设计),演示嵌入式开发中的常见技术要点。项目最终实现按键模拟电池充电状态显示功能,包含流水灯效果和电量指示。

一、开发环境准备
硬件平台
GD32F450/F470开发板
4个LED灯(PD7-PD10)
3个按键(PD0开始充电,PD1结束充电,PD5电量增加)
软件工具
GCC/Keil编译环境
GD32F4xx固件库
二、核心代码解析
1. GPIO配置(文档22)
// 配置LED和按键引脚
static void GPIO_config() {
    // LED配置(PD7-PD10)
    rcu_periph_clock_enable(RCU_GPIOD);
    gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP,
                 GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10);
    gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ,
                           GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10);

    // 按键配置(PD0/PD1/PD5)
    gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,
                 GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_5);
}




2. SysTick精准延时(文档6/32)
volatile static uint32_t delay;

// 1us延时(基于SysTick中断)
void delay_1us(uint32_t count) {
    delay = count;
    while(delay != 0);
}

// SysTick中断服务函数
void SysTick_Handler(void) {
    if(delay != 0) delay--;
}


3. 按键检测与消抖(文档29)
FlagStatus check_button(GPIO_TypeDef* gpio, uint16_t pin) {
    static uint32_t last_time = 0;
    if(gpio_input_bit_get(gpio, pin) == RESET) { // 按键按下
        if(systick_cnt - last_time > 20) {       // 20ms消抖
            last_time = systick_cnt;
            return SET;
        }
    }
    return RESET;
}


4. 电池状态机设计(文档29)
typedef enum {
    CHARGE_OFF,
    CHARGE_STARTING,
    CHARGE_IN_PROGRESS,
    CHARGE_COMPLETE
} ChargeState;

ChargeState curr_state = CHARGE_OFF;

void Battery_led_loop() {
    switch(curr_state) {
        case CHARGE_STARTING:
            // 流水灯效果
            rotate_leds();
            if(all_leds_on())
                curr_state = CHARGE_IN_PROGRESS;
            break;
        case CHARGE_COMPLETE:
            blink_leds(3); // 闪烁3次
            curr_state = CHARGE_OFF;
            break;
    }
}



三、功能实现流程
初始化阶段

配置系统时钟和GPIO
初始化SysTick定时器(1us时基)
按键处理逻辑

PD0按下:启动充电(显示当前电量并流水灯)
PD5按下:电量增加(更新LED显示)
PD1按下:结束充电(LED闪烁后熄灭)
LED显示规则



四、关键调试技巧
LED调试法

在关键代码位置插入LED状态变化,可视化程序执行流程
变量监视

printf("Current power: %d\n", power); // 通过串口输出电量


状态追踪

#define DEBUG_STATE_CHANGE(new_state) \
    printf("State changed to: %d\n", new_state)


五、优化方向
引入ADC模块

通过电位器模拟真实电量输入
实现电压检测与电量百分比换算
增加PWM调光

pwm_set_duty(LED_PIN, brightness); // 实现LED亮度渐变


低功耗优化

充电完成进入STOP模式
按键唤醒功能
结语
本文通过GD32F4微控制器实现了完整的电池充电状态显示系统,涵盖GPIO控制、中断处理、状态机设计等嵌入式开发核心技术。读者可根据实际需求扩展ADC检测、网络通信等高级功能,打造更完整的物联网终端设备。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_69851948/article/details/147110911

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

115

帖子

0

粉丝