主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
4x4阵列键盘 | 电路连接,电路原理,驱动程序,调用函数。 | 能用程序读出按键值。 |
师从洋桃电子,杜洋老师
📑文章目录
▲ 回顾上期🔍矩阵键盘原理与单片机驱动设计详解(上) | 零基础入门STM32第七十七步
▲ 回顾上期🔍矩阵键盘原理与单片机驱动设计详解—端口反转法(下) | 零基础入门STM32第七十八步
▲ 回顾上期🔍STM32外部中断深度解析:从原理到实战应用—矩阵键盘中断驱动(上) | 零基础入门STM32第七十九步
一、系统整体架构设计
1.1 硬件连接拓扑
硬件模块 | 功能描述 | GPIO分配 |
---|---|---|
矩阵键盘行线 | 扫描信号输出 | PA0-PA3 |
矩阵键盘列线 | 中断检测输入 | PA4-PA7 |
OLED显示屏 | 按键值显示 | I2C接口 |
1.2 软件工作流程
二、核心代码模块解析
2.1 主程序逻辑框架
int main(void) {
// 系统初始化
RCC_Configuration();
RELAY_Init();
I2C_Configuration();
OLED0561_Init();
// 中断相关初始化
INT_MARK = 0;
NVIC_Configuration();
KEYPAD4x4_Init();
KEYPAD4x4_INT_INIT();
while(1) {
if(INT_MARK) { // 中断标志检测
INT_MARK = 0; // 标志位清除
uint8_t key = KEYPAD4x4_Read();
if(key) OLED_DisplayKey(key);
}
// 其他后台任务...
}
}
2.2 中断初始化关键配置
2.2.1 RCC时钟配置
void KEYPAD4x4_INT_INIT(void) {
// 使能GPIO和AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
}
2.2.2 EXTI中断配置示例(PA4)
// GPIO与EXTI线路映射
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);
// EXTI参数设置
EXTI_InitTypeDef EXTI_InitStruct = {
.EXTI_Line = EXTI_Line4,
.EXTI_Mode = EXTI_Mode_Interrupt,
.EXTI_Trigger = EXTI_Trigger_Falling,
.EXTI_LineCmd = ENABLE
};
EXTI_Init(&EXTI_InitStruct);
// NVIC优先级配置
NVIC_InitTypeDef NVIC_InitStruct = {
.NVIC_IRQChannel = EXTI4_IRQn,
.NVIC_IRQChannelPreemptionPriority = 2,
.NVIC_IRQChannelSubPriority = 2,
.NVIC_IRQChannelCmd = ENABLE
};
NVIC_Init(&NVIC_InitStruct);
三、中断处理机制详解
3.1 中断服务函数设计
// EXTI4独立中断服务函数
void EXTI4_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line4)) {
INT_MARK = 1; // 设置列线1中断标志
EXTI_ClearITPendingBit(EXTI_Line4);
}
}
// EXTI5-9共享中断服务函数
void EXTI9_5_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line5)) {
INT_MARK = 2; // 列线2中断标志
EXTI_ClearITPendingBit(EXTI_Line5);
}
// 其他列线处理...
}
3.2 中断标志位处理策略
标志值 | 对应列线 | 处理逻辑 |
---|---|---|
1 | PA4 | 扫描第1列按键 |
2 | PA5 | 扫描第2列按键 |
3 | PA6 | 扫描第3列按键 |
4 | PA7 | 扫描第4列按键 |
四、关键技术优化方案
4.1 中断合并优化
// 修改中断服务函数统一处理
void EXTI9_5_IRQHandler(void) {
uint8_t col = 0;
if(EXTI_GetITStatus(EXTI_Line5)) {
col = 1;
EXTI_ClearITPendingBit(EXTI_Line5);
}
if(EXTI_GetITStatus(EXTI_Line6)) {
col = 2;
EXTI_ClearITPendingBit(EXTI_Line6);
}
if(col) KEY_Scan(col); // 统一扫描处理
}
4.2 动态优先级调整
// 紧急任务优先级提升
void Raise_Interrupt_Priority(void) {
NVIC_InitTypeDef NVIC_InitStruct = {
.NVIC_IRQChannel = EXTI4_IRQn,
.NVIC_IRQChannelPreemptionPriority = 0, // 最高抢占优先级
.NVIC_IRQChannelSubPriority = 0,
.NVIC_IRQChannelCmd = ENABLE
};
NVIC_Init(&NVIC_InitStruct);
}
五、扩展应用设计
5.1 多键盘级联方案
// 扩展GPIO配置
#define ROW_PORT GPIOA
#define COL_PORT GPIOB
// 扩展中断配置
void Extended_KEY_Init(void) {
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
// 其他配置类似...
}
5.2 低功耗模式集成
void Enter_Sleep_Mode(void) {
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
// 唤醒后重新初始化时钟
SystemInit();
}
六、常见问题排查指南
现象 | 排查步骤 | 解决方案 |
---|---|---|
按键无响应 | 1. 检查GPIO模式配置 2. 测量引脚电平 | 确认输入/输出模式设置正确 |
中断频繁误触发 | 1. 检查消抖电路 2. 查看触发方式设置 | 增加硬件RC滤波或软件消抖 |
OLED显示异常 | 1. 检查I2C通信 2. 验证显示缓冲区 | 重初始化OLED并校验数据 |
七、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] 键盘中断测试程序
[5] 外部中断原理与驱动.pptx
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨键盘中断程序分析2,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-23)