3、STM32F0系列学习之—中断和事件


【STM32F0系列学习】之—中断和事件

  • 1、什么是“中断”
  • 2、中断优先级
  • 3、中断嵌套
  • 4、嵌套向量中断控制器 (NVIC)
  • 5、中断与事件的区别和主要特性
  • 6、外部中断(EXTI)配置
    • 6.1【标准库】的配置方式
    • 6.2【HAL库】的配置方式

1、什么是“中断”

CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。
中断示意图

2、中断优先级

所谓中断优先级,是指当中断来临时,CPU应该先执行哪个中断服务程序,不同中断再CPU看来重要程度是不一样的,高优先级的中断服务程序应被优先执行。中断的优先级分为两种,一种是硬件优先级,即芯片厂家出厂时就规定了哪些外设的中断优先级高,哪些的中断优先级低;第二种是软件优先级,指用户可以通过程序配置来修改中断优先级,一般主要是将硬件上低优先级的中断进行提高。当同一时间点有两个或以上中断同时来临时,系统会优先选择中断优先级高的中断服务函数进行执行,当软件的中断优先级一样时,会根据硬件中断优先级高的执行中断服务函数。中断优先级:0~3,数越小优先级越高

3、中断嵌套

上面第一点说只是说明了常规中断的含义,总结就是,在主程序运行期间产生中断需要先暂停执行主程序,转去执行中断服务程序,当中断服务程序执行完成后再返回到刚才主程序暂停的地方继续向下执行主程序。而中断嵌套,则是指在第一个中断服务程序还没执行完成的时候又来了一个中断优先级比当前中断高的中断,把当前中断服务程序暂停,转而去执行中断优先级更高的中断服务程序,当高优先级的中断程序执行完成后,再返回到次优先级的中断程序暂停点执行,然后再返回主程序暂停点继续执行主程序下面的内容。
在这里插入图片描述

4、嵌套向量中断控制器 (NVIC)

STM32系列单片机内部有一个嵌套向量中断控制器 (NVIC)控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M0 内核里面的 NVIC 进行裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M0 的 NVIC 的一个子集。

NVIC 主要特性
● 32 个可屏蔽中断通道 ( 不包含 16 个 Cortex-M0 的中断线 )
● 4 个可编程的优先级 ( 使用了 2 位的中断优先级 )
● 低延时的异常和中断处理
● 电源管理控制
● 系统控制寄存器的实现

5、中断与事件的区别和主要特性

区别:
(1)中断: 需要CPU参与处理才能完成任务。

(2)事件:
事件机制提供了一个完全由硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法;

主要特性:
● 支持产生多达 28 个事件 / 中断请求 ; 外部21条,内部7条;
● 作为外部或内部事件请求的每一线都可独立配置;
● 每个事件 / 中断线都有独立的屏蔽;
● 当系统不处于停机 (STOP) 模式时自动禁止内部各线;
● 独立触发外部事件 / 中断线 ;
● 每个外部中断线都有专用的状态位;
● 仿真所有的外部事件请求。
● 可以选择4种中断优先级(0~3)

中断向量表
中断向量表1
中断向量表2
中断向量表3
中断/事件 配置使用说明
要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1 ’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’ 1 ’。在挂起寄存器的对应位写’ 1 ’,将清除该中断请求。
对于内部中断线,触发沿都为上升沿,中断屏蔽寄存器相应值使能这些中断,但内部中断线没有相应的挂起位。
如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置 2 个触发寄存器,同时在事件屏蔽寄存器的相应位写’ 1 ’允许事件请求。当事件线上发生了期待的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’ 1 ’。
对于外部中断线,一个中断 / 事件请求也可由软件对相应的软件中断 / 事件寄存器位写’ 1 ’来产生。

6、外部中断(EXTI)配置

6.1【标准库】的配置方式

其实EXIT外部引脚中断的原理很简单,配置相应引脚为输入模式,根据电路看是否需要上下拉电阻,将该引脚通过SYSCFG配置为中断线,再配置NVIC,编写中断处理的事情即可。下面以配置 PA0引脚作为按键的输入检测脚为例,即按键检测使用外部中断方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
/*----------------------------------------- led.h -----------------------------------------*/
/**
  *********************************  STM32F0xx  ********************************
  * @文件名     : led.h
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : LED驱动头文件
  ******************************************************************************/

/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _LED_H
#define _LED_H

/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"

/* 宏定义 --------------------------------------------------------------------*/
#define LED_PORT                  GPIOC                    //LED端口
#define LED_1_PIN                 GPIO_Pin_6               //LED1
#define LED_R_PIN                 GPIO_Pin_7               //LED_R
#define LED_G_PIN                 GPIO_Pin_8               //LED_G
#define LED_B_PIN                 GPIO_Pin_9               //LED_B

#define LED_1_ON                  GPIO_ResetBits(LED_PORT,LED_1_PIN)        //点亮LED1
#define LED_1_OFF                 GPIO_SetBits(LED_PORT,LED_1_PIN)          //熄灭LED1
#define LED_1_TOGGLE              (LED_PORT->ODR ^= LED_1_PIN)              //LED1取反

#define LED_R_ON                  GPIO_ResetBits(LED_PORT,LED_R_PIN)        //点亮LED_R
#define LED_R_OFF                 GPIO_SetBits(LED_PORT,LED_R_PIN)          //熄灭LED_R
#define LED_R_TOGGLE              (LED_PORT->ODR ^= LED_R_PIN)              //LED_R取反

#define LED_G_ON                  GPIO_ResetBits(LED_PORT,LED_G_PIN)        //点亮LED_G
#define LED_G_OFF                 GPIO_SetBits(LED_PORT,LED_G_PIN)          //熄灭LED_G
#define LED_G_TOGGLE              (LED_PORT->ODR ^= LED_G_PIN)              //LED_G取反

#define LED_B_ON                  GPIO_ResetBits(LED_PORT,LED_B_PIN)        //点亮LED_B
#define LED_B_OFF                 GPIO_SetBits(LED_PORT,LED_B_PIN)          //熄灭LED_B
#define LED_B_TOGGLE              (LED_PORT->ODR ^= LED_B_PIN)              //LED_B取反

/* 函数申明 ------------------------------------------------------------------*/
void LED_Configuration(void);

#endif /* _LED_H */

/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- led.c -----------------------------------------*/
/**
  ********************************  STM32F0xx  *********************************
  * @文件名     : led.c
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : LED驱动源文件
  ******************************************************************************/
/*----------------------------------------------------------------------------
  更新日志:
  2020-06-24 V1.0.0:初始版本
  ----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "led.h"

/************************************************
函数名称 : LED_Configuration
功    能 : LED引脚配置
参    数 : 无
返 回 值 : 无
作    者 : JayYang
*************************************************/
void LED_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = LED_1_PIN;                           //LED1引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                      //输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //高速输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推完输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉
  GPIO_Init(LED_PORT, &GPIO_InitStructure);
}

/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- exti.h -----------------------------------------*/
/**
  *********************************  STM32F0xx  ********************************
  * @文件名     : exti.h
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : 外部中断头文件
  ******************************************************************************/

/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _EXTI_H
#define _EXTI_H

/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"

/* 宏定义 --------------------------------------------------------------------*/
#define KEY_1_2_PORT              GPIOC             //端口
#define KEY_1_PIN                 GPIO_Pin_12       //KEY1
#define KEY_2_PIN                 GPIO_Pin_13       //KEY2

#define KEY_3_4_PORT              GPIOB             //端口
#define KEY_3_PIN                 GPIO_Pin_0        //KEY3
#define KEY_4_PIN                 GPIO_Pin_1        //KEY4

/* 函数申明 ------------------------------------------------------------------*/
void EXTI_Configuration(void);

#endif /* _EXTI_H */

/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- exti.c -----------------------------------------*/
/**
  ********************************  STM32F0xx  *********************************
  * @文件名     : exti.c
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : 外部中断源文件
  ******************************************************************************/
/*----------------------------------------------------------------------------
  更新日志:
  2020-06-24 V1.0.0:初始版本
  ----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "exti.h"

/************************************************
函数名称 : EXTI_Configuration
功    能 : 外部中断配置
参    数 : 无
返 回 值 : 无
作    者 : JayYang
*************************************************/
void EXTI_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

    /* EXTI引脚的基本配置 */
    GPIO_InitStructure.GPIO_Pin = KEY_1_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(KEY_1_2_PORT, &GPIO_InitStructure);
   
    /* EXTI外部中断线配置 */
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;               //配置外部中断线0
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;      //配置为中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  //配置中断的触发边沿为下降沿
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                //使能中断线
    EXTI_Init(&EXTI_InitStructure);                          //初始化外部中断
   
    /* 系统控制器 */
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
}


/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/

/*----------------------------------------- bsp.h -----------------------------------------*/
/**
  *********************************  STM32F0xx  ********************************
  * @文件名     : bsp.h
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : BSP板级支持包头文件
  ******************************************************************************/

/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _BSP_H
#define _BSP_H

/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"

#include "led.h"
#include "exti.h"


/* 宏定义 --------------------------------------------------------------------*/


/* 函数申明 ------------------------------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void BSP_Initializes(void);


#endif /* _BSP_H */

/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- bsp.c -----------------------------------------*/
/**
  ********************************  STM32F0xx  *********************************
  * @文件名     : bsp.c
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : BSP板级支持包源文件
  ******************************************************************************/
/*----------------------------------------------------------------------------
  更新日志:
  2020-06-24 V1.0.0:初始版本
  ----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"


/************************************************
函数名称 : RCC_Configuration
功    能 : 时钟配置
参    数 : 无
返 回 值 : 无
作    者 : JayYang
*************************************************/
void RCC_Configuration(void)
{
  /* 使能AHB时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
                        RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);

#if 0
  /* 使能APB2时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_SYSCFG, ENABLE);

  /* 使能APB1时钟 */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
#endif
}

/************************************************
函数名称 : NVIC_Configuration
功    能 : NVIC配置
参    数 : 无
返 回 值 : 无
作    者 : JayYang
*************************************************/
void NVIC_Configuration(void){
   
    NVIC_InitTypeDef NVIC_InitStructure;
   
    /* 外部中断 */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;       //配置中断优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       //使能中断
    NVIC_Init(&NVIC_InitStructure);                       //中断初始化
   
}

/************************************************
函数名称 : BSP_Initializes
功    能 : 底层初始化
参    数 : 无
返 回 值 : 无
作    者 : JayYang
*************************************************/
void BSP_Initializes(void)
{
    RCC_Configuration();        //时钟配置
    LED_Configuration();        //LED配置
    EXTI_Configuration();       //外部中断配置
    NVIC_Configuration();       //NVIC配置
}


/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- stm32f0xx_it.c -----------------------------------------*/
/************************************************
函数名称 : EXTI0_1_IRQHandler
功    能 : 外部中断0-1
参    数 : 无
返 回 值 : 无
作    者 : JayYang
*************************************************/
void EXTI0_1_IRQHandler(void)
{
  if((EXTI->PR & EXTI_Line0) != (uint32_t)RESET)
  {
    LED_1_TOGGLE;                                //LED1取反,通过宏定义实现
    while((KEY_PORT->IDR & KEY_PIN) == 0);       //等待按键释放
    EXTI->PR = EXTI_Line0;                       //清除标志位
  }
  else
  {
    EXTI->PR = 0x0003;                           //清除EXTI0_1所有标志位
  }
}

/*----------------------------------------- main.c -----------------------------------------*/
/************************************************
函数名称 : main
功    能 : 主函数入口
参    数 : 无
返 回 值 : int
作    者 : JayYang
*************************************************/
int main(void)
{
    BSP_Initializes();

    while(1)
    {
       
    }
}

6.2【HAL库】的配置方式

步骤:
1、通过STM32CubeMX软件配置RCC时钟
在这里插入图片描述
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
在这里插入图片描述
2、管脚功能设定:
我们以 PC12 引脚用作KEY1进行外部中断检测来判断按键是否被按下,以 PC6 作为控制LED1的引脚,实现通过按键KEY1来点亮或熄灭LED1的案例作为实验说明,单机鼠标左键,就会弹出适用于 PC12 管脚 或 PC6 管脚 所有的功能选项,需要使用哪个功能,直接选中即可,如下图所示:
GPIO配置
3、管脚参数设置
GPIO配置2
PC6配置
PC12配置
4、项目配置
项目配置1
项目生成
打开项目
5、HAL源代码编译和补充
默认由STM32CubeMX软件生成的是相关外设的一些初始化代码,具体的业务逻辑代码还是需要用户自己添加的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/*----------------------------------------- led.h -----------------------------------------*/
/**
  *********************************  STM32F0xx  ********************************
  * @文件名     : led.h
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : LED驱动头文件
  ******************************************************************************/

/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _LED_H
#define _LED_H

/* 包含的头文件 --------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"

/* 宏定义 --------------------------------------------------------------------*/
#define LED_1_ON        HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)   //点亮LED1
#define LED_1_OFF       HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)     //熄灭LED1
#define LED_1_TOGGLE    HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin)                   //LED1取反

#endif
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- led.c -----------------------------------------*/
/**
  ********************************  STM32F0xx  *********************************
  * @文件名     : led.c
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : LED驱动源文件
  ******************************************************************************/
/*----------------------------------------------------------------------------
  更新日志:
  2020-06-24 V1.0.0:初始版本
  ----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"

/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- stm32f0xx_it.c -----------------------------------------*/
/**
  * 在 stm32f0xx_it.c 中断服务函数源文件中找到外部中断的处理函数
  * @brief This function handles EXTI line 4 to 15 interrupts.
  */
void EXTI4_15_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI4_15_IRQn 0 */

  /* USER CODE END EXTI4_15_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);    //进入这个GPIO外部中断函数
  /* USER CODE BEGIN EXTI4_15_IRQn 1 */

  /* USER CODE END EXTI4_15_IRQn 1 */
}


/*----------------------------------------- stm32f0xx_hal_gpio.c -----------------------------------------*/
/**
  * @brief  Handle EXTI interrupt request.
  * @param  GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
  * @retval None
  */
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);                   //发现这个处理函数又调用了HAL_GPIO_EXTI_Callback这个回调函数,继续追踪
  }
}

/**
  * 发现处理GPIO外部中断的回调函数有__weak定义,说明是弱类型函数,用户可以在其他文件中重新定义这个同名的回调函数
  * 此案例我在 bsp.c 文件中进行了重定义
  * @brief  EXTI line detection callback.
  * @param  GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
  * @retval None
  */
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);

  /* NOTE: This function should not be modified, when the callback is needed,
            the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}


/*----------------------------------------- bsp.h -----------------------------------------*/
/**
  *********************************  STM32F0xx  ********************************
  * @文件名     : bsp.h
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : BSP板级支持包头文件
  ******************************************************************************/

/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _BSP_H
#define _BSP_H

/* 包含的头文件 --------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
#include "gpio.h"

#include "led.h"

#endif
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- bsp.c -----------------------------------------*/
/**
  ********************************  STM32F0xx  *********************************
  * @文件名     : bsp.c
  * @作者       : JayYang
  * @库版本     : V1.5.0
  * @文件版本   : V1.0.0
  * @日期       : 2020年06月24日
  * @摘要       : BSP板级支持包源文件
  ******************************************************************************/
/*----------------------------------------------------------------------------
  更新日志:
  2020-06-24 V1.0.0:初始版本
  ----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"

/************************************************
函数名称 : HAL_GPIO_EXTI_Callback
功    能 : GPIO外部中断回调函数
参    数 : GPIO_Pin:GPIO引脚
返 回 值 : 无
作    者 : JayYang
*************************************************/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)                      //重定义回调函数
{
    switch(GPIO_Pin)
    {
        case KEY1_Pin:                                              //判断当前是否是按键引脚
        {
            if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0)        //判断 KEY1 是否被按下
            {
                HAL_Delay(20);                                      //延时消抖
                if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0)    //再次判断 KEY1 是否被按下
                {              
                    LED_1_TOGGLE;                                   //使LED1亮灭取反
                }
            }
        }
        break;
    }
   
}
   
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/


/*----------------------------------------- main.c -----------------------------------------*/
//主函数保持默认生成的代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

至此,关于STM32F0系列的中断相关如上所述,本内容纯粹使个人学习的一个记录过程,方便自己以后回顾,也方便有需要的人,内容如有不对的地方,烦请各位留言指出,谢谢!