STM32 EXTI外部中断
> 本文代码使用 `HAL` 库。
@[TOC](文章目录)
---
# 前言
---
# 一、什么是外部中断?
`外部中断` 是单片机实时地处理外部事件的一种内部机制。==当某种外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处==,继续执行下去.
>**外部中断** 是指由 外部设备 发出的 中断请求 ,如键盘、鼠标、计时器、网络数据等。外部中断可以提高系统的效率,使系统能够有效地处理外部设备发出的中断请求,从而改善系统的性能。
# 二、外部中断中断线
外部中断共有 `20 `条中断线。
从下图可以看出,PA0、PB0...PG0 共用的 *EXTI0* 中断线,PA1、PB1...PG1共用的 *EXTI1* 中断线,也就是 编程里面的(如下图库文件),对应` 16` 个中断线。
112 个引脚被分成了16个 外部中断线,==不同组的同一个引脚号连接到同一个外部中断线上==。
![在这里插入图片描述](https://img-blog.csdnimg.cn/76120ccc99384fa7bfd92c4338389b22.png)
后面三个是专用的中断线:
- 外部中断线 *EXTI16* 连接到 **PVD** 输出.
- 外部中断线 *EXTI17* 连接到 **RTC** 警告事件.
- 外部中断线 *EXTI18* 连接到 **USB** 唤醒事件.
- 外部中断线 *EXTI19* 连接到 **ETH** 唤醒事件.(只有在内部有ETH模块的设备才会有这条线)
---
# 三、STM32F103的引脚复用
`GPIO 的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个`。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,`如果我们使用PA0作为外部中断源,那么别的就不能够再使用了`,在此情况下,我们只能使用类似于PB1,PC2这种末端序号不同的外部中断源。
![在这里插入图片描述](https://img-blog.csdnimg.cn/66e7dfe030924bb087026614ab4a9c95.png)
>以 **AFIO_EXTICR1** 为例 :
>
>![在这里插入图片描述](https://img-blog.csdnimg.cn/0d5d51f1b6634bd1aee945acb193f25b.png)
>① AFIO_EXTICR1有32位,只有低16位可以设置值,高16位是保留位。
②它可以配置4跟外部中断线,每4位控制一根外部中断线.
③ 对于某一根外部中断线,同一时刻只能选择一组GPIO的引脚作为外部中断输入引脚.
# 四、相关函数:
1. 设置外部中断的优先级:
```c
HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);
```
2. 使能外部中断
```c
HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
```
3. 外部中断服务函数
```c
void EXTI1_IRQHandler(void);
```
4. 回调函数
```c
HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
```
---
# 总结
下一篇文章 介绍 **OLED** 的使用。
- 点赞
- 收藏
- 关注作者
评论(0)