蓝桥杯嵌入式比赛的做题步骤总结!
一、简洁版步骤
1. 工程创建与初始化
- 使用STM32CubeMX创建工程,选择正确的MCU型号(如STM32G431RBT6)
- 配置系统时钟(HSE选择外部晶振,时钟频率设置为24MHz,HCLK设置为80MHz)
- 配置调试接口(Serial Wire)
2. 外设配置
LED模块
- 配置LED相关引脚(PC8-PC15为驱动引脚,PD2为锁存引脚)为GPIO输出,初始状态设置为高电平(灯灭)
- 解决LCD与LED引脚冲突问题:在LCD初始化前执行
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET)
- LED闪烁控制:通过定时器中断实现周期性闪烁(例如每0.2s改变一次LED状态)
按键模块
- 配置按键对应引脚(如PB0、PB1、PB2、PA0)为GPIO输入(上拉输入)
- 按键扫描:通过定时器中断(如每10ms)检测按键状态,使用状态机消除抖动
LCD模块
- 添加LCD驱动文件(lcd.c、lcd.h、fonts.h)到工程中
- 解决LCD与LED冲突:在LCD操作前保存GPIOC的输出状态,操作后恢复
3. 功能实现
- LED控制:通过锁存器(PD2)控制LED的亮灭,使用全局变量和位操作实现特定LED的控制
- 按键功能:根据按键状态改变LED或LCD显示内容
- LCD显示:实现菜单、参数设置和数据显示功能,支持高亮选中项
4. 调试与优化
- 使用调试工具(如CMSIS-DAP)进行程序下载和调试
- 检查引脚冲突问题,确保外设正常工作
- 优化程序结构,确保实时性和稳定性
5. 其他模块(根据题目要求)
- ADC:读取电压值,检测上升沿和下降沿
- 定时器:用于精确计时和周期性任务
- EEPROM:保存参数设置
注意事项
- 引脚冲突是常见问题,需特别注意LED和LCD的共用引脚
- 定时器中断的配置(如NVIC使能)和回调函数的实现
- 代码结构清晰,模块化设计便于调试
二、详细版笔记
1. 工程创建与初始化
1.1 使用STM32CubeMX创建工程
- MCU型号:STM32G431RBT6(蓝桥杯官方开发板)
- 时钟配置:
- HSE:外部晶振(24MHz)
- HCLK:80MHz(系统主频)
- PLL:需正确配置倍频参数
- 调试接口:Serial Wire(SWD)
1.2 工程初始化
- 生成代码:选择MDK-ARM(Keil)或STM32CubeIDE
- 添加必要库:HAL库、LCD驱动、按键驱动等
2. 外设配置
2.1 LED模块
- 引脚:PC8-PC15(LED驱动)、PD2(锁存信号)
- 配置:
- GPIO模式:推挽输出(Output Push-Pull)
- 初始状态:高电平(灯灭)
- LED控制逻辑:
void LED_Write(uint16_t data) { GPIOC->ODR = (GPIOC->ODR & 0xFF00) | (data & 0x00FF); // 写入PC8-PC15 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); // 锁存 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); // 释放 }
- LED闪烁:使用定时器中断(如TIM2)
2.2 按键模块
- 引脚:PB0、PB1、PB2、PA0(对应K1-K4)
- 配置:
- GPIO模式:上拉输入(Input Pull-up)
- 消抖方式:定时器扫描(10ms)
- 按键扫描代码:
uint8_t Key_Scan(void) { if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) return 1; // K1 if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET) return 2; // K2 if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET) return 3; // K3 if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) return 4; // K4 return 0; }
2.3 LCD模块
- 驱动文件:
lcd.c
、lcd.h
、fonts.h
- 初始化:
LCD_Init(); // 初始化LCD LCD_Clear(WHITE); // 清屏
- 显示内容:
LCD_ShowString(10, 10, "Hello, World!", BLACK, WHITE, 16, 0);
- 解决LED与LCD冲突:
- 在LCD操作前,先关闭LED锁存(PD2置低)
3. 功能实现
3.1 定时器中断(TIM2)
- 配置:
- 时钟源:内部时钟
- 预分频(PSC):7999(80MHz / 8000 = 10kHz)
- 自动重装载(ARR):999(10kHz / 1000 = 10ms)
- 中断回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { Key_Scan(); // 每10ms扫描一次按键 } }
3.2 ADC采集(如电压检测)
- 配置:
- 通道:PA1(ADC1_IN1)
- 采样时间:239.5周期(提高精度)
- 读取ADC值:
uint16_t ADC_Read(void) { HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) { return HAL_ADC_GetValue(&hadc1); } return 0; }
3.3 EEPROM存储(AT24C02)
- I2C配置:PB6(SCL)、PB7(SDA)
- 读写函数:
void EEPROM_Write(uint8_t addr, uint8_t data) { HAL_I2C_Mem_Write(&hi2c1, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, &data, 1, 100); } uint8_t EEPROM_Read(uint8_t addr) { uint8_t data; HAL_I2C_Mem_Read(&hi2c1, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, &data, 1, 100); return data; }
4. 调试与优化
4.1 常见问题
- LED不亮:检查锁存信号(PD2)是否正确
- 按键无反应:检查GPIO模式(上拉输入)
- LCD花屏:检查初始化时序
4.2 优化建议
- 模块化编程:LED、按键、LCD等单独封装
- 减少全局变量:使用结构体管理状态
- 合理使用中断:避免阻塞式延时
5. 比赛技巧
✅ 先做基础功能(LED、按键、LCD)
✅ 再实现高级功能(ADC、PWM、EEPROM)
✅ 最后调试稳定性(避免死机、数据错误)
总结:蓝桥杯嵌入式比赛主要考察STM32外设配置、HAL库使用和模块化编程能力,熟练掌握LED、按键、LCD、ADC、EEPROM等模块是关键! 🚀