在之前的一篇文章中详细介绍了如何利用CubeMX创建一个完整的工程文件,但是CubeMX给我们的帮助有限,而更加具体的程序需要我们自行去编写,因此在这里我将利用开发板上自带的按键触发中断,并且使得板子上红绿两个LED灯交替闪烁。
本篇文章将略过创建工程文件的步骤,如果对如何使用CubeMX创建工程文件不清楚可以参照这篇文章STM32F429zit基于CubeMX的建立工程文件指南
本实验实现过程对于STM32F4系列以及STMF1系列通用。
所使用的开发板为STM32F4-disc1板,使用hal库进行编写。
操作步骤
首先我们点开开发板所配有的开发手册,从而确定好板子上按键所对应的引脚。如下图所示,我们从中可以得知按键所对应为PA0引脚。
然后我们点开上一篇文章里我们所创建的工程文件,并在其中点开图标为MX的文件,如下图所示:
点进去后我们接着在芯片图上选择PA0引脚,并且选择GPIO_EXTI0,如下图所示:
STM32F4 供 IO 口使用的中断线有16个,GPIO口与中断线的对应关系如下,因此在这里PA0对应的自然是EXTI0中断线。
接下来我们点开右边的System Core,并且点开展开列表中的GPIO,并且选择我们要修改配置的引脚PA0,将GPIO mode改为上升沿触发,以及下方改为下拉输入
因为在hal库中HAL_Delay延时函数利用了单片机的定时器中断进行计时,而按键所触发的中断优先级和计时器的优先级相同,导致单片机在执行按键所触发的中断后优先级相同的定时器中断无法执行,因此会导致卡死。所以在这里我们需要降低外部中断的优先级。
我们在左侧点击NVIC并且将中断线EXTI line0后面的框勾上,并且把后面数字中的0改为1。而数字越大所对应的中断优先级越低。
完成后点击右上方的蓝色按键重新配置文件。
进入文件后首先我们将上一篇文章中在主函数中所写的原有代码删去,恢复为刚开始创建后的样子。接着点击如图所示左下方的Fuctions切换下文件视图。
如何在左边列表处往下滑找到stm32f4xx_it.c文件并且展开他,在他展开的列表中找到中断线EXTI0所对应的中断函数EXTI0_IRQHandler(void),如图所示:
我们双击所找到的中断函数就可以打开他。在这里提醒下,STM32F4 的外部中断 0~4 都有单独的中断服务函数,但是从 5 开始, 他们就没有单独的服务函数了,而是多个中断共用一个服务函数,比如外部中断 5~9 的中断服 务函数为:void EXTI9_5_IRQHandler(void),类似的,void EXTI15_10_IRQHandler(void)就是 外部中断 10~15 的中断服务函数。
可以看见在函数里面还套着一个函数,我们点击内部的这个函数并且按鼠标右键,然后选择跳转到他的定义处,如图所示:
下图中所框住的地方便为这个函数。我们可以在其中看到函数先判断这个IO口是否中断,再清除标志位,随后进入到callback函数中。我们用相同的方式打开这个callback函数的定义
这个函数的前面带有一个__weak的标识,说明该函数为弱函数,加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同 名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。因此我们可以将该函数的名字复制下来放在主函数中,然后把想要通过中断所执行的操作放入该函数中。
因此在主函数中我们找到下图这个位置(所写的函数应放在begin和end之间,不然关闭文件后会被删去),并且在其中添加上callback函数所对应的名字,如下图所示:
然后我们在其中写上我们需要在中断中所执行的操作。在本实验中我们只需要然两个灯在按下按键的时候改变亮起和熄灭的状态即可,因此我们在这里使用 HAL_GPIO_TogglePin函数从而翻转引脚的电平状态。如下图所示:
而关于GPIO的一些其他的操作可以参考大佬的这篇文章HAL库常用函数使用介绍--HAL_GPIO
因为我们要使led灯交替闪烁,因此我们在main函数循环的前面这里设定好两个灯的初始状态是一亮一灭的
到这里我们的代码就编写完成了,接下来编译运行,可以看见刚开始时是红灯熄灭绿灯亮起,按下PA0所对应的蓝色按键后转为红灯亮起绿灯熄灭,重复按下两灯交替亮起熄灭。实验成功。
本人接触此方面时间较短,若有不足之处请多多包涵并指正,感谢。