OpenEdv-开源电子网

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

STM32外部中断

[复制链接]

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
发表于 2015-3-26 20:36:03 | 显示全部楼层 |阅读模式
5金钱
大家好,我遇到一个问题想请教一下大家。我使用正点原子mini开发板做了个外部中断的实验,选用的是第32和第33个引脚分别作为按键1,按键2的IO口------PB12,PB3.这两个IO口除去作为通用IO口外,都有复用功能。
PB12功能(包含复用功能)为:PB12/SPI2_NSS/I2S2_WS/I2C2_SMBAI/TIM1_BKIN;
PB13功能(包含服用功能)为:PB13/SPI2_SCK/I2S2_CK/TIM1_CH1N。
可是按按键不能进入外部中断服务程序,不知道是什么原因,下面是我的代码,还请知道原因的大哥能够指点一二,谢谢。
代码:
void EXTIX_Init(void)
{
   EXTI_InitTypeDef EXTI_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟

  KEY_Init();//初始化按键对应io模式

   //GPIOB.12 中断线以及中断初始化配置
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);

  EXTI_InitStructure.EXTI_Line=EXTI_Line12;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

    //GPIOB.13   中断线以及中断初始化配置
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);

  EXTI_InitStructure.EXTI_Line=EXTI_Line13;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);   //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2, 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);
}

void EXTI15_10_IRQHandler(void)
{
  delay_ms(10);    //消抖  
   if(EXTI_GetITStatus(EXTI_Line12) != RESET)
    {
      sei();
      GPIOD->ODR^=0x04;  //led灯1随着按键1的按动亮灭
      EXTI_ClearITPendingBit(EXTI_Line12);   
   }
   else if(EXTI_GetITStatus(EXTI_Line13) != RESET)
    {
     sei();
     GPIOD->ODR^=0x08;  //led灯2随着按键2的按动亮灭
     EXTI_ClearITPendingBit(EXTI_Line13);   
   }
}

void KEY_Init(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTB时钟
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12| GPIO_Pin_13;//PB12,PB13
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB12,PB13设置成输入,默认下拉  
 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB2,PB3
}

int main(void)
{
  delay_init();     //延时函数初始化
 LED_Init();   //初始化与LED连接的硬件接口 
  EXTIX_Init(); //外部中断初始化
  while(1)
 {

 }
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-26 22:53:41 | 显示全部楼层
你的PB12,PB13应该配置成上拉输入吧.
你用的下降沿进中断,自然要配置上拉输入了. 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
 楼主| 发表于 2015-3-27 12:05:49 | 显示全部楼层
谢谢,我马上去修改过来再测试一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 12:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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