打印

香水版主,请教个外部中断问题。在线等回复(急切)

[复制链接]
2686|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mazhanping123|  楼主 | 2010-9-11 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在用的外部中断引脚是PB5,中断向量是EXTI9_5_IRQChannel,但是进入中断1次后就死机了。然后就是can't halt the core。 AFIO也打开了,郁闷了好几天了。
以下是我的配置程序:
时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC|RCC_APB2Periph_USART1, ENABLE);

I/O:
    //PB5作为PDI外部中断,IO设为输悬浮输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

EXTI初始化:
void ExtiInit(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
/* Connect Key Button EXTI Line to Key Button GPIO Pin */
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource5);
}

配置NVIC:
void DrvierNVICConfig(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM
   /* Set the Vector Table base location at 0x20000000 */
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
   /* Set the Vector Table base location at 0x08000000 */
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
   /* enable DMA1_Channel1 interrupt from nivc */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the EXTI5_IRQChannel Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;     //PDI掉电中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

中断服务程序:
void EXTI9_5_IRQHandler(void)
{
   if(EXTI_GetITStatus(EXTI_Line5) != RESET)
{
     if(PDI_FLAG==0)
   {
    LcdCommand(0xAE); //关显示
    PDI_FLAG=1;
   }
  else
   {
    LcdCommand(0xAF); //开显示
    PDI_FLAG=0;
   }
//  /* Clear the Key Button EXTI line pending bit */
     EXTI_ClearITPendingBit(EXTI_Line5);
}  
}
沙发
香水城| | 2010-9-11 11:17 | 只看该作者
请在 if(PDI_FLAG==0) 之前清中断标志:EXTI_ClearITPendingBit(EXTI_Line5);

使用特权

评论回复
板凳
mazhanping123|  楼主 | 2010-9-11 12:08 | 只看该作者
把清中断标志放在前面了。好像没有什么改善,现在中断程序感觉是乱的,其实我说的第一次进中断服务程序了,我也不确定。因为看现象是执行了中断服务程序,关了显示,但是在中断服务程序加断点,却不在断点处停止。然后用MDK自带的外设观察窗口,EXTI观察窗口也看不了。
现在真的分析不出来哪里出了问题。

使用特权

评论回复
地板
香水城| | 2010-9-11 12:32 | 只看该作者
也许你的问题根本与中断无关,是你自己误导了自己,也误导了别人,:L

使用特权

评论回复
5
mazhanping123|  楼主 | 2010-9-11 15:35 | 只看该作者
现在真的是第一次能进中断,以后就进不去了,进行第二次中断触发后,现象是死机(好像是程序跑飞,PDI_FLAG的值都变成0x2658B017了,程序里只是赋0和赋1呀?
麻烦香主在来解答一下吧,拜托了。

使用特权

评论回复
6
mazhanping123|  楼主 | 2010-9-11 15:39 | 只看该作者
而且我是把中断程序单拿出来调试了。

使用特权

评论回复
7
香水城| | 2010-9-11 22:35 | 只看该作者
PDI_FLAG是什么?在哪里定义的?什么类型?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

55

帖子

0

粉丝