欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6861|回復: 7
打印 上一主題 下一主題
收起左側

關于stm32外部中斷時而無法進入的問題分析

[復制鏈接]
跳轉到指定樓層
樓主
ID:230118 發表于 2020-11-12 16:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
搞了幾天了,找不到原因,不知各路大神是否有遇到類似問題,提供點建議,問題描述如下:
實現功能如下,根據外部中斷EXTI0、EXTI1來改變某個IO的輸出電平,當此IO輸出電平持續在低電平1ms以上時,觸發定時器6,當PD8為低電位時,外部電路隔一段時間后會觸發EXTI1, 當PD8為高電位時,又會觸發EXTI0 中斷

STM32外部中斷配置:
  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);
復制代碼
  1. void EXTI0_IRQHandler(void)
  2. {
  3. if (RESET!=(EXTI->PR&EXTI_Line0))
  4. {
  5.         EXTI->PR = EXTI_Line0;
  6.         if (RESET!=(EXTI->IMR&EXTI_Line0))
  7.         {
  8.             TAG.FbCurcuit1 = 1;
  9.             GPIOD->BSRR = GPIO_Pin_8;
  10.             if (0==Hall1)
  11.             {
  12.                 EXTI->IMR&=~(EXTI_Line0);
  13.                 TIM6->SR = (uint16_t)~TIM_IT_Update;
  14.                 TIM6->CR1 &= ((uint16_t)~TIM_CR1_CEN);
  15.                 Hall1 = 1;
  16.             }
  17.             else
  18.             {
  19.                 TIM6->CNT = 0;
  20.                 TIM6->SR = (uint16_t)~TIM_IT_Update;
  21.                 TIM6->CR1 |= TIM_CR1_CEN;
  22.             }
  23.         }
  24.         EXTI->PR = EXTI_Line0;
  25.     }
  26. }

  27. void EXTI1_IRQHandler(void)
  28. {
  29.     if (RESET!=(EXTI->PR&EXTI_Line1))
  30.     {
  31.         EXTI->PR = EXTI_Line1;
  32.         if (RESET!=(EXTI->IMR&EXTI_Line1))
  33.         {
  34.             GPIOD->BRR = GPIO_Pin_8;
  35.             TIM6->SR = (uint16_t)~TIM_IT_Update;
  36.             TIM6->CR1 &= ((uint16_t)~TIM_CR1_CEN);
  37.         }
  38.         EXTI->PR = EXTI_Line1;
  39.     }
  40. }
復制代碼

啟動這個功能后,運行一段時間后,會進入定時器6的中斷,跟蹤發現是某個EXTI1中斷沒有得到執行,檢查了所有相關的配置以及設計到相關IO操作的地方,沒有發現異常,現貼出部分跟蹤數據:



在TIM6中斷服務程序入口處設置斷點,從上面截圖中可以看到 EXTI1 中斷標志位PR1 是有被置位的, 但EXTI0 EXTI1 最后一次觸發時間是418.00248863,  ,而TIM6觸發是在 418.00408187, , 可見是因為EXTI1未得到執行從而導致TIM6未關閉而進入了TIM6中斷,此時外部中斷PR1已經是置位的,為什么EXTI1有發生中斷卻進不了中斷函數呢,而前面卻一直可以進去


上圖是PE0和PE1的輸入,黃色是PE0
外部中斷的頻率大約100k,工作在72M的stm32f103vct6 應該是可以承受的吧
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:230118 發表于 2020-11-13 18:48 | 只看該作者
沉了呀,沒有大佬指點下我嗎,糾正個錯誤
“當PD8為低電位時,外部電路隔一段時間后會觸發EXTI1, 當PD8為高電位時,又會觸發EXTI0 中斷”
應為當PD8為低電位時,外部電路隔一段時間后會觸發EXTI0, 當PD8為高電位時,又會觸發EXTI1 中斷
回復

使用道具 舉報

板凳
ID:230118 發表于 2020-11-13 18:54 | 只看該作者
沉了,請大佬們關注指點下,謝謝
糾正個錯誤:“當PD8為低電位時,外部電路隔一段時間后會觸發EXTI1, 當PD8為高電位時,又會觸發EXTI0 中斷”應為“當PD8為低電位時,外部電路隔一段時間后會觸發EXTI0, 當PD8為高電位時,又會觸發EXTI1 中斷”
回復

使用道具 舉報

地板
ID:230118 發表于 2020-11-14 11:26 | 只看該作者
謝謝樓上的朋友幫頂,貼出中斷優先級配置
    /* Configure the NVIC Preemption Priority Bits */  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_SetPriority(SysTick_IRQn, 2);

    /*NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);*/

    /* 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);       

    NVIC_InitStructure.NVIC_IRQChannel = TIM5_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);
回復

使用道具 舉報

5#
ID:230118 發表于 2020-11-14 11:42 | 只看該作者
發現一點細節
出現問題進入tim6中斷的前面的情況是,exti0、exti1的中斷在大約1ms的時間沒有得到執行,而恢復執行時,tim6的1ms定時時間到了,tim6的中斷子優先級大于exti1,所以進了tim6的中斷函數,但是在tim6的中斷函數的斷點處看到exti1的中斷狀態位是1,為什么此前的1ms時間內一直得不到執行呢,它的優先級是0,我想到的只有兩種可能,一種是有另一個優先級為0的中斷一直占用,一種是發生了系統fault或NMI,后者通過trace信息查看是不存在的,前者只有exti0的中斷存在這個可能,但從代碼看,exti0中斷在中斷函數頭尾處都有清除,而且其執行時間就1us左右,而硬件測量exti0觸發周期有接近10us,而且exti0和exti1是交替觸發的,也就是說exti0觸發一次后,后續如果exti1沒有被觸發,那么exti0不會被再次觸發,這點從波形圖也可以看出來,太奇怪了,大佬們幫忙分析分析

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

6#
ID:230118 發表于 2020-11-14 17:44 | 只看該作者
大佬們太忙了,估計是沒人指點我了,結帖了,問題湊合解決了,原因只能算是猜測,沒有確切證據:
我測試過exti0中斷函數執行時間接近2us,exti1大約1us出頭,加上進入和退出中斷的時間應該在6us以內,理論上頻率可以到150k,我在模擬環境上測試就是有漏掉沒執行的中斷,上機測試,實際頻率為10K以內,目前測試4小時以上,無異常,只能理解為頻率高了有些中斷能檢測到邊沿,但是進不去中斷服務程序,具體原因還沒能力分析。
謝謝關注和幫頂的朋友。
回復

使用道具 舉報

7#
ID:107913 發表于 2022-1-27 22:48 | 只看該作者
樓主,我也想問問,我有個限位器,用的中斷關閉步進電機使能,問題是這個有時候能觸發中斷,有時候又不能觸發中斷.頭都大了
回復

使用道具 舉報

8#
ID:1045113 發表于 2022-9-18 17:43 | 只看該作者
bro0310 發表于 2020-11-13 18:48
沉了呀,沒有大佬指點下我嗎,糾正個錯誤
“當PD8為低電位時,外部電路隔一段時間后會觸發EXTI1, 當 ...

現在我也遇到了這種情況,剛開始運行時可以進中斷 一段時間后卡死不進中斷
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表