基于STM32 微控制器的工程主文件(main.c),核心围绕嵌入式外设驱动、人机交互、时序控制等功能开发,整体是一个包含串口通信、数码管显示、按键扫描、LCD 屏驱动、GPIO 控制等功能的综合应用程序。以下从核心维度拆解说明:

一、文件整体架构

遵循 STM32 HAL 库工程规范,分为固定框架区(STM32 系统初始化、外设配置)和用户自定义区(USER CODE块),核心逻辑集中在用户自定义区,整体结构如下:

plaintext

├── 头文件引入(HAL库+自定义驱动)
├── 私有类型/宏定义(标志位、缓存、计时变量)
├── 外设初始化(时钟、GPIO、ADC、SPI、UART等)
├── 中断回调函数(串口接收)
├── 核心功能函数(数码管驱动、按键扫描)
├── main函数(主循环:时序调度、逻辑执行)
├── 系统时钟配置/错误处理函数

二、核心功能模块解析

1. 外设初始化(硬件层)

初始化 STM32 核心外设,为上层功能提供硬件基础:

  • 基础外设:GPIO(通用输入输出)、DMA(直接内存访问)、ADC1(模数转换)、SPI1(串行外设接口)、USART1(串口 1);
  • 自定义 GPIO:手动配置PC13引脚为推挽输出(用于 LED / 指示灯控制);
  • 外设初始化逻辑:先初始化系统时钟,再初始化外设,最后初始化自定义硬件(LCD、数码管、485 等)。
2. 串口通信模块(USART1)

实现串口中断式接收,支持单字节持续接收:

  • 核心变量:rx_buffer(串口接收单字节缓存);
  • 中断回调:HAL_UART_RxCpltCallback—— 接收 1 字节后,在 LCD 屏 (0,48) 位置显示该字节的整数值,且必须重新开启接收中断(否则仅接收 1 次);
  • 485 适配:初始化时调用MAX485_RX_MODE(),将 485 芯片设为接收模式(支持串口转 485 通信)。
3. 数码管驱动模块(四位动态扫描)

实现四位数码管的动态扫描显示,核心解决 “多位数码管分时点亮” 的问题:

  • 核心逻辑:2ms 调用一次smg()函数,按smg_index(0-3 对应千 / 百 / 十 / 个位)轮询点亮每一位,实现 “视觉暂留” 的全屏显示效果;
  • 控制逻辑:
    • 开启状态(smg_flag=true):按位解析smg_num(显示数值),调用SMG_Show点亮对应位;
    • 关闭状态(smg_flag=false):1 秒后关闭所有数码管位选,停止显示;
    • 边界处理:smg_num限制在 0-9999,smg_index轮询后自动复位。
4. 按键扫描模块

20ms 调用一次KEY()函数,实现 4 个按键(KEY1-KEY4)的消抖扫描

  • 扫描逻辑:
    1. 定义按键引脚数组(KEY4-KEY1 对应索引 0-3);
    2. 对比 “当前按键状态” 与 “上一次状态”,通过HAL_Delay(20)消抖;
    3. 区分 “按下事件” 和 “松开事件”,执行对应逻辑(当前按下逻辑为注释态,仅预留框架);
  • 注意点:按键引脚定义存在笔误(KEY1 对应KEY2_Pin),需硬件适配或修正。
5. LCD 屏驱动模块(TFT 液晶屏)

基于 SPI 外设驱动的 TFT 屏,实现字符 / 数值 / 字符串显示:

  • 初始化:LCD_Init()初始化屏,LCD_Fill清屏为黑色;
  • 显示功能:调用LCD_ShowMixString/LCD_ShowIntNum等函数,显示固定字符串(如 “Modebus”)、变量值(串口接收值);
  • 显示区域:预留了倒计时、状态(ON/OFF)、姓名 / 学号等显示位置(部分为注释态)。
6. 时序调度与主循环(核心执行逻辑)

main函数的无限循环中,基于HAL_GetTick()(系统毫秒级计时)实现多任务时序调度,避免阻塞:

表格

时间间隔 执行任务 功能说明
2ms smg() 数码管动态扫描刷新
1ms 主定时器调度 1s 倒计时、500ms LED 闪烁、20ms 按键扫描
1000ms 倒计时逻辑 state=true时,smg_num每秒减 1,减至 0 后触发蜂鸣器、更新状态
500ms LED 控制 翻转 PC13 引脚电平(LED 闪烁,频率 2Hz)
20ms KEY() 按键消抖扫描
7. 辅助功能模块
  • 蜂鸣器控制:通过beep_status标志位控制蜂鸣器,触发后持续 2 秒自动关闭;
  • 状态管理state标志位控制倒计时启停,倒计时结束后自动置为false
  • 错误处理Error_Handler()函数在系统出错时禁用中断并进入死循环,便于调试。

三、关键变量 / 宏说明

表格

变量名 类型 核心作用
smg_flag bool 数码管显示使能标志(true:开启,false:关闭)
smg_num uint16_t 数码管显示的数值(0-9999)
rx_buffer uint8_t 串口接收单字节缓存
beep_status bool 蜂鸣器状态(true:响,false:静音)
state bool 系统运行状态(true:倒计时运行,false:停止)

四、未完成 / 待优化点

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐