当前位置: 首页 > news >正文

蓝桥杯嵌入式比赛的做题步骤总结!

一、简洁版步骤

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.clcd.hfonts.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等模块是关键! 🚀

相关文章:

  • Elastic 的 OpenTelemetry 分发版(EDOT)现已正式发布:开源、可用于生产环境的 OTel
  • 【HFP】蓝牙HFP应用层核心技术研究
  • 23种设计模式中的观察者模式
  • 26考研 | 王道 | 数据结构 | 第五章 树
  • mybatis plus 实体类基于视图,更新单表的时候报视图或函数‘v_视图名‘不可更新,因为修改会影响多个基表的错误的简单处理方法。
  • 基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)
  • mac安装浏览器闪退处理
  • 【ARTS】【LeetCode-2873】有序三元组中的最大值!
  • 计算机系统--- BIOS(基本输入输出系统)
  • 内网渗透-MySQL提权
  • Java面试黄金宝典38
  • 一周学会Pandas2 Python数据处理与分析-NumPy数组属性
  • 不用训练,集成多个大模型产生更优秀的输出
  • 4.4刷题记录(哈希表)
  • 游戏引擎学习第208天
  • 前端快速入门学习4——CSS盒子模型、浮动、定位
  • 计算机视觉5——运动估计和光流估计
  • 插入排序详细讲解
  • modprobe: can‘t open ‘modules.dep‘: No such file or directory
  • JAVA反序列化深入学习(十三):Spring2
  • 莱州双语网站/目前网络推广平台
  • nodejs 做视频网站/网络营销五个主要手段
  • 中国企业500强企业名单/商丘网站优化公司
  • 化妆品手机端网站模板/竞价推广哪里开户
  • 去国外怎么导航地图/站长工具seo综合查询问题
  • 学seo可以做网站吗/郑州做网站推广电话