目录
一、中断
1.1 中断的理解
中断包括三个过程:中断发生,中断处理,中断返回这整个工程叫中断。
中断发生:CPU在处理某一事件时,另一事件发生了,请求CPU迅速去处理。
中断处理:CPU暂停工作转去处理另一个事件。
中断返回:CPU将另一个事件处理完成后,再回到事件一没处理完的地方继续处理。
1.2 中断的作用
速度匹配:可以解决快速的CPU与慢速的外部设备之间的传送数据的矛盾。
分时操作:CPU可以分时为多个外部设备服务,提高计算机的利用率。
实时响应:CPU能够及时处理应用系统的随机事件,增强系统的实时性。
可靠性高:CPU可以处理设备故障及掉电等突发事件,提高系统的可靠性。
1.3 终端的优先级
处理器根据不同中断的重要程度设置不同的优先等级。不同的优先级中断的处理原则是:高级终端可以打断低级中断;低级中断不能打断高级中断。
二、外部中断处理流程
中断跳转:跳转到中断所对应的中断服务程序
执行中断服务程序:执行在stm32f4xx_it.c中对应的中断服务程序。
外部中断通用处理函数:判断中断标志并清除,调用外部中断回调函数。
执行用户编写的回调函数:完成具体的中断任务处理。
中体流程图:
三、中断模式使LED亮灭
3.1 新建工程
- 进入STM32CubeMX,新建一个工程项目
- 根据自己的需要选择芯片型号,这里我选的是STM32F103C8,开始项目。

-
Rcc里的HSE选择Crystal/Ceramic Resonator
-
点击sys,将debug选项改为Serial Wire
-
PA1控制led灯 ,将其选择为GPIO_Output,并且GPIO_Output level勾选为high 高电平。
- PB0为外部中断触发器,将其选择为GPIO_EXT10,GPIO mode 勾选为
External Interrupt Mode with Rising/Falling edge trigger detection
。
- 选择PLLCLK,然后将后面的晶振频率最大值改为72M赫兹。
- project里把toolchain那里改为MDK-ARM,版本选择最新的就行了,项目名和项目路径自己选择。
- 选择生成初始化文件,然后选择生成代码就好了。
3.2 代码编写
通过edit->find in files,搜索HAL_GPIO_EXTI_Callback函数。
该函数为外部中断回调函数,__weak意为弱函数,即我们重写一个相同的函数则调用重写的函数:
在main.c中编写回调函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
GPIO_PinState b0_pin = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0); // 读取b0的状态
switch (GPIO_Pin){
case GPIO_PIN_0:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, b0_pin); // 将a1写入与b0相同的电位
break;
}
}
最后编译并烧录。
编译无误:
烧录成功:
3.3 显示效果
四、中断实现串口通信
前面的设置基本与上面一致,不同的地方有如下几个:
-
选择UASRT1,将mode改为异步通信,选择下面的NVIC Setting,将enabled选上。
-
使能中断
-
打开生成的代码,添加存放数据的数组
uint8_t a[]="Hello world!\n";
- 添加回转函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
}
- 在主函数中添加中断调用
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
编译烧录运行,输出hello world!
五、总结
中断给我们带来了许多便利,我们生活中很多事情都需要中断,这让我们离生活更贴近了一步。
六、参考资料
https://blog.csdn.net/junseven164/article/details/121066120?spm=1001.2014.3001.5501