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

STM32F030软件SPI驱动74HC165实现多路按键扫描

1. 硬件连接与原理分析

74HC165是一款经典的8位并行输入/串行输出移位寄存器,特别适合用来扩展GPIO资源紧张的微控制器。我最近在一个智能家居控制面板项目中使用STM32F030驱动这款芯片,实测下来稳定性相当不错。先说说硬件连接要点:

74HC165的引脚功能需要特别注意:

  • PL(并行加载)引脚低电平时会将8个并行输入口的状态锁存到内部寄存器
  • CP(时钟)引脚每个上升沿会将数据从DS引脚移入,同时Q7引脚移出数据
  • QH(串行输出)引脚连接MCU的输入GPIO

实际接线时,我用杜邦线连接了STM32F030的以下引脚:

  • PA4连接PL(用作片选信号)
  • PB3连接CP(时钟信号)
  • PA6连接QH(数据输入)

这里有个小技巧:如果按键数量超过8个,可以通过级联多个74HC165来实现扩展。只需要将第一个芯片的QH输出接到第二个芯片的DS输入,共用PL和CP信号即可。我在测试时级联了3个芯片,成功实现了24路按键扫描。

2. 软件SPI时序实现

STM32F030虽然有硬件SPI外设,但在某些场景下使用软件模拟SPI反而更灵活。下面是我调试通过的驱动代码关键部分:

#define HC165_PL_PIN GPIO_PIN_4 #define HC165_PL_PORT GPIOA #define HC165_CP_PIN GPIO_PIN_3 #define HC165_CP_PORT GPIOB #define HC165_DS_PIN GPIO_PIN_6 #define HC165_DS_PORT GPIOA uint8_t HC165_ReadByte(void) { uint8_t value = 0; // 拉低PL引脚加载并行数据 HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_SET); // 逐位读取串行数据 for(uint8_t i=0; i<8; i++) { value <<= 1; if(HAL_GPIO_ReadPin(HC165_DS_PORT, HC165_DS_PIN)) { value |= 0x01; } // 产生时钟上升沿 HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_SET); } return ~value; // 按键按下时为低电平,所以取反 }

这段代码有几个关键点需要注意:

  1. PL信号需要保持至少25ns的低电平(实测1ms更可靠)
  2. 时钟信号要在读取数据位之后翻转
  3. 按键按下时输入为低电平,所以最后对读取值取反

3. 实际应用中的优化技巧

在真实项目中直接使用上面的基础代码可能会遇到一些问题。我分享几个踩坑后总结的经验:

3.1 消抖处理

机械按键通常需要10-20ms的消抖时间。我的做法是在主循环中这样处理:

#define DEBOUNCE_TIME 20 // 消抖时间20ms uint8_t currentKey, lastKey; uint32_t lastKeyTime = 0; while(1) { currentKey = HC165_ReadByte(); if(currentKey != lastKey) { lastKeyTime = HAL_GetTick(); } else if((HAL_GetTick() - lastKeyTime) > DEBOUNCE_TIME) { if(currentKey != 0) { // 处理有效按键 printf("Key pressed: 0x%02X\n", currentKey); } } lastKey = currentKey; HAL_Delay(5); // 适当延时减少CPU占用 }

3.2 多芯片级联处理

当级联多个74HC165时,读取顺序是从最后一个芯片开始。比如级联3个芯片时:

uint8_t HC165_ReadMultiple(uint8_t chipCount) { uint8_t value = 0; // 加载所有芯片的并行数据 HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_PL_PORT, HC165_PL_PIN, GPIO_PIN_SET); // 读取所有芯片的数据 for(uint8_t i=0; i<chipCount*8; i++) { value <<= 1; if(HAL_GPIO_ReadPin(HC165_DS_PORT, HC165_DS_PIN)) { value |= 0x01; } // 产生时钟上升沿 HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_RESET); HAL_Delay(1); HAL_GPIO_WritePin(HC165_CP_PORT, HC165_CP_PIN, GPIO_PIN_SET); } return ~value; }

4. 性能测试与优化

在实际测试中,我发现软件SPI的读取速度完全能满足按键扫描的需求。使用72MHz主频的STM32F030,读取一个8位74HC165大约需要50μs,即使级联3个芯片也只需要150μs左右。

如果需要进一步提高速度,可以考虑以下优化:

  1. 使用寄存器直接操作替代HAL库函数
  2. 减少时钟延时间隔
  3. 使用中断方式代替轮询

这里给出一个优化后的快速读取实现:

#define HC165_PL_BSRR (GPIOA->BSRR = GPIO_BSRR_BR_4) #define HC165_PL_SET (GPIOA->BSRR = GPIO_BSRR_BS_4) #define HC165_CP_CLR (GPIOB->BSRR = GPIO_BSRR_BR_3) #define HC165_CP_SET (GPIOB->BSRR = GPIO_BSRR_BS_3) #define HC165_DS_READ (GPIOA->IDR & GPIO_IDR_6) uint8_t HC165_FastRead(void) { uint8_t value = 0; HC165_PL_BSRR; __NOP(); __NOP(); // 约25ns延时 HC165_PL_SET; for(uint8_t i=0; i<8; i++) { value <<= 1; if(HC165_DS_READ) value |= 0x01; HC165_CP_CLR; __NOP(); __NOP(); HC165_CP_SET; } return ~value; }

这种实现方式将读取时间缩短到了约5μs,适合对实时性要求更高的应用场景。不过要注意,直接操作寄存器会降低代码的可移植性,建议在关键路径上使用。

http://www.gsyq.cn/news/1606493.html

相关文章:

  • 为什么93%的开发者在`/v1/chat/completions`接口踩坑?——基于1728次真实请求日志的参数组合失效分析
  • 40W DC-DC 国产工业隔离模块电源硬件选型指南|URB2412LD-40WR3 和钡特电源 VB40-24S12LD 靠谱好评推荐
  • Multisim(MS)工具-放置元器件
  • 当Python遇见全球气象数据:CDS API如何改变气候研究者的工作流
  • ChatGPT API调用成本失控?精准测算每千token真实开销,Python自动化账单分析脚本限时开源
  • 降AIGC软件红黑榜:实测3款热门工具,剖析实用程度与常见陷阱,文末附技巧
  • Cursor免费试用限制解除方案:从问题分析到一键重置的完整指南
  • 【MySQL全套SQL语句完整归纳】DDL/DML/DCL/TCL语法规范、实战案例、易错点全整理】
  • 线上办公避坑指南:从参数、定价看懂会议软件怎么选
  • MSP430BT5190超低功耗蓝牙MCU开发实战:架构解析与功耗优化
  • 【资深架构师亲授】ChatGPT机器人生产环境避坑手册:5类致命错误+4种监控指标+实时告警配置
  • 【CTF 备赛干货】2026 最新 CTF 比赛全方位指南,剖析竞赛新风向、整理值得参加的赛事,系统化备考路线助力轻松冲奖
  • Python PDF 解析入门:提取信息、表格与元数据
  • GPT-4动态稀疏激活:2%参数如何驱动万亿级智能
  • 胖头鱼的技术专栏-436 AI时代需要怎样的数据库?今天这场直播也许给出了答案(20260629)
  • 批量更改BOM组件不参与成本计算-CEWB
  • 3分钟搞定M3U8视频下载:告别在线观看限制的高效工具
  • 34 年匠心造好机,大连欣科蜂窝板生产线实力稳居区域第一
  • 面向真实科研场景,构建由Codex、Claude Code、OpenClaw、Hermes四位“AI研究员“组成的可迭代、可迁移的科研协作团队
  • 如何轻松掌控电脑风扇:FanControl完整指南助你实现静音与性能的完美平衡
  • 办公提效工具 OpenClaw 安装全流程,部署报错统一处理方案(含安装包)
  • 做自媒体,我是怎么用花生AI绕过剪辑这道坎的
  • 2026ChatGPT、DEEPSEEK、豆包等AI搜索结果优化方法?
  • 使用低代码爬虫软件自动化采集电商商品数据
  • 网安新手攻克 Kali 难题大全!各类高频报错一次性给出解决方案,搞定环境问题稳步进阶,冲刺高薪安全赛道
  • DeepEval终极指南:5分钟掌握AI模型评估框架的完整配置
  • 从 AI Agent 到具身智能:当智能开始拥有“身体”
  • 5分钟免费实现VR视频转2D的终极指南:VR-Reversal完整教程
  • Minecraft光影终极指南:用Revelation打造电影级方块世界
  • 5步掌握Res-Downloader:跨平台资源下载工具全面指南