NVIC_InitTypeDef NVICINIT;
EXTI_InitTypeDef EXTIINIT;
void my_SYSCLK_init()
{
RCC_HSEConfig(RCC_HSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE); //时钟没问题,测试过了,led灯能亮
}
void my_GPIOinit()
{GPIO_InitTypeDef init;
init.GPIO_Pin =GPIO_Pin_8;
init.GPIO_Mode =GPIO_Mode_Out_PP;
init.GPIO_Speed=GPIO_Speed_50MHz; //led0灭    A8
GPIO_Init(GPIOA,&init);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
init.GPIO_Pin=GPIO_Pin_2; //led1灭    D2
init.GPIO_Speed=GPIO_Speed_50MHz;
init.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&init);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
init.GPIO_Pin=GPIO_Pin_15; //pa15 pa13 上拉输入    A13 PA15
init.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&init);
init.GPIO_Pin=GPIO_Pin_13;
init.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&init);
}
void my_exti_init()
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置组1
NVICINIT.NVIC_IRQChannel=EXTI15_10_IRQn;
NVICINIT.NVIC_IRQChannelPreemptionPriority=0; //配置外部中断优先级,并使能中断
NVICINIT.NVIC_IRQChannelSubPriority=2;
NVICINIT.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVICINIT);
EXTIINIT.EXTI_Line=EXTI_Line13 ;
EXTIINIT.EXTI_Mode=EXTI_Mode_Interrupt;
EXTIINIT.EXTI_Trigger=EXTI_Trigger_Falling; //初始化外部中断13为下降沿触发
EXTI_Init(&EXTIINIT);
EXTIINIT.EXTI_Line=EXTI_Line15 ;
EXTIINIT.EXTI_Mode=EXTI_Mode_Interrupt;
EXTIINIT.EXTI_Trigger=EXTI_Trigger_Falling; //初始化外部中断15为下降沿触发
EXTI_Init(&EXTIINIT);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15); //初始化外部中断15为PA15口
EXTI_GenerateSWInterrupt(EXTI_Line13);
EXTI_GenerateSWInterrupt(EXTI_Line15); //软件中断
}
main()
{my_SYSCLK_init();
my_GPIOinit();
my_exti_init();
while(1);
}
it.c的函数
void EXTI15_10_IRQHandler()
{ GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET); //让 led0亮    A8 用于测试中断是否进入
if(EXTI_GetITStatus(EXTI_Line15))
{
EXTI_ClearITPendingBit(EXTI_Line15);
}
if(EXTI_GetITStatus(EXTI_Line13))
{
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
|