嵌入式系统:中断

2023-11-07

中断

(一)查询与中断

1.查询:按照主函数中的语句顺序,顺序执行

(1)优点:结构简单,易于理解

(2)缺点:无法充分利用CPU资源

2.中断:程序顺序执行,遇到中断使能,跳转执行中断函数

(1)优点

  • 充分利用CPU资源,提高效率
  • 易于处理突发事件

(2)缺点:结构复杂,不好理解(次要)

在这里插入图片描述

(二)中断相关知识

1.中断分类(中断源)

(1)外部中断

  • 按键
  • 外部通讯中断

(2)内部中断

  • CPU内部中断,如重置,遇到突发事件处理的中断
  • 相关外设中断

2.中断优先级:优先级高的先执行

3.注意:具体哪些端口可以中断需要看具体数据手册


(三)编程

1.编程流程

(1)配置所需中断功能相关寄存器,开启功能中断以及全局中断

  • 中断源
  • 中断优先级
  • 中断使能

(2)编写中断处理子程(ISR)(CPU硬件自动调用)

  • 中断触发源判断(中断触发,相关标志位置1)
  • 中断标志位清零

(3)在中断函数中处理相关任务


2.编程实例

(1)寄存器编程

#include <msp430.h> 

/**
 * main.c
 */
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	
	/******************
	 * 功能:按键实现LED开关
	 * 函数:按键中断函数
	 ******************/

	/*LED初始化*/
	P1SEL &=~BIT0;  //GPIO模式
	P1DIR |= BIT0;  //输出模式

	/*按键中断初始化*/
	P2SEL &=~BIT1;  //GPIO模式
	P2DIR &=~BIT1;  //输入模式
	P2IE  |= BIT1;  //中断使能
	//内部配置上拉电阻
	P2REN |= BIT1;  //上拉电阻
	P2OUT |= BIT1;  //输出为高
	P2IES |= BIT1;  //中断边沿选择(上升沿)
	
	P2IFG &=~BIT1;  //中断标志位清零

	_EINT();       //全局中断开启

	return 0;
}

/*延时函数*/
void delay(unsigned char Time)
{
    while(Time--);
}

/*按键中断处理子程*/
#pragma vector = PORT2_VECTOR
__interrupt void PORT2_ISR()
{
    /*按键去抖*/
    if(P2IFG & BIT1)  //判断中断标志位,是否开启中断
    {
        delay(40);
        if(!(P2IN & BIT1))  //判断按键是否按下
        {
            while(!(P2IN & BIT1));  //等待按键抬起
            delay(40);  //延时去抖
            //功能执行语句
            P1OUT ^= BIT0;  //LED闪烁
        }
    }
    P2IFG &=~BIT1;
}

(2)库函数编程

#include "msp.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

/**
 * main.c
 */
void main(void)
{
	WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;		// stop watchdog timer

	/******************
	 * 功能:按键实现LED闪烁
	 * 函数:按键中断函数
	******************/

	/*LED初始化*/
	//P1.0作为输出模式
	MAP_GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);

	/*按键中断初始化*/
	//P1.4作为输入模式
	MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1,GPIO_PIN4);
	//按键中断使能
	MAP_GPIO_enableInterrupt(GPIO_PORT_P1,GPIO_PIN4);
	//按键上升沿触发
	MAP_GPIO_interruptEdgeSelect(GPIO_PORT_P1,GPIO_PIN4,GPIO_LOW_TO_HIGH_TRANSITION);
	//清除中断标志位
	MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1,GPIO_PIN4);

	MAP_Interrupt_enableInterrupt(INT_PORT1);//开启PORT1全局中断

	while(1);

}



/*按键中断处理函数*/
void PORT1_IRQHandler(void)
{
    uint32_t status;
    status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1);  //得到产生中断的位

    if(status & GPIO_PIN4)  //判断中断标志位
    {
           MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
    }
    MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status);  //清除中断标志位
}


3.总结

(1)此例只是简单的中断函数,目的是为了明白中断的大致原理

(2)中断是非常重要的在嵌入式开发中,当然还有更高效的操作系统编程,但这不是目前要了解的


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式系统:中断 的相关文章

  • 1. 嵌入式OpenWRT入门基础篇-----OpenWRT源码下载、编译

    之前一直在做关于op系统的项目 现在不从事这一行了 或许以后也不会了 趁现在还有点记忆 因此在此也算记录一下以前的工作吧 因为OpenWRT是一个很完善的系统 本系列博客也是按照整个系统的开发步骤进行的 本人技术水平不精 如有错误之处 还望

随机推荐

  • Kubernetes初始化集群时报错[ERROR Port-10259]: Port 10259 is in use

    错误原因 节点被占用 报错信息 W0823 00 33 45 142456 107567 validation go 28 Cannot validate kube proxy config no validator is availabl
  • Qt动态属性

    动态属性 在标准C 中 为了保证封装性 我们经常声明一个私有变量 然后声明两个公有函数 即set函数和get函数 在Qt中我们可以使用宏Q PROPERTY 宏来实现这些 一个属性可以使用常规函数QObject property 和QObj
  • 程序员赚钱致富的6种方法

    我认识一个朋友 也是程序员出身 他在一家还不错的外企上班 每个月工资收入也就差不多15K 五年的工作经验了 在他面前 我算是小弟 那天我们几个朋友一起打完球就去附近的饭馆吃饭 环境还不错 于是就边吃边聊工作 赚钱的事情 那天了解到 他不仅拿
  • macOS查看IP地址的命令

    查看内网的 IP 地址 ipconfig getifaddr en0 Last login Thu Aug 11 17 13 00 on ttys000 grnt wMacBook Pro ipconfig getifaddr en0 19
  • nginx用户认证配置

    1 用户认证模块 在 nginx 下 提供了 ngx http auth basic module 模块实现让用户只有输入正确的用户名密码才允许访问web内容 默认情况下 nginx 已经安装了该模块 所以整体的一个过程就是先用第三方工具设
  • GUI编程—PyQt5学习笔记1

    GUI 图形用户界面 Graphical User Interface 简称 GUI 又称图形用户接口 是指采用图形方式显示的计算机操作用户界面 PyQt5常用模块 QtWidgets 包含了一整套UI元素控件 用于建立符合系统风格的界面
  • 启动mysql服务报错:mysql服务无法启动

    一 问题描述 之前mysql服务好好的 突然无法启动了 win10系统 64位 mysql8 0 23 二 问题解决 1 mysqld console命令查看具体报错 C WINDOWS system32 gt mysqld console
  • C++ 2:new和delete,volatile关键字,auto关键字,基于范围for循环,string简单使用

    文章目录 1 B Tree 的结构设计 2 new和delete 2 1 new的三种用法 2 2 对于内置类型new delete malloc free 可以混用 3 C11的新特性 3 1 类型推导 3 2 auto的推导规则 3 2
  • geeksforgeeks —— 算法 1

    目录 算法 一 查找和排序 1 1 线性查找 1 2 二分查找 1 3 跳跃搜索 1 4 插值搜索 1 5 指数搜索 1 6 为什么二元搜索优于三元搜索 1 7 选择排序 1 8 冒泡排序 1 9 插入排序 1 10 归并排序 1 11 堆
  • 关于指针大小(c语言)

    32位系统默认指针大小为4个字节 8位为一个字节 因为32位系统默认的内存寻址空间是4G 所以指针大小为4个字节可以完成对4G空间的寻址 2 32约为4个G 64位系统默认指针大小为8个字节 理论上寻址空间可达到1800万个TB 指针大小为
  • git给服务器传文件在哪里,git上传文件服务器地址

    git上传文件服务器地址 内容精选 换一换 在本地主机和Windows弹性云服务器上分别安装QQ exe等工具进行数据传输 使用远程桌面连接mstsc方式进行数据传输 该方式不支持断点续传 可能存在传输中断的情况 因此不建议上传大文件 文件
  • qt怎么一个程序显示两个窗口

    首先我们要把 ui文件的QMainWindow改成QDialog 用记事本 然后把 ui对应的头文件和 cpp 出现QMainWindow改成QDialog 如图重点其包含头文件定义也记得修改 然后非模态显示 才不堵塞主窗口 然后在主窗口程
  • 星际2正在等待暴雪服务器的响应,win7系统玩星际2一直停留在"正在更新暴雪启动器"页面的解决方法...

    很多小伙伴都遇到过win7系统玩星际2一直停留在 正在更新暴雪启动器 页面的困惑吧 一些朋友看过网上零散的win7系统玩星际2一直停留在 正在更新暴雪启动器 页面的处理方法 并没有完完全全明白win7系统玩星际2一直停留在 正在更新暴雪启动
  • 【交叉二五码及其校验码计算方式】

    一 交叉二五码 交叉二五码是1972年美国Intermec公司发明的一种条 空均表示信息的连续型 非定长 具有自校验功能的双向条码 它的字符集为数字字符0 9 交叉二五条码由左侧空白区 起始符 数据符 终止符及右侧空白区构成 它的每一个条码
  • CentOS 7虚拟机安装常用软件

    依然是虚拟机安装常用软件系列 CentOS 7目前官方支持到2024 还行 1 VMWare 安装CentOS 7 默认都安装成功了 2 换源 更新 阿里源最近老是403 换了网易源 sudo wget O etc yum repos d
  • python对字符串中指定字符进行替换

    1 替换指定的所有字符 string replace a b 表示将字符串string中所有字符为a的替换为b 例子 string abcabcabc string string replace a b print string 输出 bb
  • SpringBoot默认Json框架Jackson解析-基础篇

    1 Springboot返回JSON数据的方式 目前SpringBoot提供的Json格式有三种 Jackson 默认 Gson JsonB 我们都可以在springboot自动配置模块spring boot autoconfigure中查
  • (深度/广度优先算法)——遍历邻接表(C语言)

    一 算法代码 采用邻接表表示图的遍历 include
  • 基于同一IP的不同端口访问不同的网站

    目录 创建网站目录 一 ip 端口1的根目录 二 ip 端口2的根目录 编写虚拟主机配置文件 配置完成 实验结果测试 创建网站目录 一 ip 端口1的根目录 这个目录大家可以随意 配置文件里同步即可 mkdir p www port 909
  • 嵌入式系统:中断

    中断 一 查询与中断 1 查询 按照主函数中的语句顺序 顺序执行 1 优点 结构简单 易于理解 2 缺点 无法充分利用CPU资源 2 中断 程序顺序执行 遇到中断使能 跳转执行中断函数 1 优点 充分利用CPU资源 提高效率 易于处理突发事