stm32f103嵌入式主板2.0倒计时程序
摘要:本文详细分析了基于STM32微控制器的工程主文件(main.c)设计,重点阐述了其嵌入式外设驱动、人机交互和时序控制等功能实现。系统采用STM32HAL库架构,包含串口通信、数码管显示、按键扫描等核心模块。其中,串口支持中断接收和485通信,数码管实现四位动态扫描显示,按键模块具备消抖功能,LCD屏驱动支持多种数据显示。主循环采用非阻塞式时序调度,实现多任务协调运行。文中还指出了按键引脚定义
·
基于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)的消抖扫描:
- 扫描逻辑:
- 定义按键引脚数组(KEY4-KEY1 对应索引 0-3);
- 对比 “当前按键状态” 与 “上一次状态”,通过
HAL_Delay(20)消抖; - 区分 “按下事件” 和 “松开事件”,执行对应逻辑(当前按下逻辑为注释态,仅预留框架);
- 注意点:按键引脚定义存在笔误(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:停止) |
四、未完成 / 待优化点
更多推荐

所有评论(0)