4211|6

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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

我现在用的外部中断引脚是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);
}  
}
此帖出自stm32/stm8论坛

最新回复

                                 PDI_FLAG是什么?在哪里定义的?什么类型?  详情 回复 发表于 2010-9-11 22:35
点赞 关注
 

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 请在 if(PDI_FLAG==0) 之前清中断标志:EXTI_ClearITPendingBit(EXTI_Line5);
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
把清中断标志放在前面了。好像没有什么改善,现在中断程序感觉是乱的,其实我说的第一次进中断服务程序了,我也不确定。因为看现象是执行了中断服务程序,关了显示,但是在中断服务程序加断点,却不在断点处停止。然后用MDK自带的外设观察窗口,EXTI观察窗口也看不了。
现在真的分析不出来哪里出了问题。
此帖出自stm32/stm8论坛
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 也许你的问题根本与中断无关,是你自己误导了自己,也误导了别人,
此帖出自stm32/stm8论坛
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
现在真的是第一次能进中断,以后就进不去了,进行第二次中断触发后,现象是死机(好像是程序跑飞,PDI_FLAG的值都变成0x2658B017了,程序里只是赋0和赋1呀?
麻烦版主在来解答一下吧,拜托了。
此帖出自stm32/stm8论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 而且我是把中断程序单拿出来调试了。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 PDI_FLAG是什么?在哪里定义的?什么类型?
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表