采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯
文章目录
前言
- 所有的事物都是依靠中断来解决问题的。计算机更是如此,依靠时钟发生器,人为的设置没几个时钟周期做一个任务,不管是否做完,一旦规定的时间到了,那么就要强制“中断”,以作下一个任务……就这样,直道所有的任务都作过了(但不一定都做完毕),再接着做第一个没有做完的任务,就这样走而复始循环工作。完成所谓的“多任务”
- 中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率
- 因此,本文将为大家介绍中断系统中较为简单的实验操作——在中断模式编程下,实现高低电平对LED灯亮与灭的控制
一、中断模式简介
1. 什么是中断?
- 你正在追电视剧《神雕侠侣》,正看得入迷的时候,电话响了,你暂停电视剧,去接电话,在接电话的过程中,门铃又响了,你暂时放下电话,去把门打开。如果追电视剧是在执行主程序,那么电话就是
中断源
,电话铃响了就是中断请求
,暂停电视就是现场保护
,接电话就是中断响应
,门铃响了是更高一级的中断请求,去把门打开,那就是中断嵌套
。开完门回来接着聊电话,那是中断返回
,接完电话把电视剧暂停打开就是现场恢复
。
2. 中断的作用
提高计算机系统效率。
计算机系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调它们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态维持系统可靠正常工作。
现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。满足实时处理要求。
在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理。提供故障现场处理手段。
处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。
3. 中断的类型
硬中断
:通过处理器中断信号线产生的中断软中断
:通过非法指令或特殊指令触发的中断
4. 中断的意义
- 应用程序不必关心中断的发生与处理
- 中断服务程序不必关心应用程序的执行状态
- 中断是“上层应用”与“底层代码”的“分割边界”
5. 中断优先级与向量表
1、优先级:
- 多个中断同时出现时,处理器先响应
高优先级
的中断 - 低优先级中断的ISR执行时,可以被高优先级中断再次打断
- ISR比App Code拥有更高的执行优先级
2、向量表:
二、工程创建
1.实验要求
- 用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯
2. 要求分析
-
首先需要接一个LED灯,其次我们用一个开关来触发中断,使得我们按下开关LED亮,松开开关LED灭
-
粗略示意图:
LED端:
(这里表示用PA5端口输出控制LED灯)开关端:
(开关按下表示到达PB9的电平为高电平,根据题目要求,开关按下时使得LED点亮即将杜邦线接到高电平的时候触发中断,使得接在PA5管脚输出高电平点亮LED灯)
3.创建STM32CubeMX工程
3.1 管脚配置
-
创建工程:
-
配置SYS:
-
配置A5、B9管脚:
( PA5选择输出==“Output”):
(PB9选择中断触发“EXTI_9”==):
-
配置GPIO:
由于是高电平点亮,所以PA5直接用默认的设置就可以了。重点得看到我们PB9的设置:
在 GPIO mode 中我们选择触发模式:
External Interrupt Mode with Rising edge trigger detection上升沿
External Interrupt Mode with Falling edge trigger detection下降沿
External Interrupt Mode with Rising/Falling edge trigger detection上升沿或下降沿
这里根据示意图选择为上升沿触发模式
GPIO Pull-up/Pull-down :是选择是否为上拉或下拉输出,这里选择否
User Label :设置为我们想要的名字,这里起名为==“switch interrupt”==,大家也可以取其他名字,但是一定要记得现在起的名字,后面需要用到(这一步也不是必须的)
3.2 环境配置
- 开启中断
点击 NVIC,点击下面的使能 Enabled 开启中断:
- 中断优先级:
中断优先级用于需要多个中断的工程先后顺序,这里只有一个中断,所以说不用关中断优先级 - 时钟树设置:
3.3 工程文件配置
- Project:
- Code Generator:
4. 代码编写
-
点击Drivers目录下的stm32f1xx_hal_gpio.c文件,看到第546行:
这些代码都是HAL库中的中断函数,其中 :voidHAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
这个函数是遇到中断后跳转执行的函数;下方的__weak
:表示这个函数是虚函数,需要重新编写 -
转到 main.c 文件中,将下面这段代码贴上去:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == switch_interrupt_Pin)//判断外部中断源
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);//翻转PA5状态
}
}
- 工程调试:
三、硬件实现
1. 线路连接
1.1 usb to ttl ----> STM32F103C8T6核心开发板
- 3V3 —> 3V3
- GND —> GND
- RXD —> A9
- TXD —> A10
1.2 STM32F103C8T6 ----> 面包板
- LED灯短脚 —> A5
- LED灯长脚 —> 3V3
- 芯片GND —> 面包板GND
- 杜邦线 —> 一端接B9,一段充当开关
2. 程序烧录
- 打开FlyMcu,选择对应生成的hex文件,开始烧录:
3. 结果展示
- 我方视角:
中断点灯
- 他方视角:
中断点灯2
总结
本次博客内容,简单介绍了在STM32F103C8T6核心开发板下,采用中断模式编程,来实现高低电平下的LED灯亮与灭。
STM32Cube提供了固件库,用户可直接调用固件库函数来开发,并且可以很好的实现STM32-MCU全系列的代码一致性。同时STM32CubeMX工具提供的可视化引脚、外设、时钟等配置功能,可以帮助快速完成工程的建立、初始化,大大降低了开发者的工作量。
同时也期待大家能够积极留言,指出我存在的问题,谢谢!
参考文献:
https://blog.csdn.net/txmnQAQ/article/details/121128233?app_version=5.7.0&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22121128233%22%2C%22source%22%3A%22weixin_64559251%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app
https://blog.csdn.net/qq_26387811/article/details/121159474?spm=1001.2014.3001.5502