【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)
中断向量表
中断/事件 配置使用说明
要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置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 管脚 所有的功能选项,需要使用哪个功能,直接选中即可,如下图所示:
3、管脚参数设置
4、项目配置
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系列的中断相关如上所述,本内容纯粹使个人学习的一个记录过程,方便自己以后回顾,也方便有需要的人,内容如有不对的地方,烦请各位留言指出,谢谢!