STM32如何用74HC165扩展IO实现多按钮控制

发布时间:2026/7/4 11:06:06

STM32如何用74HC165扩展IO实现多按钮控制 1. 项目背景与核心价值在嵌入式系统开发中IO资源紧张是常见的设计瓶颈。传统方案中每个按钮都需要独立占用一个GPIO引脚当需要处理16个甚至更多按钮时引脚资源消耗将变得不可接受。这就是为什么我们需要MC74HC165A这样的并行输入转串行输出移位寄存器——它能够将16个按钮的状态通过仅4个SPI引脚传输给STM32微控制器。我曾在一个工业控制面板项目中遇到类似困境客户要求实现一个包含24个功能按钮的紧凑型控制器而选用的STM32F334R8仅有38个可用GPIO。如果采用传统方案仅按钮就会占用近2/3的引脚资源。通过引入两片MC74HC165A最终仅用6个引脚SPIx3 控制信号x3就实现了全部按钮状态的读取节省了75%的IO资源。2. 硬件架构深度解析2.1 MC74HC165A关键特性这款8位并行输入/串行输出移位寄存器有三个核心优势级联能力SH/LD移位/装载引脚可并联多个芯片共用控制信号宽电压支持2V-6V工作电压兼容3.3V和5V系统高速传输在4.5V供电时时钟频率可达35MHz实际应用中需要注意两个关键参数数据建立时间tSU在SH/LD上升沿前并行输入数据需稳定至少20ns时钟到输出延迟tPD在时钟上升沿后Q7输出最晚在44ns内稳定2.2 STM32F334R8的SPI配置要点STM32F334R8的高精度定时器虽然闻名但其SPI外设在本次应用中同样关键。推荐配置SPI_InitTypeDef spi; spi.Mode SPI_MODE_MASTER; spi.Direction SPI_DIRECTION_2LINES_RXONLY; // 只接收模式 spi.DataSize SPI_DATASIZE_8BIT; spi.CLKPhase SPI_PHASE_2EDGE; // 数据在第二个边沿采样 spi.CLKPolarity SPI_POLARITY_LOW; spi.NSS SPI_NSS_SOFT; spi.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; // 约1.5MHz 48MHz PCLK spi.FirstBit SPI_FIRSTBIT_MSB; HAL_SPI_Init(hspi1);3. 电路设计与PCB布局经验3.1 关键电路设计按钮矩阵需要特别注意消抖设计。我们的方案是硬件消抖每个按钮并联0.1μF电容软件消抖连续3次采样一致才确认状态级联连接示意图[按钮矩阵] - [MC74HC165A#1] - Q7 - [MC74HC165A#2] - Q7 - [STM32 MISO] SH/LD ───────┘ SH/LD ───────┘ CLK ────────────────────┘3.2 PCB布局教训在一次量产版本中我们遇到了按钮误触发问题最终发现是移位寄存器距离MCU超过15cm未加终端电阻导致信号反射改进方案将移位寄存器布局在按钮矩阵与MCU之间在SCK和MISO线上串联33Ω电阻在SH/LD信号线上添加10pF去耦电容4. 软件实现与优化技巧4.1 基础数据读取流程void ReadButtons(uint16_t* data) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET); // 拉低SH/LD delay_us(1); // 满足tSU时间 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET); uint8_t buf[2]; HAL_SPI_Receive(hspi1, buf, 2, 100); *data (buf[0] 8) | buf[1]; }4.2 高级优化方案通过DMA定时器实现自动轮询配置TIM2触发SPI DMA请求设置DMA循环模式双缓冲机制在DMA完成中断中处理数据关键代码片段// 定时器配置100Hz采样 htim2.Instance TIM2; htim2.Init.Prescaler 4800-1; // 48MHz/4800 10kHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 100-1; // 100Hz HAL_TIM_Base_Start(htim2); // DMA配置 hdma_spi1_rx.Init.Mode DMA_CIRCULAR; hdma_spi1_rx.Init.MemBurst DMA_MBURST_SINGLE; hdma_spi1_rx.XferCpltCallback SPI_DMA_Callback; HAL_DMA_Start_IT(hdma_spi1_rx, SPI1-DR, buf, 2);5. 实际应用中的疑难解答5.1 常见问题排查表现象可能原因解决方案部分按钮无响应虚焊或接触不良检查按钮与74HC165的焊接所有按钮状态相同级联连接错误验证第一片的Q7是否接第二片SER随机误触发电源噪声在VCC与GND间加0.1μF10μF电容读取数据偏移时钟相位错误调整SPI的CPHA/CPOL配置5.2 抗干扰设计心得在工业环境中我们额外采取了以下措施在SPI线上增加TVS二极管如SMBJ3.3A使用屏蔽双绞线连接远程按钮面板在固件中实现CRC校验每帧数据附加CRC8设置看门狗定时器异常时自动复位SPI外设6. 性能测试数据对比我们对三种实现方案进行了对比测试方案引脚占用扫描延迟功耗成本直接GPIO16引脚0.1ms12mA$1.274HC1654引脚0.8ms8mA$2.5专用IO扩展2引脚(I2C)2ms5mA$4.0测试环境STM32F334R8 48MHz16个按钮同时按下3.3V供电结果显示虽然74HC165方案在速度上不是最优但在引脚节省与成本平衡上表现最佳。对于需要实时响应的场景可以通过预分频降低SPI时钟来优化时序余量。

相关新闻