嵌入式02 STM32 实验08 外部中断
一、中断
由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理事件的一个程序。该程序执行完成后,CPU接着执行被暂停的程序。这个过程称为中断。(我正在捉泥鳅,但是我妈喊我回家吃饭,我必须回家吃饭,回家途中,发现泥鳅没带,回去把泥鳅带回家,然后吃完饭继续捉泥鳅!!!)
中断是CPU处理外部突发事件的一个重要技术。引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以分为硬件中断和软件中断两大类,有了中断,系统可以更好更快的利用有限的系统资源解决系统响应速度和运行效率的一种控制技术。它的作用就是可以使你的电脑系统运行更快更平稳。
一方面,有了中断功能,系统就可以使CPU和外设同时工作,使系统可以及时的响应外部事件。而且有了中断功能,CPU可以允许多个外设同时工作。这样就大大提高了CPU的利用率,也提高了数据输入、输出速度。另一方面,有了中断功能,就可以使CPU及时处理各种软硬件故障。计算机在运行过程中,往往会出现事先预料不到的情况或出现一些故障,如电源掉电,存储出错,运算溢出等等。计算机可以利用中断处理系统自行处理,而不必停机或报告工作人员。
1、硬件中断根据来源的位置分为:
内部中断(不可屏蔽中断):少数,中断源在CPU的内部,如突然掉电,奇偶校验错、除数为0、运算溢出、单步中断(软件调试时可以使用,每执行一条指令,就中断一次)等
外部中断(可屏蔽中断):多数,中断源在CPU的外部,一般是指由计算机外设发出的中断请求,如键盘中断、打印机中断、定时器中断。可以使用中断控制器屏蔽外部设备的中断。
2、是否可屏蔽分为:
可屏蔽中断
不可屏蔽中断
3、中断来源:
软件中断
硬件中断
二、中断与事件
概念:
事件:是表示检测到某一动作(电平边缘)触发事件发生了,由硬件自动完成的触发到产生结果的通道解决(响应速度快)。
中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中,需要CPU接入(响应速度慢)。
区别:
中断有可能被更优先的中断屏蔽,事件不会;事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒);事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号;事件是中断的触发源,事件可以触发中断,也可以不触发,开放了对应的中断屏蔽位,则事件可以触发相应的中断。事件还是其它一些操作的触发源,比如DMA(Direct Memory Access,直接存储器存取),还有TIM中影子寄存器的传递与更新。
简言之,中断一定要有中断服务函数,中断必须要CPU介入,但是事件却没有对应的函数。事件可以在不需要CPU干预的情况下,执行某些操作,事件机制提供了一个完全由硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法;
三、实验内容
实验中按下按键0触发中断线4,抢占优先级2,子优先级为2,中断反应函数EXTI4_IRQHandler(),控制LED0和LED1的状态取反
1、初始化IO口为输入 KEY_Init();
2、开启AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
3、设置IO口与中断线的映射关系 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
4、初始化线上中断,设置触发条件等 EXTI_Init(&KST_EXTI_Structure);
5、配置中断分组(NVIC),并使能中断 NVIC_Init(&KST_NVIC_Structure);
6、编写中断服务函数 EXTI4_IRQHandler();
7、清除中断服务函数 EXTI_ClearITPendingBit(EXTI_Line4);
#include "exti.h"
#include "key.h"
#include "led.h"
#include "beep.h"
#include "delay.h"
#include "usart.h" void EXTIX_Init(void)
{
EXTI_InitTypeDef KST_EXTI_Structure;
NVIC_InitTypeDef KST_NVIC_Structure; KEY_Init(); //按键初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能IO口复用时钟 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); //设置IO口与中断线的映射关系 KST_EXTI_Structure.EXTI_Line = EXTI_Line4; //配置中断线4
KST_EXTI_Structure.EXTI_LineCmd = ENABLE; //使能
KST_EXTI_Structure.EXTI_Mode = EXTI_Mode_Interrupt; //外部中断
KST_EXTI_Structure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_Init(&KST_EXTI_Structure); //初始化线上中断,设置触发条件 KST_NVIC_Structure.NVIC_IRQChannel = EXTI4_IRQn;
KST_NVIC_Structure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
KST_NVIC_Structure.NVIC_IRQChannelPreemptionPriority = ;//抢占优先级2
KST_NVIC_Structure.NVIC_IRQChannelSubPriority = ; //子优先级2
NVIC_Init(&KST_NVIC_Structure); //中断优先级初始化 } void EXTI4_IRQHandler(void)
{
delay_ms();
if(KEY0==)
{
LED0 = !LED0;
LED1 = !LED1;
}
EXTI_ClearITPendingBit(EXTI_Line4); //手动清除中断线4的标志位
}
主函数
#include "sys.h"
#include "exti.h"
#include "beep.h"
#include "key.h"
#include "delay.h"
#include "led.h"
#include "usart.h" int main()
{
delay_init();
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
BEEP_Init(); //蜂鸣器初始化
EXTIX_Init(); //外部中断初始化
uart_init(); //串口初始化
LED0 = ;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
while()
{
printf("OK\r\n");
delay_ms();
} }
嵌入式02 STM32 实验08 外部中断的更多相关文章
- 嵌入式02 STM32 实验10 定时器中断
优秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一.STM32通用定时器(TIM2.TIM3.TIM4和TIM5共四个通 ...
- 嵌入式02 STM32 实验11 NVIC和中断总结
一.基础知识 1.cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断 2.STM32只有84个中断,包括16个内核中断和68个可屏蔽中断 3.STM32F103上只有60个 ...
- 嵌入式02 STM32 实验07 串口通信
STM32串口通信(F1系列包含3个USART和2个UART) 一.单片机与PC机串行通信研究目的和意义: 单片机自诞生以来以其性能稳定,价格低廉.功能强大.在智能仪器.工业装备以及日用电子消费产品中 ...
- 嵌入式02 STM32 实验06 按键
按键实验和前面的跑马灯.蜂鸣器主要的区别就是这个是读取外部的输入信号,之前的实验都是对外部输出信号. 一.硬件设计 本实验的硬件为三个按键.两个lED(LED0.LED1).一个蜂鸣器(BEEP). ...
- 嵌入式02 STM32 实验05 蜂鸣器
蜂鸣器:是一种一体化结构的电子讯响器.主要分为分压式蜂鸣器和电磁式蜂鸣器两种类型. 一.有源/无源蜂鸣器(不是指是否带电源,而是有没有自带震荡电路) 1.有源蜂鸣器:有源蜂鸣器自带震荡电路,一通电就会 ...
- 嵌入式02 STM32 实验03 时钟系统
时钟系统是处理器的核心,所以认真学习时钟系统是必要的,有助于深入理解STM32. 由于STM32的外设很多,有的外设不需要太高的时钟频率,同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也越弱,所以对 ...
- 嵌入式02 STM32 实验02 端口输入输出各4种模式
GPIO(General-purpose input/output 通用目的输入/输出端口) 电压(A模拟量)与电平(D数字量) GPIO 8种工作模式(输入四种.输出四种) 1.GPIO_Mode_ ...
- 嵌入式02 STM32 实验01 端口复用和重映射
内设与外设: 端口复用和端口重映射都需要了解内设和外设,那么什么是内设?什么是外设? 内设:单片机内部集成的功能一般包括:串口模块.SPI模块(Serial Peripheral Interface ...
- 嵌入式02 STM32 实验04跑马灯
开学STM32 跑马灯的实验主要就是了解GPIO口的配置及使用,我这里是使用库函数进行编程,主要需要设置以下两方面: 1.使能需要使用的IO口的时钟,一共有A.B.C.D.E.F.G七组IO口 2.初 ...
随机推荐
- Numpy | 11 迭代数组
NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 实例1:使用 arange() 函数创建一个 2x3 ...
- 网络命令——write、wall、ping、ifconfig、mail
1.write命令: 前提:用户必须在线: (1)向zhb用户发送信息: (2)用户收到信息: CTRL+D结束会话. 2.wall(发送广播信息,即给在线的所有用户发送信息) 管理员发送消息(自己可 ...
- ent 基本使用十七 分页与排序
ent 提供了方便的数据分页以及排序处理 limit 分页 users, err := client.User. Query(). Limit(n). All(ctx) offset 分页 users ...
- chart.xkcd 可绘制粗略,开通,手绘样式的图表库
chart.xkcd 可以用来绘制手绘样式的图表,使用简单,样式也挺好看 简单使用 代码 index.html <!DOCTYPE html> <html lang="en ...
- linux mustache bash 实现mo 做为docker容器运行动态配置工具数组的处理
前面有说过关于使用mo 工具的简单配置使用,但是实际中我们可能存在比较复杂的数据处理,比如数组,mo 可以进行数组的处理,但是在测试的过程中,一直失败,查看了官方的demo以及帮助命令发现可以通过参数 ...
- DevExpress.XtraEditors.Repository.RepositoryItem.CreateDesigner()
未将对象引用设置到对象的实例. 此错误的实例(1) 1. 隐藏调用堆栈 在 DevExpress.XtraEditors.Repository.Repository ...
- Unknown column 'startname' in 'field list
Unknown column 'startname' in 'field list 字段匹配不上 解决思路 1.检查数据库字段名与sql中的字段名是否一致 2.是否为关键字或中英文区别 ,(关键字可 ...
- python发送钉钉机器人脚本
#!/usr/bin/python# -*- coding: utf-8 -*-import requestsimport jsonimport sysimport os headers = {'Co ...
- [linux]查看进程占用内存
1.top -p 进程ID PID:进程的ID USER:进程所有者 PR:进程的优先级别,越小越优先被执行 NInice:值 VIRT:进程占用的虚拟内存 RES:进程占用的物理内存 SHR:进程使 ...
- SearchLookupEdit 选择后联动
直接改绑定数据源--实体的属性会导致选择内容变空 所有改相应控件的text然后再写入数据源 最好将需要联动的控件设置成只读 mNoTextEdit.EditValueChanged += (s, e) ...