亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 關(guān)于stm32外部中斷時而無法進入的問題分析 [打印本頁]

作者: bro0310    時間: 2020-11-12 16:27
標題: 關(guān)于stm32外部中斷時而無法進入的問題分析
搞了幾天了,找不到原因,不知各路大神是否有遇到類似問題,提供點建議,問題描述如下:
實現(xiàn)功能如下,根據(jù)外部中斷EXTI0、EXTI1來改變某個IO的輸出電平,當此IO輸出電平持續(xù)在低電平1ms以上時,觸發(fā)定時器6,當PD8為低電位時,外部電路隔一段時間后會觸發(fā)EXTI1, 當PD8為高電位時,又會觸發(fā)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;         //設(shè)置為中斷請求,非事件請求
  20.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     //設(shè)置中斷觸發(fā)方式為下降沿觸發(fā)
  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);
復(fù)制代碼
  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. }
復(fù)制代碼

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



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


上圖是PE0和PE1的輸入,黃色是PE0
外部中斷的頻率大約100k,工作在72M的stm32f103vct6 應(yīng)該是可以承受的吧

作者: bro0310    時間: 2020-11-13 18:48
沉了呀,沒有大佬指點下我嗎,糾正個錯誤
“當PD8為低電位時,外部電路隔一段時間后會觸發(fā)EXTI1, 當PD8為高電位時,又會觸發(fā)EXTI0 中斷”
應(yīng)為當PD8為低電位時,外部電路隔一段時間后會觸發(fā)EXTI0, 當PD8為高電位時,又會觸發(fā)EXTI1 中斷
作者: bro0310    時間: 2020-11-13 18:54
沉了,請大佬們關(guān)注指點下,謝謝
糾正個錯誤:“當PD8為低電位時,外部電路隔一段時間后會觸發(fā)EXTI1, 當PD8為高電位時,又會觸發(fā)EXTI0 中斷”應(yīng)為“當PD8為低電位時,外部電路隔一段時間后會觸發(fā)EXTI0, 當PD8為高電位時,又會觸發(fā)EXTI1 中斷”
作者: bro0310    時間: 2020-11-14 11:26
謝謝樓上的朋友幫頂,貼出中斷優(yōu)先級配置
    /* 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;   //搶斷優(yōu)先級3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                     //響應(yīng)優(yōu)先級0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //允許中斷
    NVIC_Init(&NVIC_InitStructure);                                                                //寫入設(shè)置


    /* 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);
作者: bro0310    時間: 2020-11-14 11:42
發(fā)現(xiàn)一點細節(jié)
出現(xiàn)問題進入tim6中斷的前面的情況是,exti0、exti1的中斷在大約1ms的時間沒有得到執(zhí)行,而恢復(fù)執(zhí)行時,tim6的1ms定時時間到了,tim6的中斷子優(yōu)先級大于exti1,所以進了tim6的中斷函數(shù),但是在tim6的中斷函數(shù)的斷點處看到exti1的中斷狀態(tài)位是1,為什么此前的1ms時間內(nèi)一直得不到執(zhí)行呢,它的優(yōu)先級是0,我想到的只有兩種可能,一種是有另一個優(yōu)先級為0的中斷一直占用,一種是發(fā)生了系統(tǒng)fault或NMI,后者通過trace信息查看是不存在的,前者只有exti0的中斷存在這個可能,但從代碼看,exti0中斷在中斷函數(shù)頭尾處都有清除,而且其執(zhí)行時間就1us左右,而硬件測量exti0觸發(fā)周期有接近10us,而且exti0和exti1是交替觸發(fā)的,也就是說exti0觸發(fā)一次后,后續(xù)如果exti1沒有被觸發(fā),那么exti0不會被再次觸發(fā),這點從波形圖也可以看出來,太奇怪了,大佬們幫忙分析分析
作者: bro0310    時間: 2020-11-14 17:44
大佬們太忙了,估計是沒人指點我了,結(jié)帖了,問題湊合解決了,原因只能算是猜測,沒有確切證據(jù):
我測試過exti0中斷函數(shù)執(zhí)行時間接近2us,exti1大約1us出頭,加上進入和退出中斷的時間應(yīng)該在6us以內(nèi),理論上頻率可以到150k,我在模擬環(huán)境上測試就是有漏掉沒執(zhí)行的中斷,上機測試,實際頻率為10K以內(nèi),目前測試4小時以上,無異常,只能理解為頻率高了有些中斷能檢測到邊沿,但是進不去中斷服務(wù)程序,具體原因還沒能力分析。
謝謝關(guān)注和幫頂?shù)呐笥选?hr noshade size="2" width="100%" color="#808080"> 作者: a18222970    時間: 2022-1-27 22:48
樓主,我也想問問,我有個限位器,用的中斷關(guān)閉步進電機使能,問題是這個有時候能觸發(fā)中斷,有時候又不能觸發(fā)中斷.頭都大了
作者: yhfgdgr    時間: 2022-9-18 17:43
bro0310 發(fā)表于 2020-11-13 18:48
沉了呀,沒有大佬指點下我嗎,糾正個錯誤
“當PD8為低電位時,外部電路隔一段時間后會觸發(fā)EXTI1, 當 ...

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




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1