OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5208|回复: 5

STM32外部中断问题

[复制链接]

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
发表于 2014-5-9 09:33:10 | 显示全部楼层 |阅读模式
5金钱
我参考了一下别人的电子锁程序,想将一个矩阵键盘的按键配置为中断,可是程序写完之后发现,一旦进入其中一个中断,再按其他键已经没有反应了,但是矩阵键盘的16个值的确是正确的,经过我的测试,应该不是退不出中断的问题啊,请问各位能帮忙看出错误在哪吗?
[mw_shl_code=c,true]// 矩阵键盘接口配置 void KeyBoard_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); // 列线上拉输入 PC GPIO_InitStructure.GPIO_Pin = 0x000f; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 行线推挽输出 PA GPIO_InitStructure.GPIO_Pin = 0x000f; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); } //行线转换为上拉输入,中断点转换为推挽输出 void KeyBoard_Conv(u16 GPIO_Pin) { GPIO_InitTypeDef GPIO_InitStructure; //中断脚转换为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); //行线转换为上拉输入 GPIO_InitStructure.GPIO_Pin = 0x000f; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } // PC.0 列线0中断 void EXTI0_IRQHandler(void) { u16 keycol; if(EXTI_GetITStatus(EXTI_Line0)) { KeyBoard_Conv(GPIO_Pin_0); GPIO_ResetBits(GPIOC,GPIO_Pin_0); delay_ms(1); keycol = GPIO_ReadInputData(GPIOA)&0x000f; if(keycol) { delay_ms(10); if(keycol == (GPIO_ReadInputData(GPIOA)& 0x000f)) { keyflag = 1; switch(keycol) { case 0x0E: keyval = 1; break; case 0x0D: keyval = 4; break; case 0x0B: keyval = 7; break; case 0x07: keyval = '*';break; default :break; } } } // GPIO_SetBits(GPIOC,GPIO_Pin_0); KeyBoard_Config(); EXTI_ClearITPendingBit(EXTI_Line0); } }[/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-5-9 09:37:35 | 显示全部楼层
[mw_shl_code=c,true]void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用功能使能 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3); EXTI_ClearITPendingBit(EXTI_Line0); //清除挂起/请求标志 EXTI_ClearITPendingBit(EXTI_Line1); //清除挂起/请求标志 EXTI_ClearITPendingBit(EXTI_Line2); EXTI_ClearITPendingBit(EXTI_Line3); // PC.0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }[/mw_shl_code]
这段是其中PC.0的外部中断配置函数
PC.0是其中的一个中断,另外3个中断形式是一样的,我试了一下,用keyval去亮灯,发现keyval和键盘上的按键的确是一一对应的,现在就是搞不懂为什么按了一下按键之后,其他按键再按就没有用了
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-5-9 09:58:02 | 显示全部楼层
有人能帮忙看下嘛?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-9 12:35:30 | 显示全部楼层
中断服务函数时间越短越好,看你的都超过10ms了,优化一下吧,可以定一个标志,定时时间到了,在执行扫描按键,没到就干其他的事情即可
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-9
在线时间
0 小时
 楼主| 发表于 2014-5-9 15:02:18 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
老师,我就算把中间的delay函数去掉也还是一样啊?无论如何只能执行一次,其他中断再也进不去了
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-9 17:02:53 | 显示全部楼层
回复【5楼】siwangqixiang:
---------------------------------
不要在中断里面进行按键扫描
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 03:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表