1 #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h> 2 #include "stm32f10x_gpio.h" 3 #include "stm32f10x_exti.h" 4 #include "misc.h" 5 /* 6 *K1 K2作为中断源控制红色LED灯,实现任意键按一下LED灯亮或者灭 7 */ 8 /*GPIO、NVIC、EXTI配置*/ 9 int peizhi() 10 { 11 12 /*GPIO配置*/ 13 // K1配置 PA0 14 GPIO_InitTypeDef a; 15 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 16 a.GPIO_Speed=GPIO_Speed_50MHz; 17 a.GPIO_Pin=GPIO_Pin_5; 18 a.GPIO_Mode=GPIO_Mode_Out_PP; 19 GPIO_Init(GPIOB,&a); 20 21 22 /*NVIC嵌套向量中断控制器*/ 23 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 24 NVIC_InitTypeDef b; 25 b.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0_IRQn外部中断线0中断 26 b.NVIC_IRQChannelPreemptionPriority = 1;//0 1 2 3 4 27 b.NVIC_IRQChannelSubPriority = 1;//0 1 2 3 4 28 b.NVIC_IRQChannelCmd = ENABLE; 29 NVIC_Init(&b); 30 31 /*外部中断EXTI配置*/ 32 EXTI_InitTypeDef c; 33 c.EXTI_Line=EXTI_Line0;//外部路线0 和13 34 c.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式 35 c.EXTI_Trigger=EXTI_Trigger_Rising;//上升沿为中断请求 36 c.EXTI_LineCmd=ENABLE;//使能 37 EXTI_Init(&c);//指向结构体EXTI_InitTypeDef的指针a 38 39 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//选择GPIO管脚用作外部中断线路 40 41 42 43 //K2配置 PC13 44 //以下K2的配置基于K1配置的,就是说K2很多配置和K1相同的,只是把不同的配置写下来 45 46 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); 47 GPIO_Init(GPIOB,&a); 48 49 b.NVIC_IRQChannel = EXTI15_10_IRQn; 50 NVIC_Init(&b); 51 52 c.EXTI_Line = EXTI_Line13; 53 EXTI_Init(&c); 54 55 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13); 56 57 } 58 59 60 /*主函数*/ 61 int main(void) 62 { 63 peizhi(); 64 65 } 66 67 /*中断服务函数*/ 68 void EXTI0_IRQHandler(void) 69 { 70 //确保是否产生EXTI line中断 71 if(EXTI_GetITStatus(EXTI_Line0)!=RESET) // 检查指定的EXTI线路触发请求发生与否 72 { 73 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)// 74 { 75 GPIO_SetBits(GPIOB,GPIO_Pin_5); 76 } 77 else 78 { 79 GPIO_ResetBits(GPIOB,GPIO_Pin_5); 80 } 81 EXTI_ClearITPendingBit(EXTI_Line0); 82 } 83 } 84 85 void EXTI15_10_IRQHandler(void) 86 { 87 //确保是否产生EXTI line中断 88 if(EXTI_GetITStatus(EXTI_Line13)!=RESET) // 检查指定的EXTI线路触发请求发生与否 89 { 90 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)// 91 { 92 GPIO_SetBits(GPIOB,GPIO_Pin_5); 93 } 94 else 95 { 96 GPIO_ResetBits(GPIOB,GPIO_Pin_5); 97 } 98 EXTI_ClearITPendingBit(EXTI_Line13); 99 } 100 }