硬件:STM32F103ZET6
1.初始化IO口为输入。
GPIO_Init();
KEY_Init();//初始化IO口为输入
- 开启IO口复用时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启IO口复用时钟
3.设置IO口与中断线的映射关系。
void GPIO_EXTILineConfig();
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//设置IO口与中断线的映射关系
4.初始化线上中断,设置触发条件等。
EXTI_Init();
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断触发
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStruct.EXTI_Line = EXTI_Line4;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
5.配置中断分组(NVIC),并使能中断。
NVIC_Init();
NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
6.编写中断服务函数。
EXTIx_IRQHandler();
7.清除中断标志位
EXTI_ClearITPendingBit();
void EXTI4_IRQHandler(void)
{
delay_ms(10);
if(KEY0 == 0)
{
LED0 = !LED0;
LED1 = !LED1;
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
main函数
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
KEY_Init();
EXIT_Init();
LED0 = 0;
LED1 = 1;
while(1)
{
printf("OK\r\n");
delay_ms(1000);
}
}