
void PC13_14_15_Gpio(void)//PC13 PC14 PC15配置为普通IO浮空外部上拉输入 { RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE ); PWR_BackupAccessCmd( ENABLE );/* 允许修改RTC和后备寄存器*/ RCC_LSEConfig( RCC_LSE_OFF ); /* 关闭外部低速时钟,PC14+PC15可以用作普通IO*/ BKP_TamperPinCmd(DISABLE); /* 关闭入侵检测功能,PC13可以用作普通IO*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //外部上拉,浮空输入 GPIO_Init(GPIOC, &GPIO_InitStructure); PWR_BackupAccessCmd(DISABLE);/* 禁止修改RTC和后备寄存器*/ //BKP_ITConfig(DISABLE); ? ? ? /* 禁止TAMPER 中断*/ } void EXTI0_Config(void)//外部中断配置 { /* Enable GPIOA clock */ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line13|EXTI_Line14|EXTI_Line15; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI15_10_IRQHandler(void) //即使PC13 PC14 PC15电平没有变化,也一直进中断 { if(EXTI_GetITStatus(EXTI_Line13|EXTI_Line14|EXTI_Line15)!=RESET)// { EXTI_ClearITPendingBit(EXTI_Line13|EXTI_Line14|EXTI_Line15); //即使PC13 PC14 PC15脚电平没有变化,也一直进外部中断 } } 各位大佬,我这个是用PC13 PC14 PC15作为外部中断输入口的配置,有外部上拉电阻,为什么会一直进中断,即使外部电平没有变化 |
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15);
注意这句代码,GPIO_PinSource15不是位的关系。
谢谢,等后面试试
好的,谢谢,等后面试试
EXTI_ClearITPendingBit(EXTI_Line6);
EXTI_ClearITPendingBit(EXTI_Line7);
EXTI_ClearITPendingBit(EXTI_Line8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource7);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource8);
EXTI_InitStructure.EXTI_Line = EXTI_Line6 | EXTI_Line7 | EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
void EXTI9_5_IRQHandler()
{
TIM_CtrlPWMOutputs(TIM1, DISABLE);
if(EXTI_GetITStatus(EXTI_Line6)==1)
EXTI_ClearITPendingBit(EXTI_Line6);//Clear Interrupt Flag
if(EXTI_GetITStatus(EXTI_Line7)==1)
EXTI_ClearITPendingBit(EXTI_Line7);//Clear Interrupt Flag
if(EXTI_GetITStatus(EXTI_Line8)==1)
EXTI_ClearITPendingBit(EXTI_Line8);//Clear Interrupt Flag
Hall_SW();
EXTI1TickCnt3++;
}
之前出现过频繁进入中断的问题,进入中断后把标志位清掉就可以了。