44。Hello,小伙伴们,大家好,这里是左左右。这期视频我们就通过配置EXTI相关寄存器。实现按键控制LED亮灭的功能。我们不依赖任何IDE的图形化配置和代码的自动生成功能。直接操作寄存器。这样做虽然有一定难度。但是,能让你真正理解单片机的中断机制和底层原理。为了方便大家理解,我画了一个思维导图。
重点关注三个部分。LED、按键、外部中断、下面我们就按这个思路一步步写代码。首先,来看LED。其一端与PA15相连,一端接3.3V高电平。LED初始化需要两步。第一步开启GPIOA时钟。第二步设置PA15为推挽输出模式。接着,来看按键。它的一端与PC13相连,另一端与地相连。
由于这里要用到PC13引脚的EXTI外部中断的复用功能,设置会相对复杂。第一步,开启GPIOC和AFIO的时钟。第二步,配置PC13引脚。由于按键被按下时,PC13输入低电平,所以,我们要将PC13设置为上拉输入模式。第三步配置AFIO。第四步配置EXTI。由于按键被按下时,PC13输入低电平。

所以 将EXTI13设置为下降沿触发。这里的第二步到第四步就是我们前面讲的三步走。最后,一步就是设置NVIC了。这里需要设置EXTI和SysTick两个中断。需要注意的是要设置SysTick的抢占优先级高于EXTI。接着,来看EXTI外部中断。这里只需要将LED翻转电平的逻辑放到这里就可以了。
接下来我们就按这个思维导图一步一步来实现就可以了。首先,将我们做好的模版文件复制一个出来。点击新建项目。位置这里将刚才复制好的新文件路径复制过来。我们来看一下。这里的项目名称虽然更改过来了。但是,这里还没有更改过来。有的小伙伴就说了我有强迫症,看着别扭。那我们就将它也改过来。
首先,打开项目对应文件夹。找到CMakeLists.txt文件。找到Set the project name将后面的内容改为我们想要的项目名称就可以了。接着,我们新建两个.c和.h文件。这里提示此文件不属于任何项目。这是因为我们新建的这4个文件。系统并不知道他们归属于哪个项目。
我们点击这里的修正,将他们放入对应的项目中就可以了。接着,将这两个.h文件里的内容补齐了。之后打开led.c文件写一个LED初始化的函数。首先,我们要导入HAL库的头文件。这里可以看到头文件显示为灰色。这是因为我们没有调用里面的任何函数。后面只要调用任意头文件里的函数。
这里就会变亮了。第一步开启GPIOA时钟。第二步设置PA15为推挽输出模式。之前我们一直都是自己定义一个指针。存放着我们要操作寄存器的地址。通过解引用的形式来改变对应寄存器中的值。但是,通过前面那么多期HAL库源码深度解析的视频。我们都知道HAL库源码本质也是在操作寄存器,而且往往都是通过结构体指针的形式来改变相应寄存器中的值。
那么,我们直接用hal库写好的结构体。来操作寄存器就省去了自己定义指针的环节了。我们来试着写一下。接着,打开key.c文件写一个KEY初始化的函数。第一步,开启GPIOC和AFIO的时钟。第二步,配置PC13引脚为上拉输入模式。第三步配置AFIO。第四步配置EXTI,将EXTI13设置为下降沿触发。

接着,开启中断。这最后一步就是设置NVIC了。首先,设置分组。接着,打开定义这个函数的地方。这里的分组和我们前面讲的一模一样。我们将其设置为分组4。接着,设置EXTI15到10的抢占优先级和响应优先级,使能中断。同理设置SySTick的抢占优先级和响应优先级,使能中断。
同时,保证SysTick的抢占优先级高于EXTI。最后,一步设置外部中断。这里外部中断函数是固定的,我们把它复制过来。当PC13中断被触发是,EXTI_PR寄存器中13位被硬件自动置1。所以,首先要判断这里的值是否为1?如果为1说明PC13 EXTI外部中断被触发了,接着,通过写1来清除位13。

这里就可以执行PA15引脚翻转的动作来实现LED灯亮灭的功能了。其实,这里的逻辑也很容易理解。就比如我们去那些需要购票旅游景点。进园前会有一个检票口。检票口其实有两个目的,第一个目的就是看你有没有票。如果没有票你肯定是不能进去的,对应就是EXTI_PR位中的值是否为1?
为1就可以进入中断。第二个目的就是如果你有票。对方会在上面做标记。证明你已经来过了。如果不在票上做标记,你不就可以买一张票天天来玩吗?对应就是通过写1来清除对应位。如果这1位不被清除,程序不就被卡在中断里一直执行下去了吗?接着,在main点c这个文件中加入我们写好的头文件。

在main函数中调用我们写好的函数。此时这个项目正常情况会一直在while循环中执行。尽管现在这里是空的,只有当按键被按下时才会去执行中断函数中的任务。中断执行完成后继续在while循环中执行。这时点击运行。程序功能是不是被正常实现了?
接下来我们就用HAL库来实现相同的功能。这里的模式我们选择下降沿触发中断。其他和我们之前讲过的是一模一样的,此时配置寄存器时的第三步和第四步就可以省略了,也就是说HAL库已经帮我们配置好AFIO。EXTI的相关寄存器了。点击运行。程序也可以正常执行了。这期视频我们完整地实现了寄存器版本和HAL库版本的按键中断控制LED。
如果你跟着做一遍,相信你对EXTI、NVIC、GPIO和AFIO的理解会上升一个台阶。好的,今天的视频就到这里。下期视频我们将深度解析HAL库中关于EXTI的相关函数。一定要关注、点赞、收藏,评论。您的支持是我这样的小博主持续更新下去的最大动力。期待下期视频再见!
这里为什么是数组的形式呢?这是因为WXTICR这四个寄存器的位含义是一模一样的。所以HAL库将他们放到了一个数组里。