一晚上没解决这个外部中断问题,求大神看一下。发生中断就会死机

2019-07-14 21:37发布

本帖最后由 tim4146 于 2015-10-31 08:29 编辑
复制代码
  1. GPIO_InitTypeDef GPIO_InitStructure;        
  2.         EXTI_InitTypeDef EXTI_InitStructure;
  3.          NVIC_InitTypeDef NVIC_InitStructure;
  4.         
  5.         //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);        //关闭jtag
  6.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
  7.    


  8.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;                                    
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //设为下拉输入
  10.   GPIO_Init(GPIOD,&GPIO_InitStructure);                                                 //初始化GPIO

  11.         
  12.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource5);

  13.           EXTI_InitStructure.EXTI_Line=EXTI_Line5;        
  14.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  15.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  16.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  17.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  18.                                         //GPIOD.5 中断线以及中断初始化配置   下降沿触发
  19.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource6);

  20.           EXTI_InitStructure.EXTI_Line=EXTI_Line6;        
  21.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  22.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  23.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  24.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  25.                                         //GPIOD.5 中断线以及中断初始化配置   下降沿触发
  26.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource7);

  27.           EXTI_InitStructure.EXTI_Line=EXTI_Line7;        
  28.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  29.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  30.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  31.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  32.                
  33.                 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能按键WK_UP所在的外部中断通道
  34.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //抢占优先级2,
  35.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                        //子优先级3
  36.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  37.           NVIC_Init(&NVIC_InitStructure);
  38. }
复制代码


中断处理:
  1.         //外部中断5服务程序  //超声波 6 7 8
  2. void EXTI9_5_IRQnHandler(void)
  3. {                  
  4. //bug警告 此处放入delay_us()函数将导致异常
  5.          if(EXTI_GetITStatus(EXTI_Line5) !=RESET)
  6.          {

  7.                  printf("123 ");
  8.                 EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位
  9.                 }
  10.          if(EXTI_GetITStatus(EXTI_Line6) !=RESET)
  11.          {
  12. //                  if(flag)//如果flag=1,说明外部中断是有效的
  13. //                 {
  14. //                         TIM_Cmd(TIM2, DISABLE);                                                         //定时器2失能
  15. //                         UltrasonicWave_Distance=(float)TIM_GetCounter(TIM2)*0.34/2;                                                                         //计算距离
  16. //                         TIM_SetCounter(TIM2,0);
  17. //                         printf("Distance7:%d mm ",UltrasonicWave_Distance);
  18. //                 }        
  19. //                         flag=0;//回到就绪状态
  20.                          EXTI_ClearITPendingBit(EXTI_Line6); //清除LINE6上的中断标志位
  21.                 }         
  22.         if(EXTI_GetITStatus(EXTI_Line7) !=RESET)
  23.          {

  24.                         EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE7上的中断标志位
  25.                 }
  26. }
复制代码
main函数

  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "key.h"
  4. #include "beep.h"
  5. #include "usart.h"
  6. #include "exti.h"

  7. #include "UltrasonicWave.h"



  8. int main(void)
  9. {
  10.   SystemInit();
  11.         delay_init(72);                  //延时初始化
  12.         NVIC_Configuration();
  13.         uart_init(9600);         //串口初始化
  14.          BEEP_GPIO_Config();
  15.         UltrasonicWave_Configuration();               //对超声波模块初始化

  16.         while(1)
  17.         {
  18.                         BEEP=1;
  19.                         delay_ms(500);
  20.                         BEEP=0;
  21.                          delay_ms(500);
  22.                         printf("OK ");

  23.         }
  24. }
复制代码
小刘的奇怪stm32问题.rar (5.33 MB, 下载次数: 11)

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
tim4146
2019-07-15 11:23
咦,我今晚记得在地铁上明明已经回复你了,现在打开居然没回复了...
已经找到了,答案,绝对匪夷所思啊,我使用了别人的中断服务函数,但是函数名有问题,和系统的是不对应的,正确的是:void EXTI9_5_IRQHandler(void)
我写的是:void EXTI9_5_IRQnHandler(void)看出区别了吗?
这个错误系统不报错的, 一旦不小心还真是看不出来....纠结了我整整一天,只能说吃一堑长一智吧。积分都送你吧,谢谢电子发烧友的朋友们!

一周热门 更多>