STM32中断

时间:2022-12-21 21:56:04

void EXTI_INIT(void)

{

GPIO_InitTypeDef GPIO_InitStruct;  //GPIO结构体名称

EXTI_InitTypeDef EXTI_InitStruct; //EXTID中断结构体名称

NVIC_InitTypeDef NVIC_InitStruct; //NVIC结构体名称

//GPIO时钟开启

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 //AFIO时钟开启

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

//GPIO初始化

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;

GPIO_Init(GPIOA, &GPIO_InitStruct);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_Pin_4);//GPIO中断源选择

//nvic组选择 组包含抢站优先级 子优先级的配置

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

//NVIC配置

NVIC_InitStruct.NVIC_IRQChannel= EXTI4_IRQn;  //中断选择  5-9和10-15共用函数和此参数 若需要判断5-9和10-15那个产生了中断,可根据检测中断的LINE进行判断

NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;

NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

NVIC_Init(&NVIC_InitStruct);

//中断配置

 EXTI_InitStruct.EXTI_Line=EXTI_Line4;   //和PA4=EXTI_Line4想应

EXTI_InitStruct.EXTI_LineCmd=ENABLE;

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//中断OR事件

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//沿检测,上,下,上/下

EXTI_Init(&EXTI_InitStruct);

}

中断服务函数在启动文件中

void EXTI4_IRQHandler(void)

{

 if(EXTI_GetITStatus(EXTI_Line4)==1)//检测是否产生中断

 {

 

  GPIO_ResetBits(GPIOB,GPIO_Pin_0);

  systick_s(1);

  GPIO_SetBits(GPIOB,GPIO_Pin_0);

  systick_s(1);

 }

EXTI_ClearITPendingBit(EXTI_Line4);//清除中断标志位

}


备注;5-9和10-15共用函数和此参数 若需要判断5-9和10-15那个产生了中断,可根据检测中断的LINE进行判断

如PA0,PB0.PC0,PD0共用LINE,则需要使用GPIO的READINPUTBIT(按钮输入函数)来检测是那个产生的中断。