void Encoder_Init(void)
{
? ? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);
? ? ?GPIO_InitTypeDef GPIO_InitStructure;
? ? ?EXTI_InitTypeDef EXTI_InitStructure = {0};
? ? ?NVIC_InitTypeDef NVIC_InitStructure = {0};
? ? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
? ? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉輸入模式
? ? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置引腳速率為50MHz
? ? ?GPIO_Init(GPIOC, &GPIO_InitStructure);
? ? ?GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);
? ? ? ? ?// 配置EXTI Line0
? ? ?EXTI_InitStructure.EXTI_Line = EXTI_Line3;
? ? ?EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
? ? ?EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 觸發(fā)下降沿中斷
? ? ?EXTI_InitStructure.EXTI_LineCmd = ENABLE;
? ? ?EXTI_Init(&EXTI_InitStructure);
? ? ? ? ?// 配置并使能EXTI 1 2 3 中斷
? ? ?NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
? ? ?NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
? ? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
? ? ?NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
? ? ?NVIC_Init(&NVIC_InitStructure);
}
這里配置GPIOC_Pin_3中斷。
void New_Encoder_Init(void)
{
? ? ? ? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
? ? ? ? ?GPIO_InitTypeDef GPIO_InitStructure;
? ? ? ? ?EXTI_InitTypeDef EXTI_InitStructure = {0};
? ? ? ? ?NVIC_InitTypeDef NVIC_InitStructure = {0};
? ? ? ? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_0;
? ? ? ? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉輸入模式
? ? ? ? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置引腳速率為50MHz
? ? ? ? ?GPIO_Init(GPIOA, &GPIO_InitStructure);
? ? ? ? ?GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
? ? ? ? ? ? ?// 配置EXTI Line0
? ? ? ? ?EXTI_InitStructure.EXTI_Line = EXTI_Line0;
? ? ? ? ?EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
? ? ? ? ?EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 觸發(fā)下降沿中斷
? ? ? ? ?EXTI_InitStructure.EXTI_LineCmd = ENABLE;
? ? ? ? ?EXTI_Init(&EXTI_InitStructure);
? ? ? ? ? ? ?// 配置并使能EXTI 1 2 3 中斷
? ? ? ? ?NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
? ? ? ? ?NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
? ? ? ? ?NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
? ? ? ? ?NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
? ? ? ? ?NVIC_Init(&NVIC_InitStructure);
}
這里是GPIOA_Pin_0的中斷
? ??
上面是gpioa的中斷處理函數(shù)
這個是GPIOC_3的中斷處理函數(shù)。(上面有一個錯誤,把while循環(huán)寫入到if里面,其實不和下面一樣也行,這里改成一樣)。然后EXTIO0的中斷進入一次,再按下按鍵,會進入hardfault錯誤,然后exti3沒有問題啊。然后然后新建一個工程,exti3和exti0,反正不管怎么怎么測,都只能進入一次。然后兩個都整合一次,有一個沒有反應(yīng)。
又開一個新的,然后也是只能進入一次,然后程序會reset好像是的,我再最開始按鍵初始化打了一個斷點,我發(fā)現(xiàn)進入中斷,再次運行,還會重復進入這個按鍵初始化的函數(shù)(原本打了一個端點)。這什么原因啊???
求求大佬幫俺分析分析。