当前位置: 首页 > article >正文

给STM32密码锁加个“记忆”:手把手教你用CubeMX配置I2C读写EEPROM(AT24C02)

为STM32密码锁赋予持久记忆CubeMX驱动AT24C02 EEPROM全攻略当你的密码锁在断电后依然能记住最后一次设置的密码这种记忆能力往往能大幅提升用户体验。本文将带你深入探索如何通过I2C总线连接AT24C02 EEPROM芯片为基于STM32F103C8T6的密码锁系统添加数据持久化功能。1. 硬件架构设计与CubeMX基础配置在开始编码之前我们需要先理清硬件连接关系。AT24C02作为I2C接口的EEPROM芯片与STM32的连接仅需四条线SCL时钟线PB6SDA数据线PB7VCC3.3V电源GND共地连接注意AT24C02的A0-A2地址引脚通常接地这样其I2C设备地址为0xA0写入和0xA1读取。在CubeMX中的配置步骤如下打开I2C1外设假设使用PB6/PB7引脚配置为标准模式100kHz或快速模式400kHz启用I2C中断可选用于事件处理生成代码前确认GPIO模式为开漏输出I2C标准要求// CubeMX生成的I2C初始化代码示例 hi2c1.Instance I2C1; hi2c1.Init.ClockSpeed 100000; hi2c1.Init.DutyCycle I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 0; hi2c1.Init.AddressingMode I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 0; hi2c1.Init.GeneralCallMode I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode I2C_NOSTRETCH_DISABLE;2. EEPROM读写底层驱动实现AT24C02的读写操作需要严格遵守其时序要求。我们先实现几个基础函数2.1 单字节写入HAL_StatusTypeDef EEPROM_WriteByte(uint16_t addr, uint8_t data) { uint8_t buffer[2]; buffer[0] addr 8; // 高地址字节 buffer[1] addr 0xFF; // 低地址字节 HAL_StatusTypeDef status HAL_I2C_Mem_Write(hi2c1, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, data, 1, 100); HAL_Delay(5); // 等待写入完成 return status; }2.2 页写入操作AT24C02支持页写入每页8字节可显著提高写入效率#define EEPROM_PAGE_SIZE 8 HAL_StatusTypeDef EEPROM_WritePage(uint16_t addr, uint8_t *data, uint8_t len) { if(len EEPROM_PAGE_SIZE) return HAL_ERROR; uint8_t buffer[EEPROM_PAGE_SIZE 2]; buffer[0] addr 8; buffer[1] addr 0xFF; memcpy(buffer[2], data, len); return HAL_I2C_Master_Transmit(hi2c1, 0xA0, buffer, len2, 100); }2.3 随机读取实现HAL_StatusTypeDef EEPROM_ReadByte(uint16_t addr, uint8_t *data) { return HAL_I2C_Mem_Read(hi2c1, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, data, 1, 100); }3. 密码存储数据结构设计合理的存储结构设计是系统可靠性的关键。我们采用以下方案地址范围存储内容大小说明0x00-0x0F主密码16B用户设置的解锁密码0x10-0x1F临时密码16B临时授权密码0x20尝试次数计数器1B剩余尝试次数0x21锁定状态标志1B0-未锁定1-锁定0x22-0x3F保留区域30B未来扩展使用对应的操作函数实现#define PWD_MAIN_ADDR 0x00 #define PWD_TEMP_ADDR 0x10 #define TRY_COUNT_ADDR 0x20 #define LOCK_FLAG_ADDR 0x21 void SavePassword(uint8_t *pwd, uint8_t is_temp) { uint16_t addr is_temp ? PWD_TEMP_ADDR : PWD_MAIN_ADDR; EEPROM_WritePage(addr, pwd, 16); } uint8_t VerifyPassword(uint8_t *input, uint8_t is_temp) { uint8_t stored[16]; uint16_t addr is_temp ? PWD_TEMP_ADDR : PWD_MAIN_ADDR; for(int i0; i16; i) { EEPROM_ReadByte(addri, stored[i]); } return memcmp(input, stored, 16) 0; }4. 系统集成与异常处理将EEPROM功能整合到现有密码锁系统中时需要注意几个关键点4.1 初始化流程优化上电后读取EEPROM中的尝试次数和锁定状态如果尝试次数为0则进入锁定状态显示系统状态通过OLED等待用户输入void System_Init() { uint8_t try_count, is_locked; EEPROM_ReadByte(TRY_COUNT_ADDR, try_count); EEPROM_ReadByte(LOCK_FLAG_ADDR, is_locked); if(try_count 0) { is_locked 1; EEPROM_WriteByte(LOCK_FLAG_ADDR, 1); OLED_ShowString(0, 0, System Locked!, 16); } else { OLED_ShowString(0, 0, Enter Password:, 16); } }4.2 错误处理机制写入验证重要数据写入后应立即读取验证超时处理I2C通信需添加超时检测掉电保护关键操作期间应禁止中断uint8_t SafeWrite(uint16_t addr, uint8_t *data, uint8_t len) { uint8_t verify[len]; if(EEPROM_WritePage(addr, data, len) ! HAL_OK) return 0; HAL_Delay(10); for(int i0; ilen; i) { EEPROM_ReadByte(addri, verify[i]); if(verify[i] ! data[i]) return 0; } return 1; }5. 高级功能扩展基于EEPROM的存储能力我们可以实现更多实用功能5.1 多用户密码管理#define USER_MAX 5 #define USER_SIZE 20 // 16B密码 4B信息 void AddUser(uint8_t id, uint8_t *pwd, uint8_t *info) { uint16_t addr 0x40 id * USER_SIZE; uint8_t buffer[USER_SIZE]; memcpy(buffer, pwd, 16); memcpy(buffer16, info, 4); SafeWrite(addr, buffer, USER_SIZE); }5.2 操作日志记录利用EEPROM的剩余空间记录操作事件日志条目格式字节说明时间戳4Unix时间戳事件类型10-解锁1-锁定等用户ID1操作用户标识void LogEvent(uint8_t event, uint8_t user_id) { static uint16_t log_ptr 0x100; uint8_t log_entry[6]; uint32_t timestamp HAL_GetTick(); memcpy(log_entry, timestamp, 4); log_entry[4] event; log_entry[5] user_id; SafeWrite(log_ptr, log_entry, 6); log_ptr 6; if(log_ptr 0x1FF) log_ptr 0x100; // 循环写入 }6. 性能优化技巧写延迟处理AT24C02每次写入需要5ms批量操作时需合理安排时序页写入优化尽量使用页写入而非单字节写入缓存机制频繁读取的数据可在RAM中缓存磨损均衡对频繁修改的数据采用地址轮换策略uint8_t read_cache[16]; uint8_t cache_valid 0; void GetPassword(uint8_t *buf, uint8_t is_temp) { if(!cache_valid) { uint16_t addr is_temp ? PWD_TEMP_ADDR : PWD_MAIN_ADDR; for(int i0; i16; i) { EEPROM_ReadByte(addri, read_cache[i]); } cache_valid 1; } memcpy(buf, read_cache, 16); }在实际项目中我发现AT24C02的页写入功能如果跨越物理页边界每256字节会导致数据错位。解决方法是写入前检查地址是否跨页必要时拆分为多次写入操作。

相关文章:

给STM32密码锁加个“记忆”:手把手教你用CubeMX配置I2C读写EEPROM(AT24C02)

为STM32密码锁赋予持久记忆:CubeMX驱动AT24C02 EEPROM全攻略 当你的密码锁在断电后依然能记住最后一次设置的密码,这种"记忆"能力往往能大幅提升用户体验。本文将带你深入探索如何通过I2C总线连接AT24C02 EEPROM芯片,为基于STM32F1…...

手动侧开门款屏蔽箱 适用蓝牙 WIFI测试 无线测试屏蔽箱GX-5950A

GX-5950A屏蔽箱品名:屏蔽箱型号:GX-5950A一、主要功能及适用范围:1 该屏蔽箱适用于无线通讯测试、1 EMI测试、1 耦合测试、1 RF功能测试。适用于手机,平板计算机,蓝牙,wi-fi,天线等测试&#…...

纹理识别必备!5个高质量数据集下载与使用指南(附避坑技巧)

纹理识别实战指南:五大高价值数据集深度解析与应用技巧 纹理识别作为计算机视觉领域的重要分支,在工业质检、自动驾驶、医疗影像等场景中发挥着关键作用。但许多开发者在数据集获取和预处理阶段就会遇到各种"暗坑"——从下载链接失效到标注格式…...

LiuJuan Z-Image Generator真实案例:为独立音乐人生成专辑封面人像全流程

LiuJuan Z-Image Generator真实案例:为独立音乐人生成专辑封面人像全流程 最近,一位独立音乐人朋友找到我,说他想为自己的新专辑设计一个封面。预算有限,请不起专业画师,但又不想要那些千篇一律的模板。他想要一张能体…...

收藏!小白程序员必看:轻松掌握大模型核心技术,解决领域与时间限制难题!

通用大模型的两个硬伤——领域限制(不知道企业内部数据)和时间限制(无法获取最新信息)。 产品设计的第一步,不是写提示词,是厘清"模型不知道什么"。这与传统软件开发思维完全不同——传统软件是&…...

LeetCode 102. Binary Tree Level Order Traversal 题解

LeetCode 102. Binary Tree Level Order Traversal 题解 题目描述 给你二叉树的根节点 root,返回其节点值的 层序遍历。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输…...

LeetCode 98. Validate Binary Search Tree 题解

LeetCode 98. Validate Binary Search Tree 题解 题目描述 给你一个二叉树的根节点 root,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子…...

W5500 TCP客户端实战:从寄存器配置到网络调试助手,手把手打通第一个连接

W5500 TCP客户端开发实战:从硬件连接到数据交互的全流程解析 第一次接触W5500芯片时,我盯着数据手册里密密麻麻的寄存器描述发呆了半小时——网关地址、子网掩码、Socket模式...这些概念对嵌入式开发者来说既熟悉又陌生。本文将带你用最直观的方式理解W…...

完整指南:在浏览器中创建惊艳WebGL流体模拟效果的5个关键技巧

完整指南:在浏览器中创建惊艳WebGL流体模拟效果的5个关键技巧 【免费下载链接】WebGL-Fluid-Simulation Play with fluids in your browser (works even on mobile) 项目地址: https://gitcode.com/gh_mirrors/web/WebGL-Fluid-Simulation 想要在浏览器中体验…...

暗黑破坏神2存档编辑器的创意实验:开启你的游戏世界无限可能

暗黑破坏神2存档编辑器的创意实验:开启你的游戏世界无限可能 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾想过在暗黑破坏神2的世界里创造属于自己的传奇?当传统的游戏进程无法满足你的创意需求…...

零基础玩转BEYOND REALITY Z-Image:手把手教你搭建高精度文生图引擎

零基础玩转BEYOND REALITY Z-Image:手把手教你搭建高精度文生图引擎 1. 引言:为什么选择BEYOND REALITY Z-Image 在当今AI图像生成领域,BEYOND REALITY Z-Image以其卓越的写实表现力脱颖而出。这款基于Z-Image-Turbo底座和BEYOND REALITY S…...

Qwen-Image-2512-Pixel-Art-LoRA 模型v1.0 传统艺术数字化:将油画、素描转化为像素风数字藏品

Qwen-Image-2512-Pixel-Art-LoRA 模型v1.0:当古典艺术遇见像素方块 最近在数字艺术圈里,有个话题挺有意思:怎么把那些挂在博物馆里的古典油画、素描,变成年轻人也爱玩的像素风数字藏品?听起来像是把交响乐改编成8-bit…...

BilibiliDown视频下载全攻略:从效率瓶颈到批量管理的进阶之路

BilibiliDown视频下载全攻略:从效率瓶颈到批量管理的进阶之路 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mi…...

CentOS8网络管理大变革:从network.service到NetworkManager的全面解析

CentOS8网络管理架构深度解析:从传统命令到NetworkManager的进化之路 如果你是一位长期使用CentOS的系统管理员,最近升级到CentOS8后可能会遇到一个令人困惑的问题:当你习惯性地输入systemctl restart network命令时,系统却无情地…...

基于深度学习的CT肺部分割技术:在医学影像分析中实现95% Dice系数的精准自动化方案

基于深度学习的CT肺部分割技术:在医学影像分析中实现95% Dice系数的精准自动化方案 【免费下载链接】lungmask Automated lung segmentation in CT 项目地址: https://gitcode.com/gh_mirrors/lu/lungmask 在医学影像分析领域,CT肺部分割一直是临…...

避开这些坑!海康威视嵌入式HR面常见‘送命题’与应答策略(附真实案例)

海康威视嵌入式HR面试避坑指南:6类高频"送命题"拆解与实战话术 在技术岗位的招聘流程中,HR面试往往是最容易被轻视却暗藏最多陷阱的环节。许多嵌入式开发者在技术面表现出色,却在看似轻松的HR面中意外折戟。通过对海康威视近三年嵌…...

5分钟上手:在浏览器中创造惊艳的流体艺术特效

5分钟上手:在浏览器中创造惊艳的流体艺术特效 【免费下载链接】WebGL-Fluid-Simulation Play with fluids in your browser (works even on mobile) 项目地址: https://gitcode.com/gh_mirrors/web/WebGL-Fluid-Simulation 想要在浏览器中体验令人惊叹的流体…...

实时口罩检测-通用部署教程:Windows WSL2环境下ModelScope模型本地加载

实时口罩检测-通用部署教程:Windows WSL2环境下ModelScope模型本地加载 1. 环境准备与WSL2配置 1.1 WSL2安装与设置 如果你使用的是Windows系统,首先需要安装WSL2(Windows Subsystem for Linux 2)。这是微软提供的Linux兼容层&…...

Xilinx UltraScale GT收发器实战:从时钟配置到8B/10B编码的避坑指南

Xilinx UltraScale GT收发器实战:从时钟配置到8B/10B编码的避坑指南 在高速数字系统设计中,Xilinx UltraScale系列FPGA的GT收发器是实现多Gbps数据通信的核心组件。然而,许多工程师在实际部署时会遇到时钟配置混乱、弹性缓冲区溢出等棘手问题…...

告别混乱标注!手把手教你定制LabelImg的标注框颜色与样式(附打包exe完整流程)

视觉标注效率革命:LabelImg高级定制与团队部署实战指南 在计算机视觉项目的标注环节中,混乱的视觉呈现往往成为效率瓶颈。当标注员面对数百张包含"车辆"、"行人"、"交通标志"等多类别的图像时,系统随机分配的标…...

LeRobot SO100主从臂配置全流程:从硬件组装到模型训练

LeRobot SO100主从臂实战指南:从零搭建到智能控制 1. 项目概述与硬件准备 LeRobot SO100作为HuggingFace开源社区推出的机器人学习平台,为开发者提供了从硬件组装到AI模型训练的全套解决方案。这套主从臂系统最吸引人的特点在于其模块化设计——六自由度…...

从零构建CPWC超声成像仿真:Field II实战与模块化工作流解析

1. CPWC超声成像仿真入门指南 第一次接触CPWC超声成像仿真时,我被各种专业术语和复杂的数学公式搞得晕头转向。经过几个月的实战摸索,终于总结出一套小白也能快速上手的方法。CPWC(相干平面波复合)是近年来超声成像领域的热门技术…...

保姆级避坑指南:用VMware ESXi 8.0给vCenter Server 8.0单独划个“家”(存储+网络配置详解)

VMware ESXi 8.0环境下的vCenter Server 8.0专属部署指南 在虚拟化环境中,vCenter Server作为整个VMware生态系统的"大脑",其部署的稳定性和可靠性直接影响整个虚拟化平台的运行质量。本文将深入探讨如何在ESXi 8.0环境中为vCenter Server 8.0…...

如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题?

如何用Real-ESRGAN-ncnn-vulkan解决5种常见的图像质量问题? 【免费下载链接】Real-ESRGAN-ncnn-vulkan NCNN implementation of Real-ESRGAN. Real-ESRGAN aims at developing Practical Algorithms for General Image Restoration. 项目地址: https://gitcode.co…...

UOS20远程桌面XRDP配置指南:告别黑屏卡顿,轻松实现Windows远程连接

UOS20远程桌面XRDP配置实战:从零搭建流畅的Windows远程控制环境 在混合办公成为常态的今天,跨平台远程控制需求激增。UOS20作为国产操作系统的代表,其XRDP服务能让Windows用户无缝接入,但配置过程中的黑屏、卡顿问题常令人却步。…...

Qwen3交互界面开发:利用JavaScript实现网页端字幕编辑器

Qwen3交互界面开发:利用JavaScript实现网页端字幕编辑器 1. 引言 做视频的朋友们,不知道你们有没有过这样的经历:用AI工具生成了视频字幕,时间轴对得总差那么一点,要么是话还没说完字幕就跳了,要么是沉默…...

gemma-3-12b-it镜像开箱即用:3分钟完成多模态服务启动与测试

gemma-3-12b-it镜像开箱即用:3分钟完成多模态服务启动与测试 1. 快速了解Gemma-3-12b-it 如果你正在寻找一个既能理解文字又能看懂图片的AI模型,而且希望它能在普通电脑上运行,那么Gemma-3-12b-it就是为你准备的。 Gemma是Google推出的轻量…...

零基础快速入门前端DOM 节点操作核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)

DOM(文档对象模型)是 JavaScript 操作网页内容的核心接口,而节点操作则是 DOM 编程的基础,是蓝桥杯 Web 应用开发赛道的必考核心考点,无论是动态交互效果、数据渲染还是功能实现,都离不开节点的获取、增删、…...

告别龟速下载!一个Shell脚本搞定GFZ非潮汐大气负载数据(附站点坐标文件模板)

极速批量获取GFZ非潮汐大气负载数据的Shell脚本实战指南 在GNSS数据处理和地球物理研究中,获取高精度的非潮汐大气负载(NTAL)数据是分析站点位移的关键环节。德国地学研究中心(GFZ)作为全球权威机构,其提供的NTAL数据产品被广泛应用于科研和工程领域。然…...

【风电功率预测】到了2026年,企业为什么总输在“最后一公里”?从气象到功率再到电力交易,少赚的钱到底丢在哪

2026年,风电行业已经进入一个非常现实的新阶段。过去,很多企业讨论风电功率预测,核心问题还是“预报准不准”。而到了今天,这个问题虽然仍然重要,却已经不是决定收益高低的唯一变量。真正拉开差距的,是企业…...