用STM32F103C8T6和MFRC522模块DIY一个简易门禁系统(HAL库+串口调试)

发布时间:2026/6/9 3:18:20

用STM32F103C8T6和MFRC522模块DIY一个简易门禁系统(HAL库+串口调试) 基于STM32F103C8T6与MFRC522的智能门禁系统实战开发在创客和电子爱好者的世界里将理论知识转化为实际应用是最令人兴奋的部分。本文将带你从零开始构建一个完整的RFID门禁系统使用STM32F103C8T6作为主控搭配MFRC522模块实现卡片识别功能。不同于简单的读卡器实验我们将实现完整的门禁逻辑包括白名单验证、执行机构控制和状态反馈等功能。1. 项目规划与硬件选型1.1 系统架构设计一个完整的门禁系统需要以下几个核心组件主控制器STM32F103C8T6Blue Pill开发板RFID读卡模块MFRC522支持ISO14443A协议执行机构5V继电器模块模拟门锁控制状态指示双色LED红/绿指示验证结果调试接口USB-TTL串口模块系统工作流程如下用户刷卡时MFRC522读取卡片UIDSTM32将UID与预设白名单比对验证通过则触发继电器并亮绿灯验证失败则亮红灯并通过串口输出警告1.2 硬件连接指南STM32引脚连接目标备注PB13MFRC522 SCKSPI时钟PB14MFRC522 MISOSPI主机输入PB15MFRC522 MOSISPI主机输出PB8MFRC522 SDA片选信号PB9MFRC522 RST复位信号PA0继电器控制输出高低电平PA1LED_RED红色指示灯PA2LED_GREEN绿色指示灯PA9/PA10USB-TTL串口调试提示继电器模块建议使用光耦隔离型避免电磁干扰影响系统稳定性。MFRC522模块需要3.3V供电切勿接错电压。2. 开发环境配置2.1 软件工具准备开发本系统需要以下软件工具STM32CubeMX用于初始化代码生成Keil MDK-ARM主要开发IDE串口调试助手如Putty或Tera TermST-Link Utility程序烧录工具安装时需注意版本兼容性# 推荐版本组合 STM32CubeMX v6.5.0 Keil MDK v5.32 ST-Link Utility v4.5.02.2 CubeMX工程配置关键配置步骤如下选择STM32F103C8T6芯片启用外部高速时钟(HSE)配置系统时钟树为72MHz启用SPI2接口全双工主模式配置USART1为异步模式(115200-8-N-1)设置GPIO引脚模式PA0GPIO_Output继电器控制PA1/PA2GPIO_OutputLED控制生成代码前务必检查以下参数// 确认SPI配置 hspi2.Instance SPI2; hspi2.Init.Mode SPI_MODE_MASTER; hspi2.Init.Direction SPI_DIRECTION_2LINES; hspi2.Init.DataSize SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity SPI_POLARITY_LOW; hspi2.Init.CLKPhase SPI_PHASE_1EDGE; hspi2.Init.NSS SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; hspi2.Init.FirstBit SPI_FIRSTBIT_MSB;3. RFID驱动开发与优化3.1 MFRC522底层驱动实现创建rc522.c和rc522.h文件实现以下核心功能// rc522.h 关键定义 #define MAX_UID_LEN 5 #define WHITELIST_SIZE 10 typedef struct { uint8_t uid[MAX_UID_LEN]; char user_name[20]; } UserCard; extern UserCard whiteList[WHITELIST_SIZE]; extern uint8_t currentUID[MAX_UID_LEN]; void RC522_Init(void); uint8_t PCD_Authenticate(uint8_t authType, uint8_t blockAddr, uint8_t* sectorKey); uint8_t PCD_ReadCardUID(uint8_t* uid); uint8_t CheckWhiteList(uint8_t* uid); void ControlDoor(uint8_t state);驱动实现要点SPI通信时序严格遵循MFRC522规格书添加防冲突处理机制实现自动天线增益调节增加读卡超时保护3.2 白名单管理系统在main.c中实现白名单管理UserCard whiteList[WHITELIST_SIZE] { {{0x12, 0x34, 0x56, 0x78}, 管理员卡}, {{0x9A, 0xBC, 0xDE, 0xF0}, 员工A}, // 可继续添加其他授权卡 }; uint8_t CheckWhiteList(uint8_t* uid) { for(int i0; iWHITELIST_SIZE; i) { if(memcmp(uid, whiteList[i].uid, 4) 0) { return i1; // 返回非零表示找到 } } return 0; // 未找到 }注意实际应用中应考虑将白名单存储在EEPROM或外部Flash中支持动态添加/删除卡片。4. 系统集成与功能实现4.1 主控制逻辑开发在main.c中实现主循环逻辑int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI2_Init(); MX_USART1_UART_Init(); RC522_Init(); printf(门禁系统启动完成\r\n); while (1) { if(PCD_ReadCardUID(currentUID) MI_OK) { uint8_t userIndex CheckWhiteList(currentUID); if(userIndex) { printf(欢迎 %s\r\n, whiteList[userIndex-1].user_name); ControlDoor(DOOR_OPEN); HAL_Delay(3000); // 保持开门状态3秒 ControlDoor(DOOR_CLOSE); } else { printf(未授权卡拒绝访问\r\n); HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET); HAL_Delay(1000); HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET); } } HAL_Delay(100); } }4.2 执行机构控制门锁控制函数实现void ControlDoor(uint8_t state) { if(state DOOR_OPEN) { HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET); } }5. 系统优化与扩展5.1 抗干扰设计改进实际部署中可能遇到的问题及解决方案读卡距离不稳定调整天线匹配电路通常修改R7电阻优化PCD_AntennaOn()函数中的发射功率设置void PCD_AntennaOn(void) { uint8_t value ReadRawRC(TxControlReg); if((value 0x03) ! 0x03) { WriteRawRC(TxControlReg, value | 0x03); } WriteRawRC(RFCfgReg, 0x7F); // 最大增益 }多卡冲突实现PICC_Halt命令强制卡片休眠增加防冲突重试机制5.2 功能扩展建议数据记录功能添加SD卡模块记录刷卡事件实现时间戳记录需RTC模块支持无线联网功能通过ESP8266实现远程监控手机APP接收门禁事件通知生物识别集成结合指纹模块实现多因素认证人脸识别摄像头联动# 示例简单的Python串口监控脚本 import serial from datetime import datetime ser serial.Serial(COM3, 115200, timeout1) while True: line ser.readline().decode().strip() if line: print(f[{datetime.now()}] {line}) # 这里可以添加邮件/短信通知逻辑6. 常见问题排查开发过程中可能遇到的典型问题及解决方法问题现象可能原因解决方案无法读取卡片SPI通信失败检查接线确认CS引脚控制正确读卡距离短天线匹配不良调整匹配电路中的电阻/电容系统频繁重启电源不足使用独立电源供电避免USB供电不足继电器不动作驱动电流不足增加晶体管驱动电路串口输出乱码波特率不匹配检查双方波特率设置是否一致调试技巧使用逻辑分析仪抓取SPI波形分模块验证先确保单独读卡正常添加详细的调试日志输出利用STM32的硬件错误中断定位崩溃点7. 安全增强措施工业级门禁系统应考虑以下安全防护卡片数据加密实现Mifare Classic的Crypto1加密验证防重放攻击每次验证使用不同的随机数挑战防拆机保护增加机箱打开检测传感器固件保护启用STM32的读保护功能(FLASH_ReadOutProtection)关键安全代码示例uint8_t AuthenticateCard(uint8_t blockAddr) { uint8_t key[6] {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 默认密钥 uint8_t random[16]; GenerateRandom(random, 16); // 生成随机数 // 第一次认证 if(PCD_Authenticate(PICC_AUTHENT1A, blockAddr, key) ! MI_OK) { return 0; } // 随机数挑战响应 if(CryptoChallengeResponse(random) ! MI_OK) { return 0; } return 1; }8. 生产部署建议当项目从原型转向实际应用时PCB设计优化将开发板方案转为定制PCB增加电源滤波电路优化天线布局外壳选择使用金属外壳屏蔽干扰考虑防水防尘设计IP等级安装注意事项读卡器与金属门框保持适当距离避免高温高湿环境做好线缆防护维护计划定期检查继电器触点状态清洁读卡器表面备份白名单数据实际部署中发现读卡器安装角度对性能影响很大。经验表明与地面呈15-30度倾斜角时用户体验最佳既方便刷卡又不易积累灰尘。

相关新闻