OpenEdv-开源电子网

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

stm32f4实现矩阵键盘(中断方式),无法进入中断

[复制链接]

35

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-8-15
在线时间
2 小时
发表于 2015-4-13 17:04:30 | 显示全部楼层 |阅读模式
5金钱
按键初始化如下:
void Key_Init(void)
{
EXTI_InitTypeDef   EXTI_InitStructure;
    GPIO_InitTypeDef   GPIO_InitStructure;
    NVIC_InitTypeDef   NVIC_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //使能IO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource12);//初始化中断线
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource13);//初始化中断线
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource14);//初始化中断线
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource15);//初始化中断线

EXTI_ClearITPendingBit(EXTI_Line12);
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI_ClearITPendingBit(EXTI_Line14);
EXTI_ClearITPendingBit(EXTI_Line15);

  EXTI_InitStructure.EXTI_Line = EXTI_Line12|EXTI_Line13|EXTI_Line14|EXTI_Line15;    //配置中断线为中断线
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;          //配置中断模式
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;      //配置为上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;                    //配置中断线使能
  EXTI_Init(&EXTI_InitStructure);                              

  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;             
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

GPIO_ResetBits(GPIOD,GPIO_Pin_12);
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
GPIO_ResetBits(GPIOD,GPIO_Pin_15);
}

PD8~PD11为键盘的列,PD12~PD15为键盘的行。

main.c如下,当检测到有按键按下,则开始扫描,并输出按下的是哪个键:
while(1)
{    
Delay(1000);

if(key_pressed_flag){
ReadValue=KEY_Scan();
if(ReadValue!=0){
 Delay(10);
if(ReadValue==KEY_Scan()){
printf("ReadValue=%d",ReadValue);
printf("\n");
}
else
printf("read error!");
}
key_pressed_flag=0;
}
}

中断函数如下:
void EXTI15_10_IRQHandler(void){
key_pressed_flag=1;

EXTI_ClearITPendingBit(EXTI_Line12);
EXTI_ClearITPendingBit(EXTI_Line13);
EXTI_ClearITPendingBit(EXTI_Line14);
EXTI_ClearITPendingBit(EXTI_Line15);
}

现在按下键盘,并没有输出,不知道问题出在哪里?求解答!!

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

使用道具 举报

35

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-8-15
在线时间
2 小时
 楼主| 发表于 2015-4-13 18:19:31 | 显示全部楼层
进不去中断,不知道哪里出问题。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-4-13 19:37:35 | 显示全部楼层
帮顶....
回复

使用道具 举报

35

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-8-15
在线时间
2 小时
 楼主| 发表于 2015-4-15 10:11:09 | 显示全部楼层
为什么进不去中断,大神帮帮忙呀?找不到原因了。。
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-4-19
在线时间
4 小时
发表于 2015-4-20 12:33:25 | 显示全部楼层
中断分组设置了吗?NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);这样的而且感觉中断优先级和响应优先级有点问题。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 11:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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