stm32f1与外部中断
时间:10-02
整理:3721RD
点击:
新手上路,求大神指导!最近用水位传感器产生一高电平给stm32f1的某一GPIO口产生中断来控制另一GPIO口输出高低电平。但程序下载到单片机测试时,外部中断口不管高低电平都能触发中断,甚至用金属钳子触碰中断输入口导线都会触发中断。求大神指导原因!以下为程序:void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_Init(GPIOA, &GPIO_InitStructure); /*PA11 */
GPIO_ResetBits(GPIOB, GPIO_Pin_15 );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI_ClearITPendingBit(EXTI_Line11);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //抢占式优先级别设置为无抢占优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //指定中断源
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; 指定占先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line11) !=RESET)
{
//添加中断处理程序
GPIO_SetBits(GPIOB , GPIO_Pin_15);
delay_ms(1000);
GPIO_ResetBits(GPIOB, GPIO_Pin_15);
delay_ms(1000);
EXTI_ClearFlag(EXTI_Line11); //清除中断标志(必须)
EXTI_ClearITPendingBit(EXTI_Line11);
}
}
/*************************************************
函数: int main(void)
功能: main主函数
参数: 无
返回: 无
**************************************************/
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
EXTI_Configuration();
delay_init(72);
while (1) ;
}
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_Init(GPIOA, &GPIO_InitStructure); /*PA11 */
GPIO_ResetBits(GPIOB, GPIO_Pin_15 );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI_ClearITPendingBit(EXTI_Line11);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //抢占式优先级别设置为无抢占优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //指定中断源
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; 指定占先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line11) !=RESET)
{
//添加中断处理程序
GPIO_SetBits(GPIOB , GPIO_Pin_15);
delay_ms(1000);
GPIO_ResetBits(GPIOB, GPIO_Pin_15);
delay_ms(1000);
EXTI_ClearFlag(EXTI_Line11); //清除中断标志(必须)
EXTI_ClearITPendingBit(EXTI_Line11);
}
}
/*************************************************
函数: int main(void)
功能: main主函数
参数: 无
返回: 无
**************************************************/
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
EXTI_Configuration();
delay_init(72);
while (1) ;
}
