左左右学堂 · 课程目录

第46期 外部中断HAL库源码深度解析(完结篇)

观看B站原视频 · 文稿与高清画面

Hello,小伙伴们,大家好,这里是左左右。这期视频我们来看看当PC13被设置为下降沿触发中断时。HAL_GPIO_Init()内部做了些什么?这里当position等于13时,if判断条件成立。由于我们将PC13设置为上拉输入模式,所以,这里的if判断成立。变量config中的值为0b1000。

GPIOC BSRR寄存器中BSR位13被置1,也就是GPIOC ODR寄存器位13被置1了。接着,通过这里的MODIFY_REG函数。PC13就被设置为上拉输入模式了。一直往下看,这里判断条件成立。这里开启了AFIO的时钟。这也就意味着我们前面写的那段代码中。开启AFIO时钟这一行是可以省略的,接着,将AFIO EXTICR4寄存器中的值赋值到变量tmp中。

视频画面 00:49.1
视频画面 00:49.1 · 1080P 原图 · 查看对应视频

通过这几行代码就将PC13引脚设置为外部中断模式了。由于我们前面设置的是下降沿触发中断,所以,第一个if判断不成立。EXTI RTSR寄存器中位13被置零。第二个if判断成立。EXTI FTSR寄存器中位13被置1。第三个if判断不成立。EXTI EMR寄存器中位13被置零。

视频画面 01:38.6
视频画面 01:38.6 · 1080P 原图 · 查看对应视频

第四个if判断成立。EXTI IMR寄存器中位13被置1。通过这个函数就将BSRR、ODR、AFIO、EXTI寄存器相关位都设置完成了。HAL库源码的操作和前面讲过的寄存器设置是一模一样的。接着,来看HAL_GPIO_EXTI_IRQHandler()这个函数。这里就是我们熟悉的验票操作。

视频画面 02:28.1
视频画面 02:28.1 · 1080P 原图 · 查看对应视频
视频画面 03:42.3
视频画面 03:42.3 · 1080P 原图 · 查看对应视频

第一步看有没有票。就是判断EXTI PR寄存器位13是否为1?第二步就是在票上做标记。就是向EXTI PR寄存器位13写1。这时位13就被清除了。接着,就调用了HAL_GPIO_EXTI_Callback这个函数。前面视频我们是自己写的“验票”逻辑。其实,这里HAL已经帮我们写好了。

视频画面 02:52.8
视频画面 02:52.8 · 1080P 原图 · 查看对应视频

我们直接调用HAL_GPIO_EXTI_IRQHandler()这个函数就可以了。接着,重写HAL_GPIO_EXTI_Callback这个回调函数。将电平的翻转逻辑放到里面就可以了。为了谨慎起见,还是要判断一下传入的引脚号是否为13?点击运行,程序正常执行。通过这段时间的学习,我们将GPIO.C这个文件中源码全部都解读完了。

随着学习的推进,源码的解读对小伙伴们来说也并不是那么难了。关于外部中断的学习也暂时告一段落了。下棋视频我们就要开启新的章节了。好了,今天的视频就到这里。一定要关注、点赞、收藏、评论,你们的支持是我这样的小博主持续更新下去的最大动力。期待下期视频再见。