搞了幾天了,找不到原因,不知各路大神是否有遇到類似問題,提供點建議,問題描述如下:
實現功能如下,根據外部中斷EXTI0、EXTI1來改變某個IO的輸出電平,當此IO輸出電平持續在低電平1ms以上時,觸發定時器6,當PD8為低電位時,外部電路隔一段時間后會觸發EXTI1, 當PD8為高電位時,又會觸發EXTI0 中斷
STM32外部中斷配置:
- void EXTI_Configuration()
- {
- EXTI_InitTypeDef EXTI_InitStructure;
- 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
- /* Configure the NVIC Preemption Priority Bits */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- EXTI_ClearITPendingBit(EXTI_Line0);
- EXTI_ClearITPendingBit(EXTI_Line1);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
- EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1; //選擇中斷線路0 1
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設置為中斷請求,非事件請求
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //設置中斷觸發方式為下降沿觸發
- EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中斷使能
- EXTI_Init(&EXTI_InitStructure);
- EXTI->IMR&=~(1|1<<1);
- /*允許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);
復制代碼- void EXTI0_IRQHandler(void)
- {
- if (RESET!=(EXTI->PR&EXTI_Line0))
- {
- EXTI->PR = EXTI_Line0;
- if (RESET!=(EXTI->IMR&EXTI_Line0))
- {
- TAG.FbCurcuit1 = 1;
- GPIOD->BSRR = GPIO_Pin_8;
- if (0==Hall1)
- {
- EXTI->IMR&=~(EXTI_Line0);
- TIM6->SR = (uint16_t)~TIM_IT_Update;
- TIM6->CR1 &= ((uint16_t)~TIM_CR1_CEN);
- Hall1 = 1;
- }
- else
- {
- TIM6->CNT = 0;
- TIM6->SR = (uint16_t)~TIM_IT_Update;
- TIM6->CR1 |= TIM_CR1_CEN;
- }
- }
- EXTI->PR = EXTI_Line0;
- }
- }
- void EXTI1_IRQHandler(void)
- {
- if (RESET!=(EXTI->PR&EXTI_Line1))
- {
- EXTI->PR = EXTI_Line1;
- if (RESET!=(EXTI->IMR&EXTI_Line1))
- {
- GPIOD->BRR = GPIO_Pin_8;
- TIM6->SR = (uint16_t)~TIM_IT_Update;
- TIM6->CR1 &= ((uint16_t)~TIM_CR1_CEN);
- }
- EXTI->PR = EXTI_Line1;
- }
- }
復制代碼
啟動這個功能后,運行一段時間后,會進入定時器6的中斷,跟蹤發現是某個EXTI1中斷沒有得到執行,檢查了所有相關的配置以及設計到相關IO操作的地方,沒有發現異常,現貼出部分跟蹤數據:
0.png (21.39 KB, 下載次數: 73)
下載附件
2020-11-12 16:20 上傳
1.png (7.09 KB, 下載次數: 61)
下載附件
2020-11-12 16:20 上傳
在TIM6中斷服務程序入口處設置斷點,從上面截圖中可以看到 EXTI1 中斷標志位PR1 是有被置位的, 但EXTI0 EXTI1 最后一次觸發時間是418.00248863, ,而TIM6觸發是在 418.00408187, , 可見是因為EXTI1未得到執行從而導致TIM6未關閉而進入了TIM6中斷,此時外部中斷PR1已經是置位的,為什么EXTI1有發生中斷卻進不了中斷函數呢,而前面卻一直可以進去
3.jpg (93.49 KB, 下載次數: 83)
下載附件
2020-11-12 16:20 上傳
上圖是PE0和PE1的輸入,黃色是PE0
外部中斷的頻率大約100k,工作在72M的stm32f103vct6 應該是可以承受的吧
|