
简介这是一套面向计算机、电子信息、自动化等专业学生与嵌入式开发者的STM32智能门禁系统完整项目资料可作为毕业设计、课程设计或大作业的参考方案也适合初学者进阶学习。项目集成人脸识别、RFID刷卡、蓝牙App远程控制与密码锁四种开锁方式覆盖嵌入式开发中传感器驱动、通信协议与上位机交互等核心知识点。压缩包共255个文件约8.67MB以C语言源文件与头文件为主体配合Keil工程文件、编译中间产物及烧录脚本结构完整、层次清晰便于按模块阅读与二次开发。目前已有217人学习下载。该资源附带详细文档与全部资料代码经过实际测试运行功能验证通过并获导师认可、答辩评审95分读者可据此快速理解门禁系统的整体架构与实现思路在此基础上修改扩展其他功能或直接用于毕设、课设与项目立项演示。1. 从一把钥匙到四重认证STM32智能门禁系统到底在解决什么问题去年帮一个做园区改造的朋友评估门禁方案他开口就问“能不能刷脸进门同时保留刷卡手机还能远程开”我当时第一反应是——这不就是典型的STM32智能门禁系统需求吗人脸识别负责无感通行RFID管员工卡蓝牙app给访客临时授权密码锁兜底。四套认证方式跑在一颗MCU上听起来像堆料实际上每个模块都有明确的场景分工。这套方案适合谁做毕设的学生、想快速搭原型的嵌入式工程师、需要低成本门禁改造的集成商。它不追求工业级可靠性但能把人脸识别、RFID读卡、蓝牙通信、密码验证四条链路完整跑通源码和文档齐全的情况下两三天就能看到实物效果。核心难点不在单个模块而在于资源调度和状态机设计——这也是后面要重点拆的部分。2. 四重认证的硬件选型与资源分配为什么不是堆得越多越好2.1 主控选型STM32F103还是F407差别不在主频常见做法是选STM32F103ZET6或STM32F407ZGT6。F103主频72MHzSRAM 64KB跑人脸识别会非常吃力F407主频168MHzSRAM 192KB带FPU和DSP指令做人脸检测和特征提取时帧率能到5-8fps勉强可用。如果标题里强调“人脸识别”是核心功能我一般会直接上F407别在F103上浪费时间。Flash方面F407ZGT6有1MB放人脸模型和字库够用F103ZET6只有512KB裁剪模型后也紧张。资源分配上人脸识别占大头摄像头DCMI接口DMA帧缓冲至少需要320x240x2字节≈150KBF407的192KB SRAM刚好卡住。RFID用SPI接口的RC522或MFRC522模块占用一个SPI和一根IRQ线。蓝牙用HC-05或JDY-31走USART波特率一般9600或115200。密码锁用矩阵键盘或触摸屏软键盘如果配了ILI9341液晶屏可以省掉独立键盘。这里有个热词叫“stm32使用ili9341读id是a1a1”说明很多人用ILI9341做显示读ID返回0xA1A1是正常现象不用慌。提示如果SRAM不够可以把人脸检测的帧缓冲降到160x120识别距离缩短到30-50cm但误识率会上升。2.2 人脸识别模块EasyAI还是ArcFace离线方案怎么选标题里没指定人脸识别方案但热词里出现了“easyai人脸识别”和“arcface人脸识别”。EasyAI通常是国内一些厂商封装的离线人脸识别模块串口输出结果STM32只负责发指令和收结果不跑算法。ArcFace是虹软的人脸识别SDK需要跑在带操作系统的平台或高性能MCU上STM32F407跑ArcFace比较吃力一般用F429或H7系列。我一般会分两条路如果只是做毕设或演示用串口人脸识别模块最省事STM32通过UART发“识别”指令模块返回人脸IDSTM32再控制继电器开门。如果非要自己跑算法可以用STM32Cube.AI把轻量级人脸检测模型部署到F407上但识别率有限需要自己采集数据集训练。常见做法是OV2640摄像头DCMIDMA图像二值化后做简单特征匹配但这不是真正的人脸识别只能算“人脸检测模板比对”。// 串口人脸识别模块通信示例STM32 HAL库 uint8_t face_cmd[4] {0xEF, 0x01, 0xFF, 0xFF}; // 识别指令 uint8_t face_resp[8]; HAL_UART_Transmit(huart2, face_cmd, 4, 100); HAL_UART_Receive(huart2, face_resp, 8, 500); if (face_resp[0] 0xEF face_resp[1] 0x01) { uint16_t face_id (face_resp[2] 8) | face_resp[3]; if (face_id 0 face_id 100) { open_door(); // 识别成功开门 } }这段代码的逻辑是STM32通过UART2发送固定格式的识别指令模块返回8字节响应前两字节是帧头接着两字节是人脸ID。参数说明波特率通常为115200超时500ms如果超时未响应需要重发或报错。注意人脸模块的供电要独立不要和STM32共用LDO否则识别瞬间电流波动会导致MCU复位。2.3 RFID与蓝牙appRC522和HC-05的共存问题RC522走SPIHC-05走USART硬件上不冲突但软件上要注意中断优先级。RC522的中断引脚接到STM32的EXTI蓝牙数据接收用UART空闲中断DMA。如果两个中断同时触发RFID刷卡响应会被蓝牙数据打断导致刷卡失败。我一般把RFID中断优先级设得比UART高因为刷卡是即时操作蓝牙数据可以缓冲。蓝牙app这边热词里有“蓝牙app控制esp32”但STM32方案类似。手机端用MIT App Inventor或Android Studio写一个简单app发送“OPEN”字符串STM32收到后驱动继电器。注意HC-05默认波特率是9600而人脸模块常用115200如果共用UART要分时复用或改用双UART。// 蓝牙开门指令解析UART空闲中断 void USART1_IRQHandler(void) { if (__HAL_UART_GET_FLAG(huart1, UART_FLAG_IDLE)) { __HAL_UART_CLEAR_IDLEFLAG(huart1); HAL_UART_DMAStop(huart1); uint8_t len BUFFER_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx); if (len 4 strncmp((char*)rx_buf, OPEN, 4) 0) { open_door(); } HAL_UART_Receive_DMA(huart1, rx_buf, BUFFER_SIZE); } }逻辑说明利用UART空闲中断判断一帧数据接收完成DMA停止后计算接收长度比较是否为“OPEN”。参数BUFFER_SIZE设为64DMA循环模式空闲中断触发后重新启动DMA接收。注意字符串比较要用strncmp并指定长度防止缓冲区溢出。3. 从零搭建工程CubeMX配置、外设初始化与主循环框架3.1 CubeMX关键配置时钟树、DMA和中断优先级用STM32CubeMX生成工程时时钟树要把HCLK设到最大F407是168MHzAPB1和APB2分频要匹配外设时钟。DCMI接口需要DMA双缓冲SPI1给RC522USART1给蓝牙USART2给人脸模块USART3留作调试串口。中断优先级分组设为NVIC_PRIORITYGROUP_4抢占优先级和子优先级按以下分配外设抢占优先级子优先级说明DCMI DMA00图像采集不能丢帧RFID EXTI10刷卡响应要快UART1空闲20蓝牙数据可缓冲UART2接收30人脸模块响应慢定时器40系统时基注意如果用了FreeRTOS中断优先级要符合configMAX_SYSCALL_INTERRUPT_PRIORITY限制否则会触发硬件错误。3.2 主循环状态机四重认证怎么调度不打架主循环不要用delay用状态机轮询。我一般定义几个状态IDLE、FACE_SCAN、RFID_WAIT、BLUETOOTH_WAIT、PASSWORD_INPUT、DOOR_OPEN。每个状态停留时间有限比如FACE_SCAN持续2秒无结果就回到IDLERFID_WAIT等待中断触发。密码输入用矩阵键盘扫描消抖用定时器。typedef enum { IDLE, FACE_SCAN, RFID_WAIT, BT_WAIT, PWD_INPUT, DOOR_OPEN } sys_state_t; sys_state_t state IDLE; uint32_t state_tick 0; while (1) { switch (state) { case IDLE: if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) GPIO_PIN_RESET) { state PWD_INPUT; // 按键触发密码输入 } else if (face_detected()) { state FACE_SCAN; } break; case FACE_SCAN: if (face_recognize() SUCCESS) { state DOOR_OPEN; } else if (HAL_GetTick() - state_tick 2000) { state IDLE; } break; case DOOR_OPEN: open_door(); HAL_Delay(3000); // 开门保持3秒 close_door(); state IDLE; break; // 其他状态类似 } HAL_Delay(10); // 降低CPU占用 }逻辑说明状态机每10ms轮询一次避免阻塞。参数开门保持时间3000ms可调人脸扫描超时2000ms。注意HAL_Delay在中断中不能用主循环里可以。3.3 源码组织与文档结构怎么让“全部资料”真的能用标题里说“源码详细文档全部资料”实际拿到手往往是一堆散文件。我一般按以下结构整理Core/CubeMX生成的初始化代码Drivers/HAL库和自定义驱动rc522.c、face.c、bluetooth.cApp/状态机、密码管理、日志Doc/原理图PDF、PCB截图、模块接线表、常见问题Tools/蓝牙app源码、人脸模块配置工具文档里必须有一张接线表标明每个模块的引脚和电源。比如RC522的SDA接PA4SCK接PA5MOSI接PA7MISO接PA6RST接PB0。人脸模块TX接PA3RX接PA2。蓝牙TX接PA10RX接PA9。这些不写清楚复现时必翻车。4. 避坑与排查RFID读卡失败、人脸误识、蓝牙断连的现场记录4.1 RFID刷卡没反应串口却打印正常现象RC522模块绿灯亮但刷卡时STM32收不到中断串口调试打印“RFID init ok”。原因RC522的天线匹配电路没调好或者SPI速率太高。解决把SPI时钟降到1MHz以下检查天线线圈焊接用示波器看MISO是否有波形。另外RC522的IRQ引脚默认是高电平刷卡时拉低如果配置成上升沿触发就永远等不到。4.2 人脸识别距离短稍微远一点就失败现象人脸模块在20cm内能识别超过30cm就报错。原因摄像头镜头焦距固定或者补光不足。解决换用带红外补光的模块或者把识别距离参数调大如果模块支持。如果是自己跑算法把图像分辨率从320x240降到160x120帧率提高但识别距离不会变远反而更近。常见做法是加超声波测距辅助热词里有“stm32超声波测距”当人体靠近到50cm内再启动人脸识别省电且提高成功率。4.3 蓝牙app发送指令后门不开但串口助手可以现象用串口助手发“OPEN”能开门用手机app发同样的字符串没反应。原因app发送时带了回车换行符\r\nSTM32比较时多了两个字节。解决在STM32端用strstr查找“OPEN”而不是strncmp或者app端去掉换行。另外HC-05的波特率可能被误设为38400而STM32初始化是9600导致乱码。4.4 密码输入正确但继电器不吸合现象矩阵键盘输入密码后串口打印“password ok”但继电器没动作。原因继电器驱动三极管基极电阻太大或者继电器线圈电压不够。解决用万用表测继电器线圈两端电压如果是3.3V驱动5V继电器需要加电平转换。另外STM32的GPIO输出电流最大25mA驱动继电器要加三极管或光耦。4.5 系统运行几分钟后死机看门狗复位现象门禁系统跑几分钟后无响应看门狗复位后恢复。原因DCMI DMA和UART DMA共用内存区域或者堆栈溢出。解决检查DMA缓冲区是否对齐把人脸识别的帧缓冲放到CCM RAMF407有64KB CCM不占用主SRAM。堆栈大小在启动文件里改默认0x400不够改成0x800。5. 进阶技巧用FreeRTOS重构状态机与低功耗优化如果你已经跑通了裸机版本下一步可以上FreeRTOS。热词里有“freertos stm32物联网网关”门禁系统其实就是一个微型网关。把四个认证模块拆成独立任务FaceTask、RFIDTask、BTTask、PwdTask用队列传递事件互斥量保护继电器。任务优先级FaceTask最高因为图像处理耗时RFIDTask次之BTTask和PwdTask最低。这样刷卡时不会被人脸识别阻塞。// FreeRTOS任务创建示例 xTaskCreate(FaceTask, Face, 512, NULL, 4, NULL); xTaskCreate(RFIDTask, RFID, 256, NULL, 3, NULL); xTaskCreate(BTTask, BT, 256, NULL, 2, NULL); xTaskCreate(PwdTask, Pwd, 256, NULL, 1, NULL); vTaskStartScheduler();参数说明FaceTask堆栈512字因为要跑图像处理其他任务256字够用。优先级4最高1最低。注意FreeRTOS的堆空间在FreeRTOSConfig.h里配置默认heap_4总大小15KB左右F407够用。低功耗优化如果门禁系统用电池供电可以在IDLE状态调用__WFI()进入睡眠RFID中断或按键中断唤醒。人脸识别模块平时断电用MOS管控制电源需要时再上电。实测待机电流可以从80mA降到15mA。验证方法用逻辑分析仪抓SPI和UART波形确认时序符合模块手册。用J-Link调试时热词里有“stm32禁用jtag”如果PA13/PA14/PA15被占用要在CubeMX里把调试口改成SWD释放JTAG引脚。最后别迷信“全部资料”拿到源码先编译看报错再对照文档改引脚定义。我习惯在项目根目录放一个pinmap.md每次改硬件先更新这个文件省得后面自己都忘了。希望帮到你。本文还有配套的精品资源点击获取