一、项目全景与开发环境搭建
大家好,我是你们的嵌入式讲师。今天咱们正式开始《门禁系统嵌入式开发全流程实战》的第一课。
说实话,门禁系统这个项目,我做了不下十次。从最早的简单刷卡开门,到后来带指纹、人脸识别的复杂系统。但万变不离其宗,核心逻辑其实都一样。今天咱们就从零开始,把整个项目拆开揉碎了讲。
1.1 门禁系统功能需求分析
先聊聊需求。你想想看,一个门禁系统,最核心的功能是什么?
- 身份验证:刷卡、输密码,确认你是不是合法用户
- 门锁控制:验证通过后,电磁锁得能打开
- 状态反馈:开锁成功还是失败,得让用户知道
- 异常处理:比如连续输错密码,得报警或者锁定
我个人习惯,在动手写代码之前,先把功能列表列清楚。这样后面才不会乱。
核心功能清单:
- RFID刷卡识别(支持M1卡)
- 4x4键盘密码输入
- 电磁锁控制(继电器驱动)
- OLED显示状态信息
- 蜂鸣器提示音
- 管理员模式(添加/删除卡片)
1.2 硬件选型详解
硬件选型这块,我踩过不少坑。咱们直接说结论。
| 模块 | 型号 | 选型理由 |
|---|---|---|
| 主控MCU | STM32F103C8T6 | 性价比高,资料多,适合入门 |
| RFID模块 | RC522 | 支持SPI通信,稳定可靠 |
| 电磁锁 | 12V单门磁力锁 | 断电开锁,安全考虑 |
| 键盘 | 4x4矩阵键盘 | 节省IO口,成本低 |
| 显示 | 0.96寸OLED | I2C接口,显示清晰 |
嗯,这里要注意一点。电磁锁的驱动电流比较大,不能直接用STM32的IO口驱动。我建议加一个继电器模块做隔离。曾经有一次我偷懒,直接驱动,结果烧了一个IO口...从那以后,隔离电路我从来不敢省。
1.3 软件架构设计
软件架构这块,说白了就是怎么组织你的代码。我习惯用分层设计。
我的分层思路:
- 硬件抽象层(HAL):封装GPIO、SPI、I2C等底层操作
- 驱动层:RC522驱动、OLED驱动、键盘驱动
- 业务逻辑层:刷卡验证、密码比对、开锁控制
- 应用层:状态机管理、用户交互
为什么要分层?你想想看,如果哪天你想把RC522换成PN532,只需要改驱动层,业务逻辑完全不用动。这就是分层的好处。
1.4 Keil MDK与STM32CubeMX环境搭建
环境搭建这块,我直接说步骤。跟着做就行。
第一步:安装Keil MDK
去官网下载MDK-ARM,安装时记得勾选STM32F1系列的器件包。我记得有一次安装完发现找不到芯片,折腾了半天才发现是器件包没装。
第二步:安装STM32CubeMX
这个工具用来生成初始化代码。配置时钟、GPIO、外设,非常方便。
第三步:创建工程
打开CubeMX,选择STM32F103C8T6。配置如下:
// 时钟配置
HSE: 8MHz外部晶振
SYSCLK: 72MHz
APB1: 36MHz
APB2: 72MHz
// 外设配置
SPI1: 用于RC522
I2C1: 用于OLED
GPIO: 键盘矩阵、继电器、蜂鸣器
避坑指南:
我曾经在配置SPI时钟极性时搞反了,导致RC522死活读不到数据。后来用逻辑分析仪一看,才发现时钟相位不对。所以建议大家配置完后,先用示波器或者逻辑分析仪确认一下波形。
第四步:生成代码并导入Keil
在CubeMX中点击生成代码,然后打开Keil工程。编译一下,确保没有错误。
1.5 小结
好了,第一节课的内容就到这里。咱们把项目需求理清了,硬件选型确定了,软件架构搭好了,开发环境也配好了。下一节课,咱们就开始写代码,先从RC522的驱动开始。
记住一句话:好的开始是成功的一半。环境搭建这一步,千万别着急。慢慢来,把每一步都走稳了,后面写代码才会顺手。
有什么问题,欢迎在评论区留言。咱们下节课见。