
拿到这个开源项目先说结论这是一个非常适合嵌入式入门、毕业设计二次开发和智能门禁原型验证的完整工程。作者把源码和原理图都放出来了不是那种只给 demo 或只给文档的“半开源”这意味着你可以直接基于它改电路、改逻辑、做自己的指纹存储控制系统。项目本身是围绕 STM32 主控展开的核心功能是“指纹录入、指纹识别、存储管理、状态输出”。从工程结构看它不是一个玩具级点灯程序而是包含了指纹模块驱动、存储芯片读写、按键交互、状态指示和串口调试的完整小系统。这篇文章会从硬件组成、源码结构、环境搭建、烧录验证、功能测试到常见坑位完整带你过一遍。如果你手头正好有 STM32F103C8T6 最小系统板、AS608 或类似指纹模块、一个 OLED 或者串口屏这篇文章可以直接当操作手册用。如果没有硬件也能通过读原理图和源码理解整个系统的数据流设计为后续自己画板子做产品原型打基础。1. 智能指纹存储控制系统核心能力速览先整理一份规格表方便快速判断这个项目是否符合你的需求。能力项说明项目类型嵌入式指纹识别 存储控制系统开源硬件 开源软件主控芯片STM32 系列从工程配置看以 STM32F103C8T6 为典型载体主要功能指纹录入、指纹搜索比对、指纹删除、存储状态管理、按键交互、状态指示硬件接口指纹模块串口/UART、存储芯片 I2C/SPI、按键 GPIO、状态灯/蜂鸣器/显示屏源码形式Keil MDK 工程标准外设库或 HAL 库工程结构原理图开源 PCB 原理图可用于复刻打板或学习参考文档完整度源码 原理图已开源适合直接编译烧录和二次开发烧录调试支持 ST-Link 下载、串口打印调试信息是否支持批量任务批量录入指纹场景可通过上位机串口指令或重复按键操作完成是否支持 API无独立 API但串口协议可自行封装适合接入门禁主机或上位机适合场景毕设、嵌入式学习、智能锁原型、门禁考勤、实验室设备管理这套系统最大的特点就是“麻雀虽小五脏俱全”。它把指纹识别的完整业务流程跑通了采集指纹图像、提取特征值、保存特征模板、再次按压时搜索匹配、匹配成功执行开锁或放行控制。存储部分负责把指纹模板和用户信息持久化断电不丢失。2. 适用场景与使用边界2.1 适合谁用嵌入式初学者想从点灯进阶到“外设驱动 数据存储 算法流程”的综合项目这个工程的代码量和复杂度刚好合适。毕业设计学生指纹门禁、指纹保险柜、实验室设备租借管理这类题目可以直接拿这个项目做基础框架再叠加 WiFi 上报、刷卡、APP 联动。电子爱好者 / 创客想快速做一个指纹锁原型或者验证指纹模块选型是否满足需求用这个方案成本低、见效快。产品经理 / 硬件项目经理想了解指纹存储控制系统由哪些模块组成、大概需要多少 BOM 成本、开发周期多长原理图和源码是很好的参考资料。2.2 能解决什么问题解决“指纹模块怎么接到 STM32 上”的问题源码已经封装好了发送命令、接收应答、解析数据包的逻辑。解决“指纹模板存哪里”的问题外部存储芯片方案让指纹特征值在掉电后依然可以恢复而不是每次开机都要重新录指纹。解决“多指纹怎么管理”的问题系统支持按 ID 存储可以增加、删除、搜索指纹而不是只靠模块内部的固定存储。2.3 不适合什么场景高安全等级门禁消费级光学指纹模块存在被假指纹破解的风险如果用于实验室机房、机房服务器机柜等高安全场景需要搭配活体检测和人脸二次验证。工业量产产品开源工程是原型验证级别没有做完整的 EMC/ESD 防护、温漂补偿和老化测试直接量产风险较高。大规模并发识别如果同一个 MCU 需要同时服务几千个指纹模板选型和存储策略需要重新设计不建议直接照搬。2.4 安全与合规边界使用指纹数据必须谨慎。指纹属于生物识别敏感信息如果系统需要保存大量人员的指纹特征建议在项目说明和产品说明中明确数据仅存储在本地硬件中、不经过云服务器、用户可自行删除指纹数据。如果用于商业产品还需要遵循当地个人信息保护相关法规做好用户授权告知。3. 环境准备与前置条件在开始编译、烧录和测试之前先把软硬件环境准备好。这个项目的开发环境是典型的 STM32 标准流程不需要特殊工具。3.1 硬件清单硬件数量说明STM32F103C8T6 最小系统板1核心主控也可以用其他 STM32F1 系列替代注意引脚兼容AS608 / R307 指纹模块1常见光学指纹模块串口通信默认波特率常见为 57600 或 9600OLED 显示屏I2C可选用于显示菜单、指纹 ID、匹配状态也可用串口屏替换按键2-4功能选择、确认、删除、翻页具体数量看原理图设计有源蜂鸣器可选成功/失败提示音外部存储芯片AT24C02/AT24C64 或 W25Q641保存指纹 ID 映射表和用户数据具体型号看原理图ST-Link V2 下载器1烧录和在线调试USB 转 TTL 串口模块1打印调试日志查看识别结果3.2 软件工具工具用途Keil MDK5编译和下载源码工程需要安装对应器件支持包STM32CubeMX可选重新生成初始化代码时会用到直接使用开源工程则不是必须ST-Link 驱动程序连接 ST-Link 与电脑串口调试助手查看串口日志发送测试指令Altium Designer 或立创EDA打开原理图源文件查看电路连接3.3 安装与配置要点Keil MDK5 装好后第一步是安装 STM32F1 系列芯片支持包。如果编译时提示找不到stm32f1xx.h或者报很多未定义错误基本都是芯片包没装好。打开 Keil 的 Pack Installer在搜索框输入STM32F1安装Keil::STM32F1xx_DFP即可。# 检查 ST-Link 是否可以被系统识别 # Windows 设备管理器 - 通用串行总线设备 - ST-Link dongle # 如果没有出现需要安装 ST-Link USB Driver如果使用 STM32CubeMX 重新初始化引脚建议对照开源原理图确认指纹模块的 UART 引脚、存储芯片的 I2C/SPI 引脚、按键对应的 GPIO不要只按默认配置生成。3.4 磁盘空间与系统要求工程编译后生成的固件一般在几十 KB 到两百 KB 之间Keil 工程整体占用空间不到 100 MB。Windows 10/11 64 位系统下使用 Keil MDK5 是最顺畅的。如果你的电脑是 Apple Silicon Mac建议用 Windows 虚拟机或直接用云编译平台原生 ARM Mac 跑 Keil 比较麻烦。4. 源码与原理图构成分析拿到开源包后先不要急着编译花几分钟看一下目录结构和核心文件。这个习惯能让你之后修改功能时少走很多弯路。4.1 源码目录结构一个典型的 STM32 工程目录大致如下SmartFingerStorage/ ├── USER/ │ ├── main.c │ ├── stm32f10x_it.c │ └── system_stm32f10x.c ├── HARDWARE/ │ ├── fingerprint/ │ │ ├── fingerprint.c │ │ └── fingerprint.h │ ├── storage/ │ │ ├── storage.c │ │ └── storage.h │ ├── key/ │ │ ├── key.c │ │ └── key.h │ └── oled/ │ ├── oled.c │ └── oled.h ├── CORE/ │ ├── core_cm3.c │ └── startup_stm32f10x_hd.s ├── SYSTEM/ │ ├── delay/ │ ├── sys/ │ └── usart/ └── STM32F10x_FWLib/ ├── src/ └── inc/重点看这几个文件main.c系统主流程完成外设初始化、按键轮询、指纹识别状态机。fingerprint.c/h指纹模块驱动封装了录入指纹、搜索指纹、删除指纹、模块握手等串口命令。storage.c/h存储驱动负责把指纹 ID 与用户数据写入外部存储芯片开机时再读出来恢复。key.c/h按键扫描支持短按、长按等多功能操作。oled.c/h显示驱动如果用的是 OLED会在这里完成菜单和状态显示。4.2 原理图构成原理图的核心模块包括STM32F103C8T6 最小系统晶振电路、复位电路、BOOT 配置、电源去耦电容。指纹模块接口VCC、GND、TX、RX 四根线如果模块带触摸唤醒还会有 WAK 引脚。存储芯片I2C 接口的 AT24C 系列或 SPI 接口的 W25Q 系列用于长期保存指纹数据表。按键与指示灯分别接 GPIO 输入和输出设计时注意上拉/下拉电阻。电源电路USB 5V 输入经过 AMS1117-3.3 转 3.3V 给 MCU 和传感器供电。原理图是二维静态图想快速理解数据流可以按“电源 - 主控 - 外设”的顺序层层拆分。先把每个外设接到哪个引脚标出来再对照源码里的GPIO_Init和USART_Init配置就能建立一一对应关系。5. 系统硬件组成与工作原理这个项目可以抽象成四个层面人机交互层、业务逻辑层、外设驱动层、硬件物理层。5.1 指纹识别的业务流程整个系统核心是一个状态机空闲状态 - 按键触发录入 - 模块采集指纹 - 提取特征 - 保存特征与ID - 存储芯片写入 空闲状态 - 按键触发识别 - 模块采集指纹 - 与库内特征比对 - 返回匹配ID - 控制输出指纹模块本身完成“图像采集 特征提取 特征比对”STM32 侧主要做“业务流程调度”和“数据存储管理”。所以不要指望 STM32 去跑指纹识别算法它负责的是“什么时候让模块干活、干完后结果怎么处理”。5.2 存储设计指纹模块内部一般有容量有限的 Flash能保存数十到上百个指纹模板。这个项目引入外部存储芯片目的就是扩展存储容量同时保存每个指纹 ID 对应的用户信息比如工号、姓名索引、录入时间。在storage.c中典型的数据结构可能长这样typedef struct { uint16_t finger_id; // 指纹ID uint32_t enroll_time; // 录入时间戳 uint8_t user_index; // 用户索引编号 uint8_t reserved[8]; // 预留字节 } FingerInfo_t;开机会先读取存储芯片中所有FingerInfo_t构建一张内存映射表。录入新指纹时先分配一个空闲 ID再调用指纹模块的录入命令成功后把 ID 和用户信息写入存储芯片。删除指纹时删除模块内的模板同时擦除存储芯片中对应的记录。5.3 指纹模块串口通信协议AS608 这类模块通常使用自定义串口协议帧格式一般如下包头 地址 包标识 长度 指令 参数/数据 校验和 0xEF 0x01 0xFF 0xFF ... ... ... ...在fingerprint.c中会封装这些底层帧对外暴露几个高层的函数uint8_t Fingerprint_Enroll(uint8_t enroll_id, uint8_t times); uint8_t Fingerprint_Search(uint16_t *matched_id, uint16_t score_threshold); uint8_t Fingerprint_Delete(uint16_t delete_id);实际产品中这些函数会不断被业务层调用顺序大致是“握手 - 生成图像 - 生成特征 - 合并模板 - 存储”。6. 智能指纹存储控制系统功能测试与效果验证拿到代码和硬件后最关键的一步是把整个流程顺下来。建议按照下面的顺序做测试不要跳步。6.1 编译工程用 Keil 打开项目文件.uvprojx先执行一次编译点击 BuildF7预期结果是 0 Error0 Warning 或有少量 Warning。如果编译报错先检查是否安装了 STM32F1 的芯片支持包。宏定义是否设置正确例如STM32F10X_MD。是否打开了 C99 标准支持。6.2 烧录固件连接 ST-LinkST-Link 3.3V - 板子 3.3V ST-Link GND - 板子 GND ST-Link SWDIO - 板子 PA13 ST-Link SWCLK - 板子 PA14Keil 中点击 Options for Target - Debug - 选择 ST-Link Debugger - Settings确认识别到芯片后点击 Download。烧录完成后如果板子有电源指示灯LED 点亮系统开始运行串口会打印初始化信息。6.3 添加指纹测试按操作说明进入菜单选择“录入指纹”按提示按压手指。每个指纹一般需要按压 2 到 3 次模块会提取、合并特征模板。预期表现OLED 或串口显示“Press finger”提示。第一次按压后提示“Press again”。第二次按压后提示“Success ID: 001”。蜂鸣器短响一声表示成功。判断标准系统返回成功并且再次出现在菜单的指纹列表中。如果反复超时检查手指按压位置是否居中、指纹模块表面是否干净。6.4 指纹识别测试选择“验证指纹”菜单按压已录入的手指。预期表现系统提示“Match OK”。显示匹配的 ID 号。门禁控制输出引脚翻转可用 LED 模拟。串口打印匹配时间和 ID。换一个未录入的手指按压应该返回“No Match”。这个测试的关键是验证识别阈值是否合适。如果未录入的手指也经常匹配成功说明阈值设置太宽松如果录入的手指偶尔失败说明阈值太严格可以在代码中调整score_threshold参数。6.5 掉电保持测试录入 3 到 5 个指纹然后完全断电重新上电。预期表现系统启动后不需要重新录指纹。列表中原有的指纹仍然存在。直接按压已录入指纹可以成功匹配。失败时重点检查存储芯片电路和storage.c的初始化逻辑。6.6 删除指纹测试选择某个指纹 ID 执行删除操作。预期表现删除后再按压该手指返回“No Match”。存储芯片中的记录被清空或标记为无效。删除的 ID 可以被重新分配录入新指纹。日常测试中最容易出现的问题是删除模块内模板成功但存储芯片中的记录没有同步删除导致“表面上删了、重启后又能匹配”。代码修复建议是删除操作必须保证“模块操作 存储操作”都成功才算完成。7. 串口指令与批量录入场景如果只需要单机按键操作可以跳过这一节。但如果要做上位机管理、批量录入、门禁日志导出就需要了解项目的串口交互逻辑。7.1 串口通信参数常见配置波特率115200 或 57600看源码 USART 初始化 数据位8 停止位1 校验位None用 USB 转 TTL 模块连接板子的 UART 引脚在电脑上打开串口调试助手。系统启动时应该能收到一段初始化日志例如Fingerprint Storage System v1.0 System init OK. Storage device ready. Fingerprint module found.如果直接能看到日志说明调试链路正常。7.2 自定义协议参考如果上位机需要批量录入指纹可以定义一种简单的文本协议或二进制协议。以文本协议为例ENROLL,001 SEARCH DELETE,001 LIST在串口接收中断中做字符串解析然后在主循环中执行对应动作并回传结果RESULT,ENROLL,001,SUCCESS RESULT,SEARCH,MATCH,001 RESULT,DELETE,001,SUCCESS LIST,001 LIST,002这样扩展的好处是不用动太多底层硬件代码就能快速对接 C#、Python 或 LabVIEW 写的上位机。7.3 Python 上位机调用参考如果你打算用 Python 写一个批量录入脚本基本流程如下import serial import time ser serial.Serial( portCOM3, baudrate115200, timeout1 ) def send_command(cmd: str) - str: ser.write((cmd \n).encode(utf-8)) time.sleep(0.2) resp ser.readline().decode(utf-8, errorsignore).strip() return resp print(send_command(ENROLL,001)) print(send_command(ENROLL,002)) print(send_command(LIST)) ser.close()需要注意的是串口时序要留足余量。指纹模块录入一次需要几秒钟上位机发送完ENROLL指令后不要立刻发下一条否则 MCU 还在处理当前状态新指令会被丢弃或覆盖。8. 资源占用与性能观察嵌入式项目不像 AI 模型那样关注显存但关注 Flash、RAM、引脚占用和实时性。8.1 Flash 与 RAM 占用编译后在 Keil 的 Build Output 窗口可以看到Program Size: Code..., RO-data..., RW-data..., ZI-data...Code RO-data 是 Flash 占用RW-data ZI-data 是 RAM 占用。STM32F103C8T6 有 64KB Flash 和 20KB RAM。如果工程编译后 Flash 占用比较大说明可能开启了 Debug 日志或未优化的库函数。建议 Release 版本开启-O2优化并关闭不必要的串口打印。8.2 引脚资源规划一套典型连接方式功能引脚说明指纹模块 TXPA3USART2_RX接模块的 TX 输出指纹模块 RXPA2USART2_TX接模块的 RX 输入OLED SCLPB6I2C1_SCL可通过 GPIO 模拟OLED SDAPB7I2C1_SDA可通过 GPIO 模拟存储芯片 WPPB12写保护控制不用时接地按键 KEY1PA0菜单/确认按键 KEY2PA1取消/返回不同的开源版本引脚定义可能不同最终以你下载的原理图和代码为准。开始焊接之前先核对每个外设的引脚是否冲突。8.3 运行电流与功耗整板功耗主要取决于指纹模块。指纹模块工作时电流可达 50-100mA 甚至更高休眠模式下会下降明显。如果你在做便携式指纹锁需要考虑增加 MOSFET 或负载开关控制指纹模块电源不识别时断电。MCU 进入STOP或STANDBY模式用按键外部中断唤醒。使用低功耗型指纹模块或增加触摸唤醒方案。实时性方面一次完整的指纹匹配耗时通常在几百毫秒到 1 秒级别取决于模块型号和库内指纹数量。外部存储芯片读写是毫秒级操作对整体流程影响不大。9. 常见问题与排查方法以下是这个项目最容易踩的坑和排查方向。问题现象可能原因排查方式解决方案编译报找不到stm32f1xx.h芯片支持包未安装打开 Pack Installer 查看安装Keil::STM32F1xx_DFP编译报大量undefined symbol标准外设库或启动文件缺失查看工程文件树重新添加 CORE 目录和 FWLib 源文件烧录时提示No target connectedST-Link 接线错误或驱动异常Options for Target - Debug - Settings检查 SWDIO/SWCLK/GND/VCC重新插拔烧录后无任何现象BOOT0 配置错误检查 BOOT0/BOOT1 电平BOOT0 接地从 Flash 启动指纹模块无响应串口 TX/RX 交叉接反用示波器/逻辑分析仪看串口波形调换 TX/RX 接线指纹模块握手失败波特率不匹配查看模块默认波特率和代码设置修改代码或模块波特率录入 3 次后总超时按压方式不对或传感器脏观察模块指示灯清洁表面调整按压位置断电后指纹丢失存储芯片初始化失败检查 I2C/SPI 接线和地址用调试器读存储芯片寄存器开启串口后系统卡死串口中断里处理时间过长在中断函数里只做接收主循环做解析使用环形缓冲区接收按键无响应GPIO 模式配置错误检查代码中的输入模式和上拉电阻改成GPIO_Mode_IPU内部上拉OLED 白屏I2C 地址错误确认模块地址是 0x3C 还是 0x3D修改 OLED 初始化地址匹配误报率高识别阈值太小查看Fingerprint_Search阈值参数调大阈值例如从 80 调为 100删除 ID 后重启仍然存在存储映射表未同步更新检查 delete 函数的存储操作逻辑确保模块操作和存储操作都成功10. 最佳实践与使用建议10.1 代码工程化建议不要直接在开源代码上改一行就烧录先把环境跑通确认原始功能正常再开始修改。建议用 Git 管理你的改动每次改完一个功能点就提交一次出错可以快速回退。如果需要在现有工程上新增功能比如加一个继电器开锁、加一个 WiFi 模块上报优先采用增加文件的方式不要把所有逻辑塞进main.c。例如新增relay.c、wifi.c在main.c中只做初始化调用和事件回调。10.2 硬件调试建议第一次上电不要直接插指纹模块。先把最小系统跑起来用 LED 闪烁程序确认 GPIO 正常再用串口打印确认 USART 正常最后接指纹模块。分步排查能大幅减少“多个问题叠加”的调试难度。示波器不是必须但逻辑分析仪很有用。抓一次指纹模块的串口波形就能确认波特率是否正确、指令是否发出、应答帧是否完整。买一个几十元的 8 通道逻辑分析仪够用。10.3 存储部分的可靠性建议外部存储芯片写操作注意时序和写周期。I2C 接口的 AT24C 系列在写操作后需要等待内部写周期如果没有延时连续写入多个字节时可能会丢数据。还要考虑异常掉电问题。指纹录入成功后在存储芯片写入过程中如果突然断电可能会留下“模块里有指纹、存储记录不完整”的半成品状态。解决办法是增加“写入校验”写入后立刻读回比较更稳妥的方案是每次写入前先备份旧记录更新完成后切换标志位。10.4 合规与授权提醒用于门禁或考勤时被录入指纹的人员需要知情同意并且系统要提供“删除指纹”的入口。开源项目默认没有云端数据只在本地硬件这是隐私保护上的优点。但如果二次开发时加了 4G/WiFi 上传功能就必须考虑数据传输加密和访问控制避免指纹数据被截获或泄露。11. 总结与下一步扩展方向这个开源项目最值得尝试的点是它把“指纹模块驱动 外部存储 业务状态机”三者串成了一套完整闭环不是零散的外设 demo而是一个能直接演示“录入 - 识别 - 存储 - 删除”全流程的小系统。对于做毕设或者刚接触 STM32 的开发者来说这是一个性价比极高的学习样板。入手后最先应该验证的功能是“录入指纹 断电重启 再次识别”。如果这条链路能跑通说明源码、原理图、存储方案和指纹模块驱动的整体匹配没有问题后续扩展才有基础。最容易踩的坑往往不在代码本身而在硬件接线和模块选型。指纹模块的 TX/RX 和 STM32 的 USART 要交叉连接供电要稳定传感器表面要保持清洁。一旦出现反复录入失败优先怀疑硬件连接而不是怀疑代码。后续可以考虑的扩展方向增加继电器模块控制电磁锁做成真正的指纹门禁。增加 ESP8266/ESP32 WiFi 模块实现远程授权、临时密码、开门日志上报。增加 RC522 刷卡模块实现“指纹 刷卡”双因子认证。更换为低功耗 STM32L 系列电池供电做成便携式指纹挂锁。增加 LCD 显示屏和中文菜单提高交互体验。指纹存储控制系统看起来很小但它涉及的底层知识几乎覆盖了整个嵌入式开发链路GPIO、中断、串口、I2C/SPI、存储器件、状态机、低功耗设计。把这一套吃透再做更复杂的物联网设备思路会顺畅很多。