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 }