引言
本文基于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
|