main.c:
#include "stm32f4xx.h" // Device header
#include "serial.h"
#include "delay.h"
#include "exti.h"
uint16_t exti_count;
int main(void)
{
Serial_Init();
EXTI_InitFunc();
printf("123success");
while (1)
{
printf("exti_count=%d\r\n",exti_count);
if((count%10)==1){
printf("interrupt\r\n");
}
if(exti_count>2000){
exti_count=0;
}
}
}
void EXTI1_IRQHandler(){
if(EXTI_GetITStatus(EXTI_Line1)==SET){
exti_count++;
}
EXTI_ClearITPendingBit(EXTI_Line1);
}
exti.c:
#include "stm32f4xx.h" // Device header
void EXTI_InitFunc(){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_EXTIT,ENABLE);不需要此设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//EXTI需要使用SYSCFG时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
//GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource1);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line1;//如何选择
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStructure);
}