1 #include 'stm32f10x.h' // 相当于51单片机中的 #include
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 }