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

STM32密码锁实战:Flash存储实现密码持久化与安全机制

1. STM32密码锁的核心需求与Flash存储优势做密码锁最头疼的就是断电后密码丢失的问题。我之前用外部EEPROM芯片存密码不仅占用I/O口成本还高。后来发现STM32内部自带Flash闪存简直就是为这种场景量身定制的解决方案。为什么选择内部Flash实测STM32F103C8T6的64KB主存储区最后1KB用来存密码完全够用。对比外部存储方案省去了I2C/SPI接口电路无需额外元器件24C02等EEPROM芯片读写速度比外部存储快3-5倍零待机功耗不像SRAM需要电池供电关键提示Flash存储的密码在芯片加密后仍然有效即使程序被读取也无法直接获取密码明文2. Flash存储的底层操作实战2.1 Flash分区规划技巧以STM32F103C8T6为例我的分区方案是这样的地址范围用途大小0x08000000-0x0800FBFF主程序区63KB0x0800FC00-0x0800FFFF密码存储区1KB选择最后一页是因为不会被程序更新覆盖擦除不影响主程序运行与选项字节保持安全距离2.2 关键操作代码实现先看Flash解锁序列必须严格按顺序void FLASH_Unlock(void) { FLASH-KEYR 0x45670123; // KEY1 FLASH-KEYR 0xCDEF89AB; // KEY2 }密码写入函数要特别注意先擦除整页只能1变0以半字(16bit)为单位写入每次写入后检查BSY标志void Write_Password(uint32_t addr, uint16_t *pwd, uint8_t len) { FLASH_Unlock(); FLASH-CR | FLASH_CR_PER; // 页擦除模式 FLASH-AR addr; // 设置擦除地址 FLASH-CR | FLASH_CR_STRT; // 开始擦除 while(FLASH-SR FLASH_SR_BSY); // 等待擦除完成 FLASH-CR ~FLASH_CR_PER; FLASH-CR | FLASH_CR_PG; // 编程模式 for(uint8_t i0; ilen; i) { *(__IO uint16_t*)(addr i*2) pwd[i]; while(FLASH-SR FLASH_SR_BSY); } FLASH-CR ~FLASH_CR_PG; FLASH_Lock(); }3. 密码安全机制设计3.1 错误次数限制的实现在全局变量中定义uint8_t error_count 0; #define MAX_ERROR 3密码验证逻辑if(input_pwd ! stored_pwd) { error_count; if(error_count MAX_ERROR) { Lock_System(30000); // 锁定30秒 } } else { error_count 0; Unlock_Door(); }3.2 密码存储加密方案直接存储明文密码太危险我的加密方案密码固定盐值做MD5哈希存储哈希值而非原始密码验证时对比哈希值void Encrypt_Password(uint8_t *raw, uint8_t *enc) { uint8_t salt[] STM32Lock; MD5_CTX ctx; MD5_Init(ctx); MD5_Update(ctx, raw, strlen(raw)); MD5_Update(ctx, salt, sizeof(salt)); MD5_Final(enc, ctx); }4. 硬件电路设计要点4.1 按键矩阵设计我用的是4x4矩阵键盘接线方案行线PA0-PA3列线PA4-PA7扫描代码示例uint8_t Key_Scan(void) { uint8_t key 0; for(uint8_t i0; i4; i) { HAL_GPIO_WritePin(GPIOA, ROW_PINS[i], GPIO_PIN_RESET); for(uint8_t j0; j4; j) { if(HAL_GPIO_ReadPin(GPIOA, COL_PINS[j]) GPIO_PIN_RESET) { key i*4 j 1; while(HAL_GPIO_ReadPin(GPIOA, COL_PINS[j]) GPIO_PIN_RESET); } } HAL_GPIO_WritePin(GPIOA, ROW_PINS[i], GPIO_PIN_SET); } return key; }4.2 OLED显示驱动使用硬件I2C驱动SSD1306void OLED_ShowPwdStatus(uint8_t status) { OLED_Clear(); switch(status) { case 0: OLED_ShowString(0,0,Input Password:,16); break; case 1: OLED_ShowString(0,2,LOCKED!,16); break; case 2: OLED_ShowString(0,2,Welcome!,16); break; case 3: OLED_ShowString(0,2,Wrong Pwd!,16); OLED_ShowString(0,4,Remain:,16); OLED_ShowNum(56,4,MAX_ERROR-error_count,2,16); break; } OLED_Refresh(); }5. 系统优化与异常处理5.1 Flash寿命延长策略STM32 Flash典型擦写次数是1万次我的优化方法采用写入新页标记旧页的方式只有所有页写满时才执行擦除添加写计数到选项字节void Wear_Leveling_Write(uint16_t *data) { static uint32_t write_addr PWD_BASE_ADDR; if(write_addr PWD_END_ADDR) { FLASH_ErasePage(PWD_BASE_ADDR); write_addr PWD_BASE_ADDR; } Write_Password(write_addr, data, PWD_LEN); write_addr PWD_LEN * 2; }5.2 异常情况处理电压监测在Flash操作前检查供电电压if(__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) { Delay_ms(100); // 等待电压恢复 }操作中断恢复添加操作状态保存区typedef struct { uint8_t op_type; uint32_t op_addr; uint16_t op_data[PWD_LEN]; } FlashOp_TypeDef; FlashOp_TypeDef gFlashOp __attribute__((section(.noinit)));6. 完整系统工作流程上电初始化读取Flash中的密码哈希值初始化错误计数器显示输入密码界面密码修改流程验证旧密码两次输入新密码一致性检查加密后写入Flash锁定机制触发连续3次错误触发30秒锁定OLED显示剩余锁定时间锁定期间所有按键无效7. 开发中的坑与解决方案坑1Flash操作导致程序卡死原因在Flash操作时发生中断 解决操作前关闭全局中断__disable_irq(); FLASH_ProgramHalfWord(addr, data); __enable_irq();坑2密码验证偶尔失败原因电压不稳导致Flash读取错误 解决添加CRC校验uint16_t Calc_CRC(uint16_t *data, uint8_t len) { uint16_t crc 0xFFFF; while(len--) { crc ^ *data; for(uint8_t i0; i8; i) { if(crc 0x0001) { crc 1; crc ^ 0xA001; } else { crc 1; } } } return crc; }8. 扩展功能实现思路时间锁功能结合RTC实现时段控制例如仅允许9:00-18:00开锁多用户管理分级密码权限管理员密码可重置普通用户密码蓝牙解锁通过HC-05模块手机APP配对连接这个项目最让我惊喜的是STM32内部Flash的可靠性经过三个月连续测试密码存储没有出现一次异常。对于需要数据持久化的嵌入式应用合理利用芯片内置Flash确实能大幅简化设计。

相关文章:

STM32密码锁实战:Flash存储实现密码持久化与安全机制

1. STM32密码锁的核心需求与Flash存储优势 做密码锁最头疼的就是断电后密码丢失的问题。我之前用外部EEPROM芯片存密码,不仅占用I/O口,成本还高。后来发现STM32内部自带Flash闪存,简直就是为这种场景量身定制的解决方案。 为什么选择内部Flas…...

从C语言基础到AI模型调用:使用NLP-StructBERT的C接口实践

从C语言基础到AI模型调用:使用NLP-StructBERT的C接口实践 如果你是一位C语言开发者,习惯了与内存、指针和结构体打交道,看着现在AI应用遍地开花,是不是偶尔会想:这些用Python、PyTorch写起来很酷的模型,有…...

Zotero-Better-Notes表格编辑全攻略:从基础操作到效率提升

Zotero-Better-Notes表格编辑全攻略:从基础操作到效率提升 【免费下载链接】zotero-better-notes Everything about note management. All in Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-better-notes 在学术研究和知识管理过程中&#xf…...

数字IC后端设计中Post-mask ECO的Spare Cell优化策略与实践

1. 数字IC后端设计中的Post-mask ECO核心挑战 在芯片设计流程中,Post-mask ECO(Engineering Change Order)是让很多工程师头疼的关键环节。想象一下,当芯片已经完成tapeout进入制造阶段,突然发现某个逻辑功能需要调整—…...

STM32G474 HRTIM高精度定时器实战:实现互补PWM与死区控制

1. HRTIM高精度定时器为何成为电机控制利器 第一次接触STM32G474的HRTIM模块时,我被它的参数惊到了——184ps的时间分辨率意味着什么概念?这相当于在1秒钟内可以完成54亿次精确计时操作。相比之下,普通定时器的10ns分辨率就像用米尺测量头发丝…...

Wan2.1 VAE实战:Java后端服务集成与高并发调用优化

Wan2.1 VAE实战:Java后端服务集成与高并发调用优化 最近在帮一个电商平台做技术升级,他们想给商品详情页自动生成一些风格化的背景图,提升视觉吸引力。需求很明确:用户上传一张商品白底图,系统能快速生成多种风格的背…...

Alpamayo-R1-10B入门指南:理解Chain-of-Causation推理四阶段输出逻辑

Alpamayo-R1-10B入门指南:理解Chain-of-Causation推理四阶段输出逻辑 1. 项目简介:自动驾驶的“思考型大脑” 想象一下,你正在教一个新手司机开车。你不仅要告诉他“踩油门”、“打方向盘”,更重要的是要解释“为什么”要这么做…...

Log4j2配置实战:如何为SpringBoot项目定制高性能日志方案(附模板下载)

Log4j2配置实战:如何为SpringBoot项目定制高性能日志方案 在分布式系统与微服务架构盛行的当下,日志系统已从简单的调试工具演变为关键的业务监控组件。当QPS突破5000时,传统的同步日志写入可能直接拖慢系统响应速度30%以上。本文将深入剖析如…...

隐私党必备!用群晖NAS部署完全离线的Llama 2聊天机器人(2024最新Docker方案)

隐私守护者的终极方案:群晖NAS离线部署Llama 2聊天机器人全指南 在数据泄露事件频发的今天,越来越多的技术爱好者开始寻求完全掌控个人数据的解决方案。想象一下,一个无需连接任何云端服务器、所有对话内容仅存在于本地设备的AI助手——这正是…...

3大维度释放暗黑破坏神2潜力:PlugY插件从入门到精通的实战指南

3大维度释放暗黑破坏神2潜力:PlugY插件从入门到精通的实战指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 价值定位:为什么PlugY是单机玩…...

工业现场必备:Pt100温度变送器选型指南(含DIN12系列实操接线图)

工业现场必备:Pt100温度变送器选型指南(含DIN12系列实操接线图) 在工业自动化领域,温度测量是过程控制中最基础也最关键的环节之一。而Pt100热电阻因其稳定性好、精度高、线性度优良等特点,成为工业温度检测的首选传感…...

import和require到底有啥区别?从Vue Router报错案例看ES6模块化的那些坑

import与require深度解析:从Vue Router报错看模块化演进之路 最近在重构一个老项目时,遇到了一个典型的Vue Router动态加载报错:Error: Cannot find module /views/xxx at webpackEmptyContext。这个看似简单的错误背后,隐藏着前端…...

科研党必看!用Git管理Obsidian笔记的5个高效技巧(基于Gitee平台)

科研党必看!用Git管理Obsidian笔记的5个高效技巧(基于Gitee平台) 作为一名长期与文献打交道的科研工作者,我深刻体会到知识管理工具对研究效率的决定性影响。Obsidian凭借其双向链接和知识图谱功能,已成为许多学者构建…...

手把手教你如何根据编码器PPR值计算角位移(附常见型号参数表)

工业编码器PPR参数实战指南:从原理到角位移计算全解析 在精密运动控制领域,编码器如同系统的"眼睛",而PPR值则是这双眼睛的"视力指标"。无论是六轴机械臂的关节定位,还是CNC机床的进给控制,对旋转…...

CLIP图文匹配工具优化技巧:如何写出让AI更懂你的文本描述

CLIP图文匹配工具优化技巧:如何写出让AI更懂你的文本描述 1. 工具核心能力解析 CLIP-GmP-ViT-L-14图文匹配测试工具是一个基于先进多模态AI模型的实用工具,它能帮助我们理解AI如何"看"图片。这个工具的核心价值在于: 直观的匹配…...

2.2寸ILI9225彩屏驱动移植实战:基于天空星GD32F407VET6的SPI接口配置详解

2.2寸ILI9225彩屏驱动移植实战:基于天空星GD32F407VET6的SPI接口配置详解 最近在做一个项目,需要用到一块2.2寸的彩色液晶屏,型号是ILI9225驱动的。网上找到了通用的例程,但那是基于STM32的,而我手头正好有一块天空星的…...

仅限核心开发者查阅:MCP本地DB连接器v2.4.0源码加密配置模块逆向还原(含AES-256密钥派生流程图)

第一章:MCP本地DB连接器v2.4.0源码加密配置模块逆向还原总览MCP本地DB连接器v2.4.0的加密配置模块采用混合式保护策略,结合编译期混淆、运行时密钥派生与AES-256-GCM动态解密三重机制。该模块不依赖外部密钥管理服务(KMS)&#xf…...

USB PD/QC测试仪亚克力前面板结构设计与工程实现

USB电流电压表面板:面向PD/QC多协议电源测试的亚克力前面板工程实现1. 项目概述USB电流电压表面板是一套专为USB Power Delivery(PD)与Quick Charge(QC)多协议电源测试仪配套设计的物理交互界面。该面板不包含任何电子…...

基于Transformer的AgentCPM深度研报助手:架构解析与性能调优

基于Transformer的AgentCPM深度研报助手:架构解析与性能调优 最近在做一个金融研报自动生成的项目,团队里的小伙伴都在讨论怎么让模型生成的报告更专业、逻辑更严谨。试了几个开源模型,效果总差那么点意思,要么是信息整合能力弱&…...

零代码玩转LingBot-Depth:Gradio WebUI交互式深度估计

零代码玩转LingBot-Depth:Gradio WebUI交互式深度估计 1. 引言:当深度估计变得像上传照片一样简单 想象一下,你拿到一张普通的室内照片,想知道照片里沙发离镜头有多远,桌子有多高,整个房间的立体结构是怎…...

Free-NTFS-for-Mac开源工具:跨平台文件传输完整解决方案

Free-NTFS-for-Mac开源工具:跨平台文件传输完整解决方案 【免费下载链接】Free-NTFS-for-Mac Nigate,一款支持苹果芯片的Free NTFS for Mac小工具软件。NTFS R/W for macOS. Support Intel/Apple Silicon now. 项目地址: https://gitcode.com/gh_mirro…...

突破加密压缩包密码困境:ArchivePasswordTestTool高效恢复全攻略

突破加密压缩包密码困境:ArchivePasswordTestTool高效恢复全攻略 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 在数字化时代&…...

快速搭建智能车控制面板:用快马平台十分钟生成可交互原型

最近在做一个智能车相关的项目,前期需要快速验证一些控制逻辑和交互流程。如果从零开始搭建一个带界面的演示原型,光是写前端页面和调试交互就得花不少时间。正好用上了InsCode(快马)平台,发现它特别适合这种需要快速出活、验证想法的场景。我…...

STA Deep Dive: Mastering False Paths and Half-Cycle Checks in Timing Verification

1. 深入理解False Path在时序验证中的关键作用 **False Path(伪路径)**是静态时序分析(STA)中一个极其重要的概念。简单来说,False Path指的是那些在电路实际工作中永远不会被触发的时序路径,但在STA工具看…...

千问3.5-27B部署避坑指南:flash-linear-attention缺失影响与fallback应对

千问3.5-27B部署避坑指南:flash-linear-attention缺失影响与fallback应对 1. 模型概述 Qwen3.5-27B是Qwen官方发布的视觉多模态理解模型,支持文本对话与图片理解功能。该模型在4张RTX 4090 D 24GB显卡环境下完成部署,提供以下核心功能&…...

MQ-8氢气传感器STM32驱动移植实战:ADC与GPIO双模式数据采集详解

MQ-8氢气传感器STM32驱动移植实战:ADC与GPIO双模式数据采集详解 最近在做一个环境监测的小项目,需要检测氢气浓度,就用上了MQ-8传感器。这个模块挺有意思,它同时提供了模拟量(AO)和数字量(DO&am…...

AutoCAD 2024 LISP效率提升:10个实用自定义命令全解析(附完整代码)

AutoCAD 2024 LISP效率提升:10个实用自定义命令全解析(附完整代码) 在AutoCAD日常设计中,重复性操作往往消耗大量时间。本文针对中级用户,精选10个高频LISP自动化脚本,从图层管理到文字处理,每个…...

MATLAB新手必看:5分钟搞定冯米塞斯应力云图绘制(附完整代码)

MATLAB实战:5步生成专业级冯米塞斯应力云图 第一次接触冯米塞斯应力分析时,我被实验室墙上那张彩色云图深深吸引——它像艺术品一样展示了金属构件内部的应力分布。当时完全不懂MATLAB的我,花了整整两周才搞明白如何复现这个效果。现在&#…...

系统管理员必备:Windows安全日志分析的7个黄金事件ID(含筛选脚本)

Windows安全日志深度分析:7个关键事件ID与自动化检测实战 在Windows系统管理中,安全日志就像一座未被充分挖掘的金矿。每天产生数以万计的事件记录中,往往隐藏着入侵的早期信号、权限滥用的痕迹以及内部威胁的蛛丝马迹。本文将聚焦7个最具实战…...

高效微信自动化实战:WeChatFerry从场景痛点到智能落地指南

高效微信自动化实战:WeChatFerry从场景痛点到智能落地指南 【免费下载链接】WeChatFerry 微信逆向,微信机器人,可接入 ChatGPT、ChatGLM、讯飞星火、Tigerbot等大模型。Hook WeChat. 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…...