基于 STM32F407VET6 (Cortex-M4) 的智能门锁固件,集成 5 种开锁方式(密码键盘、指纹识别、NFC 刷卡、蓝牙遥控、独立按键顺序锁),配备 LCD 显示、语音播报等功能。采用 TSM 动态任务调度框架,所有外设驱动均为非阻塞设计。
| 项目 | 说明 |
|---|---|
| MCU | STM32F407VET6, 168MHz |
| 开发环境 | Keil MDK (ARMCC V5) |
| 标准库 | STM32F4xx Standard Peripheral Library |
| 调度方式 | TSM (Time-Sharing Multiplexing) 动态任务调度 |
| LCD 接口 | FSMC 8080 并行接口, 320×240 (ILI9341) |
| 触摸键盘 | TTP229 电容触摸 (2-线同步串行, PB12/PB13) |
架构重构说明 (2026-06): 项目已完成整体级重构。将原来 1000+ 行的
main.c拆解为 7 个职责分明的应用模块(APP/目录),BSP 层 UART 驱动统一化、TSM 调度器动态化。详见architecture.md。加密升级 (demov3): 新增硬件加密服务模块
app_crypto,集成 RNG 真随机数生成 + XTEA 键控哈希。密码存储从明文升级为 Salt + 哈希摘要,指纹模块口令从出厂默认0x00000000升级为每台设备唯一随机值。详见architecture.md。
├── APP/ # 应用层 — 业务逻辑模块
│ ├── app_common.h # 公共类型、全局开关
│ ├── app_main.c/h # 应用入口 + 初始化序列 + 主循环
│ ├── app_system.c/h # 系统状态 + Task1~Task5 + NFC/键盘处理
│ ├── app_unlock.c/h # 开锁/关锁 + LED/蜂鸣反馈
│ ├── app_password.c/h # 密码缓冲区 + 校验 + 修改(Salt + 哈希摘要)
│ ├── app_crypto.c/h # 【新增】硬件加密服务(RNG 随机数 + XTEA 键控哈希)
│ ├── app_fp_menu.c/h # 指纹菜单状态机(9 个子状态)
│ ├── app_display.c/h # LCD 界面渲染层(封装所有 ILI9341 调用)
│ └── app_ble_cmd.c/h # 蓝牙指令解析(UNLOCK/LOCK/PWD=/PWD?)
├── BSP/ # 板级支持包 — 硬件驱动层
│ ├── gpio.c/h # GPIO 驱动(LED、蜂鸣器、面板背光)
│ ├── key_button.c/h # 独立按键驱动 + 顺序锁状态机
│ ├── keyboard.c/h # TTP229 电容触摸键盘驱动 (PB12/PB13)
│ ├── lcd.c/h # ILI9341 LCD 驱动 (FSMC 8080)
│ ├── uart.c/h # 多串口 FIFO 驱动(统一初始化接口)
│ ├── bluetooth.c/h # JDY-16 蓝牙模块驱动
│ ├── fingerprint.c/h # ZN-632 指纹模块驱动(非阻塞 API)
│ ├── nfc.c/h # PN532 NFC 模块驱动
│ ├── voice.c/h # MY2490-16P 语音播报模块驱动
│ ├── motor.c/h # 门锁电机 H 桥控制 + 状态机
│ ├── spi_flash.c/h # W25Qxx SPI Flash 驱动(字库存储)
│ ├── timer.c/h # SysTick 中断 + 动态 TSM 调度器
│ ├── delay.c/h # 延时函数 (DWT 周期计数器 + SysTick)
│ ├── wdt.c/h # IWDG 独立看门狗驱动(~2.5s 超时自动复位)
│ ├── fonts.c/h # ASCII 字库数据
│ └── qstlogo.h # LOGO 图片位图数据
├── USER/ # 入口层
│ ├── main.c # 入口(仅调用 APP_Init() + APP_Loop())
│ ├── stm32f4xx_it.c # 外设中断服务例程
│ ├── stm32f4xx_conf.h # 外设库配置
│ └── system_stm32f4xx.c # 系统时钟配置 (168MHz)
├── CORE/ # CMSIS 核心文件(含 startup_stm32f40_41xxx.s)
├── FWLIB/ # STM32F4xx 标准外设库(仅编译必需模块)
├── architecture.md # 软件架构文档
├── 硬件接口映射表.md # 硬件资源分配与引脚映射
├── USER_GUIDE.md # 用户使用指南
├── keilkilll.bat # Keil 临时文件清理脚本
└── OBJ/ # 编译输出
| 方式 | 模块 | 状态 | 说明 |
|---|---|---|---|
| 密码开锁 | TTP229 键盘 + app_password |
✅ 默认启用 | 8 位密码,按 # 确认或自动比对 |
| 指纹开锁 | ZN-632 (USART3) + app_system |
✅ 默认启用 (FP_ENABLE=1) |
非阻塞轮询,每 1 秒自动识别 |
| NFC 刷卡 | PN532 (USART1) + app_system |
✅ 默认启用 (NFC_ENABLE=1) |
MIFARE Classic 卡白名单验证,非阻塞状态机不阻塞任务调度 |
| 蓝牙遥控 | JDY-16 (USART2) + app_ble_cmd |
✅ 默认启用 (BT_ENABLE=1) |
支持 AUTH/UNLOCK/LOCK/STATUS/PWD= 指令,AUTH= 鉴权保护,30 秒会话超时,5 次失败锁定 5 分钟;详见协议文档 |
| 顺序锁 | 独立按键 (PA0/PC13/PC6/PC7) + key_button |
✅ 默认启用 | 按 4→3→2→1 顺序按下开锁 |
- LCD 显示: ILI9341 (320×240),显示外设状态、指纹菜单、密码输入进度、顺序锁进度
- 指纹菜单: 按
*键进入,支持录入/删除/清空/查询数量,LCD 全菜单操作 - LED 指示: 3 路 LED + 面板 LED 背光(按键闪烁反馈)
- 蜂鸣器: 按键提示、开锁成功/失败反馈
- 语音播报: MY2490-16P 模块(默认启用),支持开锁成功等语音提示
系统通过头文件中的宏开关控制模块启用/禁用:
| 宏 | 默认值 | 定义位置 | 说明 |
|---|---|---|---|
FP_ENABLE |
1 |
BSP/fingerprint.h |
ZN-632 指纹模块 (USART3) |
NFC_ENABLE |
1 |
BSP/nfc.h |
PN532 NFC 模块 (USART1) |
BT_ENABLE |
1 |
BSP/bluetooth.h |
JDY-16 蓝牙模块 (USART2) |
VOICE_ENABLE |
1 |
BSP/voice.h |
MY2490-16P 语音模块 (UART5) |
UART4_ENABLE |
1 |
BSP/uart.h |
UART4 通用数据转发 |
WDT_ENABLE |
1 |
BSP/wdt.h |
IWDG 独立看门狗(调试时设为 0 禁用) |
蓝牙和语音模块已默认启用,若硬件未连接,初始化会超时自动跳过。UART4 数据转发默认启用(需确认硬件已连接)。
| 参数 | 值 | 说明 |
|---|---|---|
| 默认密码 | 14725800 |
8 位,首次上电自动写入 SPI Flash 持久化,修改后掉电不丢失 |
| 密码最大长度 | PWD_MAX_LEN = 8 |
定义在 APP/app_common.h |
| 密码存储位置 | SPI Flash (W25Q16) 0x1FF000 |
Salt + XTEA-DaviesMeyer 哈希摘要,防物理读取还原 |
| 密码完整性 | Magic + Checksum + 双扇区双备份 | 防止数据损坏、写入中断导致密码丢失 |
| 密码盐值 | 4 字节硬件真随机数(首次启动生成) | RNG 外设产生,每台设备唯一 |
| 密码哈希 | XTEA Davies-Meyer 密钥构造 | 64 位输出,单向不可逆 |
| 指纹容量 | 100 枚 (编号 0~99) | ZN-632 模块 |
| 指纹口令 | RNG 随机值(非出厂默认 0x00000000) |
首次启动自动设置并持久化到 SPI Flash |
| 开锁电机运行时间 | 400 ms | MOTOR_RUN_TIME |
| 自动关锁延迟 | 4000 ms | MOTOR_LOCK_DELAY |
系统采用 TSM (Time-Sharing Multiplexing) 动态调度,在 APP_Loop() 的 while(1) 中调用 TSM_Dispatch(),由 SysTick 中断(10ms)驱动任务计数器递减。
flowchart LR
SYSTICK["SysTick_Handler<br/>每 10ms 中断"] -- "TSM_Tick, counter--" --> TASKS
subgraph TASKS["主循环 TSM_Dispatch"]
direction LR
T1["APP_Task1<br/>结果倒计时 + LCD 状态<br/>1000ms"]
T2["APP_Task2<br/>键盘 + 密码 + 指纹菜单<br/>20ms"]
T3["APP_Task3<br/>指纹/NFC<br/>500ms"]
T4["APP_Task4<br/>蓝牙<br/>1000ms"]
T5["APP_Task5<br/>LED/蜂鸣器/电机<br/>100ms"]
end
MAIN["APP_Loop"] -- "TSM_Dispatch" --> TASKS
// app_main.c — APP_Init() 中注册
t1 = TSM_Register(APP_Task1, 100); /* 100 × 10ms = 1000ms */
t2 = TSM_Register(APP_Task2, 2); /* 2 × 10ms = 20ms */
t3 = TSM_Register(APP_Task3, 50); /* 50 × 10ms = 500ms */
t4 = TSM_Register(APP_Task4, 100); /* 100 × 10ms = 1000ms */
t5 = TSM_Register(APP_Task5, 10); /* 10 × 10ms = 100ms */相比重构前(硬编码 Task1~5 全局变量),新框架支持运行时动态注册/注销任务,最大 10 个任务槽位。
| 任务 | 函数 | 周期 | 功能 |
|---|---|---|---|
| Task1 | APP_Task1() |
1000ms | 指纹菜单结果倒计时;非菜单时动态显示外设状态行(根据初始化结果显示 Ready / Diag:xxx / Off) |
| Task2 | APP_Task2() |
20ms | 消费 TTP229 按键 → 分发到指纹菜单或密码输入;独立按键顺序锁 |
| Task3 | APP_Task3() |
500ms | 指纹菜单操作轮询 + 指纹识别 + NFC 卡片检测 |
| Task4 | APP_Task4() |
1000ms | 蓝牙数据接收与指令解析 |
| Task5 | APP_Task5() |
100ms | LED/蜂鸣器定时控制 + 电机状态机 + 开锁互斥标志清除 |
- 阅读
architecture.md了解完整架构设计 - 阅读
硬件接口映射表.md了解引脚分配 - 阅读
指纹模块使用说明.md了解指纹操作 API - 阅读
APP/app_main.c了解初始化序列 - 阅读
APP/app_system.c了解系统状态机