OpenEdv-开源电子网

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

f103vct6 外部中断运行一段时间后无法进入

[复制链接]

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-13
在线时间
4 小时
发表于 2020-11-12 17:37:25 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 bro0310 于 2020-11-13 17:49 编辑

搞了几天了,找不到原因,不知各路大神是否有遇到类似问题,指导一下,问题描述如下:
根据外部中断EXTI0、EXTI1来改变某PD8的输出电平,当此IO输出电平持续在低电平1ms以上时,触发定时器6,当PD8为低电位时,外部电路隔一段时间后会触发EXTI0, 当PD8为高电位时,又会触发EXTI1 中断,理论上开启后如果不关闭外部中断,会输出PD8循环振荡,单工作一段时间后,输出停止了
  1. void EXTI_Configuration()
  2. {
  3.     EXTI_InitTypeDef EXTI_InitStructure;
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5. #ifdef   VECT_TAB_RAM
  6.     /* Set the Vector Table base location at 0x20000000 */
  7.     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  8. #else   /* VECT_TAB_FLASH   */
  9.     /* Set the Vector Table base location at 0x08000000 */
  10.     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  11. #endif

  12.     /* Configure the NVIC Preemption Priority Bits */  
  13.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


  14.     EXTI_ClearITPendingBit(EXTI_Line0);
  15.     EXTI_ClearITPendingBit(EXTI_Line1);
  16.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
  17.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
  18.     EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;     //选择中断线路0 1


  19.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //设置为中断请求,非事件请求
  20.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     //设置中断触发方式为下降沿触发
  21.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //外部中断使能
  22.     EXTI_Init(&EXTI_InitStructure);
  23.     EXTI->IMR&=~(1|1<<1);

  24.     /*允许EXTI0中断 */
  25.     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  26.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  27.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  28.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  29.     NVIC_Init(&NVIC_InitStructure);

  30.     /*允许EXTI1中断 */
  31.     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  32.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  33.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  34.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  35.     NVIC_Init(&NVIC_InitStructure);


  36. void EXTI0_IRQHandler(void)
  37. {
  38. if (RESET!=(EXTI->PR&EXTI_Line0))
  39. {
  40.         EXTI->PR = EXTI_Line0;
  41.         if (RESET!=(EXTI->IMR&EXTI_Line0))
  42.         {
  43.             TAG.FbCurcuit1 = 1;
  44.             GPIOD->BSRR = GPIO_Pin_8;
  45.             if (0==Hall1)
  46.             {
  47.                 EXTI->IMR&=~(EXTI_Line0);
  48.                 TIM6->SR = (uint16_t)~TIM_IT_Update;
  49.                 TIM6->CR1 &= ((uint16_t)~TIM_CR1_CEN);
  50.                 Hall1 = 1;
  51.             }
  52.             else
  53.             {
  54.                 TIM6->CNT = 0;
  55.                 TIM6->SR = (uint16_t)~TIM_IT_Update;
  56.                 TIM6->CR1 |= TIM_CR1_CEN;
  57.             }
  58.         }
  59.         EXTI->PR = EXTI_Line0;
  60.     }
  61. }

  62. void EXTI1_IRQHandler(void)
  63. {
  64.     if (RESET!=(EXTI->PR&EXTI_Line1))
  65.     {
  66.         EXTI->PR = EXTI_Line1;
  67.         if (RESET!=(EXTI->IMR&EXTI_Line1))
  68.         {
  69.             GPIOD->BRR = GPIO_Pin_8;
  70.             TIM6->SR = (uint16_t)~TIM_IT_Update;
  71.             TIM6->CR1 &= ((uint16_t)~TIM_CR1_CEN);
  72.         }
  73.         EXTI->PR = EXTI_Line1;
  74.     }
  75. }
复制代码
启动这个功能后,运行一段时间后,会进入定时器6的中断,跟踪发现是某个EXTI1中断没有得到执行,检查了所有相关的配置以及设计到相关IO操作的地方,没有发现异常,现贴出部分跟踪数据:
1.png
0.png
在TIM6中断服务程序入口处设置断点,从上面截图中可以看到 EXTI1 中断标志位PR1 是有被置位的, 但EXTI0 EXTI1 最后一次触发时间是418.00248863,  ,而TIM6触发是在 418.00408187, , 可见是因为EXTI1未得到执行从而导致TIM6未关闭而进入了TIM6中断,此时外部中断PR1已经是置位的,为什么EXTI1有发生中断却进不了中断函数呢,而开始是可以进去的呢
3.jpg
上图是PE0和PE1的输入,黄色是PE0,新人没分,还请大神们不吝赐教
补充一下  exti0服务程序中  Hall1分支各位看官可以忽略,  进入前其值为1

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

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-11-13 16:22:32 | 显示全部楼层
中断优先级怎么配置的,看看配置是否合理
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-13
在线时间
4 小时
 楼主| 发表于 2020-11-13 17:04:31 | 显示全部楼层
本帖最后由 bro0310 于 2020-11-13 17:06 编辑
三叶草 发表于 2020-11-13 16:22
中断优先级怎么配置的,看看配置是否合理

    /* Enable the USART1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
        
    /* Enable the UART4 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
               
    /* Enable the TIM2 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;   //抢断优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                     //响应优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //允许中断
    NVIC_Init(&NVIC_InitStructure);                                                                //写入设置


    /* Enable the TIM3 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /* Enable the TIM4 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);        

     /*允许EXTI0中断 */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /*允许EXTI1中断 */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    /* Enable the TIM6 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;       
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-13
在线时间
4 小时
 楼主| 发表于 2020-11-13 17:30:20 | 显示全部楼层
谢谢关注,花了好长时间单步  刚执行完exti0中断   就进入了tim6中断  而exti0 中断里面清了tim6计数和挂起标识,然后才开启的计数器,从我贴的波形图可以看出,外部中断的周期很准确的在20us左右,而tim6定时为1000us, 按理来说tim6不会触发中断(虽然说单步确实进去了,但我对单步结果持怀疑态度,毕竟时序和真实情况不一样),单步的时候真实情况是tim6的ARR为0xC8, 而从exti0中断单步出来时,并没有进其它中断子程序的情况下, tim6的CNT值是不等的值,最大为A9,按理来说刚出来应为0了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 10:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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