Skip to content

YV3507/STM32F407_Smart_Lock_System

Repository files navigation

Smart Lock System — 基于 STM32F407 的智能门锁系统

项目概述

基于 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 调度框架

系统采用 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
Loading

任务注册

// 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/蜂鸣器定时控制 + 电机状态机 + 开锁互斥标志清除

推荐学习路径

  1. 阅读 architecture.md 了解完整架构设计
  2. 阅读 硬件接口映射表.md 了解引脚分配
  3. 阅读 指纹模块使用说明.md 了解指纹操作 API
  4. 阅读 APP/app_main.c 了解初始化序列
  5. 阅读 APP/app_system.c 了解系统状态机

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages