STM32的中断系统
一、中断系统的基本概念
二、中断程序的设计思路
使用CubeMX工具初始化中断配置
编写中断服务函数,需要用户自己重写虚函数,如果有面向对象编程的基础(Cpp),那么就知道这个_weak
类似于Cpp中的virtual
,用户可以编写自己的虚函数来进行覆盖原函数,实现自己的功能。
三、中断实验
目的是编写中断服务函数来实现上面两个功能,这里只需要注意配置自己的中断触发引脚即可,不需要和笔者有相同的开发板。这里笔者使用的是正点原子精英开发板 STM32F103ZET6
,具体的引脚如下图所示
将KEY0,设置为外部中断输入,下降沿触发,在中断服务函数中修改LED0的状态;
将KEY1,设置为外部中断输入,上升沿触发,在中断服务函数中修改LED1的状态。
打开CubeMX进行工程配置,先配置时钟,选择外部晶振
选择外部输入时钟,将时钟配置为最大就可以了
接下来配置GPIO,我们需要用到两个LED和两个KEY,所以需要配置四个GPIO,分别将两个LED设置为输出模式GPIO_Output
,将两个KEY设置为外部中断模式GPIO_EXITIx
。
由于我们需要KEY0是下降沿触发,KEY0对应的引脚是PE4,
同理KEY1是上升沿触发,KEY1对应的引脚为PE3,
然后进入NVIC,使能这两个中断通道
这样就配置完成了,可以生成代码了。(具体的配置方法请参考这篇博客)
打开配置好的工程文件,可以在gpio.c
文件中看到外部初始化的代码部分
同时在stm32f1xx_it.c
中可以看到,中断处理函数
接下来就需要我们重写自己的中断服务函数了,首先找到,中断服务函数是哪个。利用转到定义
找到我们需要重写的中断回调函数
在main.c
的可写用户代码区,重写中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //重写中断回调函数
{
if(GPIO_Pin == GPIO_PIN_3) //判断引起中断的引脚,KEY1翻转LED1
{
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
}
if(GPIO_Pin == GPIO_PIN_4) //KEY0翻转LED0
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
}
由于两个按键触发中断都会调用同一个中断回调函数,所以我们可以在一个中断回调函数中处理两个中断。