【嵌入式之中断】

news2024/11/28 4:39:39

Cortex-M4集成了嵌套式矢量型中断控制器(Nested Vectored Interrupt Controller (NVIC))来实现高效的异常和中断处理。NVIC实现了低延迟的异常和中断处理,以及电源管理控制。它和内核是紧密耦合的。

凡是打断程序顺序执行的事件都称为异常(exception),比如HardFault,外部中断等。所以中断​也可以说是异常的一种。

一、中断的作用

全局中断使能位控制着“所有”中断,它如果关闭,则会屏蔽其它中断。

在使用过程中,常关闭全局中断,以防止其他中断的干扰。
当GPIO模拟某个时序时,在GPIO传输数据过程中,若被某个中断干扰,会导致时序不准确问题,通常的做法是关闭全局中断,数据传输完成后打开全局中断
同样在RTOS中对全局变量的保护基本上都使用了全局中断。

__disable_irq();
//数据传输
__enable_irq();

但关中断时间较长,导致串口接收FIFO溢出,数据丢失。

所以需要注意:全局中断关闭时间都不是太长,且严禁出现长时间关中断,严禁出现关中断时间不可控,这样会影响实时性。
时间不可控比如:长链表操作、环形缓冲区操作、循环操作等。

二、中断优先级

异常包括系统异常(异常编号1-15)和外部中断(异常编号16往上)。HardFault(-1)这三个异常优先级都是负数且固定不变,优先级高于其他异常,除了这三个异常之外其他异常优先级都是可以编程的。

1、中断抢占

每个中断优先级都包含两个部分,一部分称作抢占优先级,另一部分称作子优先级。

(1)抢占优先级(中断嵌套)
在执行低中断优先级中断函数时,高优先级中断到来,低优先级中断被打断,执行高优先级中断,高优先级中断执行完后回到低优先级中断继续执行。

在这里插入图片描述

具有高抢占优先级的中断能够抢占低抢占优先级的中断,也称之为中断嵌套。

(2)抢占优先级相同,子优先级不同

当两个中断的抢占优先级设置为相同级别时,这两个中断不会出现中断嵌套。

如果其中一个中断正在执行时,另外一个中断到来,后来的中断将会等到前一个中断执行完才能执行。如果这两个中断都处在等待响应状态,执行条件到来时,首先响应子优先级高的中断。

(3)抢占优先级相同,子优先级也相同

这种情况也不会出现中断嵌套,内核将会按照向量表中的排位选择,优先执行靠前的异常。

2、优先级分组

在Cortex-M4内核中,优先级分组是一个用于配置中断优先级的重要机制。它决定了在8位的中断优先级字段中,多少位用于表示抢占优先级,多少位用于表示子优先级。

Cortex-M4内核允许通过配置优先级分组寄存器(例如,ARM Cortex-M3中的AIRCR寄存器)来设置不同的优先级分组方案。优先级分组寄存器通常包含几位用于配置优先级的字段。通过设置这些位,可以选择不同的分组方式,从而决定抢占优先级和子优先级的位数分配。

具体的分组方式可以有多种,例如:

  • 分组0:所有8位都用于表示子优先级,没有抢占优先级。
  • 分组1:最高1位用于表示抢占优先级,最低的7位用于表示子优先级。
  • 分组2:最高2位用于表示抢占优先级,最低的6位用于表示子优先级。
  • 分组3:最高3位用于表示抢占优先级,最低的5位用于表示子优先级。
  • 分组4:所有8位都用于表示抢占优先级,没有子优先级。

不同的分组方式可以根据具体的应用需求来选择。抢占优先级用于决定在中断发生时哪个中断应该被优先处理,而子优先级则在抢占优先级相同的情况下用于进一步区分中断的优先级。

示例:

nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable((uint8)USBFS_IRQn,2U,0U);
nvic_irq_enable((uint8)USBFS_WKUP_IRQn,1U,0U);

三、中断配置

在使用ARM Cortex-M系列微控制器时,中断处理是一个非常重要的部分。在Cortex-M4(或类似的Cortex-M系列)中配置中断示例如下。(实际的实现细节可能会根据您使用的具体硬件和库有所不同。)

1、选择中断源:
首先确定要使用的中断源。这可能是外部中断、定时器中断或其他内部中断。

2、配置中断优先级:
Cortex-M4支持中断优先级。根据应用的需求为每个中断分配优先级

3、配置NVIC (Nested Vectored Interrupt Controller):
NVIC是Cortex-M系列中的中断控制器。需配置NVIC以启用和配置所需的中断。

4、编写中断服务程序 (ISR):
为每个中断编写中断服务程序。当中断发生时,这些程序将被执行。

以下示例基于ARM Cortex-M4 内核的 GD32 微控制器。

示例1:如何配置一个外部中断(EXTI)(例如,来自某个GPIO引脚的中断)

#include "gd32f3xx.h"  //确保已经包含了必要的头文件
  
// 假设您已经有一个系统时钟初始化的函数  
void SystemClock_Config(void);  
  
// EXTI0 的中断服务程序  
void EXTI0_IRQHandler(void)  
{  
    if (RESET != exti_interrupt_flag_get(EXTI_0)) // 检查 EXTI0 的中断标志  
    {  
        // 清除中断标志  
        exti_interrupt_flag_clear(EXTI_0);  
          
        // 在这里处理中断逻辑  
    }  
}  
  
int main(void)  
{  
    // 系统时钟初始化  
    SystemClock_Config();  
      
    // GPIO 端口时钟使能  
    rcu_periph_clock_enable(RCU_GPIOA);  
      
    // 配置 GPIOA 的第 0 号引脚为中断模式  
    gpio_mode_set(GPIOA, GPIO_MODE_IT, GPIO_PUPD_NONE, GPIO_PIN_0);  
    gpio_interrupt_enable(GPIOA, GPIO_INT_FALLING); // 下降沿触发  
      
    // 配置 EXTI 的中断线 0  
    exti_interrupt_flag_clear(EXTI_0); // 清除可能存在的挂起中断  
    exti_line_config(EXTI_SOURCE_GPIOA, EXTI_LINE_0);  
    exti_mode_set(EXTI_MODE_INTERRUPT, EXTI_LINE_0);  
    exti_trigger_type_set(EXTI_TRIGGER_FALLING, EXTI_LINE_0); // 下降沿触发  
      
    // 配置 NVIC  
    nvic_irq_enable(EXTI0_IRQn, 0, 0); // 使能 EXTI0 的中断,并设置优先级  
      
    while (1)  
    {  
        // 主循环代码  
    }  
}

四、扩展示例

配置内部中断(如定时器中断)

配置相关步骤为:

1、初始化定时器:
首先,需要初始化定时器,并设置其参数,如预分频值、自动重载值等,以决定定时器的计数周期和中断触发频率。

2、配置定时器中断:
启用定时器的中断功能,并设置中断触发条件(如溢出中断、比较匹配中断等)。

3、配置NVIC:
使用嵌套向量中断控制器(NVIC)来配置中断的优先级和使能中断。

4、编写中断服务程序(ISR):
编写一个中断服务程序,该程序将在定时器中断发生时被执行。

#include "gd32f3xx.h"  
  
// 假设您已经有一个系统时钟初始化的函数  
void SystemClock_Config(void);  
  
// 定时器中断服务程序  
void TIMERx_IRQHandler(void) // 这里的x代表具体的定时器编号,如TIMER2  
{  
    if (RESET != timer_interrupt_flag_get(TIMERx, TIMER_INT_FLAG_UP)) // 检查定时器的中断标志  
    {  
        // 清除中断标志  
        timer_interrupt_flag_clear(TIMERx, TIMER_INT_FLAG_UP);  
          
        // 在这里处理中断逻辑  
    }  
}  
  
int main(void)  
{  
    // 系统时钟初始化  
    SystemClock_Config();  
      
    // 定时器时钟使能  
    rcu_periph_clock_enable(RCU_TIMERx); // 这里的x代表具体的定时器编号,如TIMER2  
      
    // 定时器初始化结构体定义和初始化  
    timer_parameter_struct timer_initpara;  
    timer_initpara.prescaler         = 7199;  // 预分频值  
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;  
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;  
    timer_initpara.period            = 9999;  // 自动重载值  
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;  
    timer_initpara.repetitioncounter = 0;  
    timer_init(TIMERx, &timer_initpara); // 初始化定时器  
      
    // 启动定时器  
    timer_enable(TIMERx);  
      
    // 配置定时器中断  
    timer_interrupt_enable(TIMERx, TIMER_INT_FLAG_UP); // 使能定时器中断  
      
    // 配置NVIC  
    nvic_irq_enable(TIMERx_IRQn, 0, 0); // 使能定时器的中断,并设置优先级  
      
    while (1)  
    {  
        // 主循环代码  
    }  
}

以上示例中:首先初始化了系统时钟,然后使能了定时器的时钟。接着,定义了定时器的初始化参数,并调用timer_init函数来初始化定时器。之后,我们启动了定时器,并配置了定时器中断。最后,使用nvic_irq_enable函数来使能定时器的中断,并设置了其优先级。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp h5项目实现多选按钮/多选标签/多选框

需求&#xff1a;实现简单多选功能&#xff0c;遍历数据&#xff0c;添加样式 1.效果图 2.以下代码粘贴到代码中&#xff0c;可直接运行&#xff0c;html代码 <view class"page index"><view class"list-box"><view v-for"(item,in…

【力扣】-- 移除链表元素

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

Github 2024-04-11 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目4Python项目3JavaScript项目1Cuda项目1Jupyter Notebook项目1非开发语言项目1Dify.AI: 开源的LLM应用程序开发平台 创建周期:29…

C语言 | Leetcode C语言题解之第21题合并两个有序链表

题目&#xff1a; 题解&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {/…

基于Vue的宠物领养系统的设计与实现(论文+源码)_kaic

目 录 摘 要 ABSTRACT 1 引言 1.1 课题背景 1.2 设计原则 1.3 论文组织结构 2 系统关键技术 2.1 JSP技术 2.2 JAVA技术 2.3 B/S结构 2.4 MYSQL数据库 3 系统分析 3.1 可行性分析 3.1.1 操作可行性 3.1.2 经济可行性 3.1.3 技术可行性 3.1.4 法律可行性 3.2 系统功能分析 3.3…

SpringClout 引用 xxjob定时任务

SpringClout 引用 xxjob定时任务 下载源码组成部分调度中心使用步骤修改调度中心配置配置解释启动验证 执行器使用步骤修改执行器配置执行器组件配置启动创建定时任务创建任务代码 [附加已有项目调用xxjob API](https://blog.csdn.net/fannan521/article/details/132707242) 下…

PDF文件内容可以转成word版本吗?答案是肯定的 PDF转word的方法

一&#xff0c;PDF转Word的必要性 随着信息技术的飞速发展&#xff0c;文档的格式和转换成为了我们日常生活和工作中不可避免的一部分。其中&#xff0c;PDF转Word的需求尤为突出。PDF作为一种跨平台的文档格式&#xff0c;具有阅读效果好、不易被篡改等优点&#xff0c;但在编…

hcia datacom课程学习(6):路由与路由表基础

1.路由的作用 不同网段的设备互相通信需要具有路由功能的设备进行转发 具有路由功能的设备不一定是路由器&#xff0c;交换机可以有路由功能&#xff0c;同样的&#xff0c;路由器也可以有交换功能&#xff0c;像家里常用的路由器就是集路由功能和交换功能于一体的 2.路由相…

响应式wordpress自媒体资讯文章新闻博客图片自适应PC模板源码html5博客文章模板源码

响应式wordpress自媒体资讯文章新闻博客图片自适应PC模板源码html5博客文章模板源码利于SEO优化 wordpress内核开发的自媒体资讯文章新闻博客网站模板 PCWAP端同一个后台&#xff0c;数据即时同步&#xff0c;简单适用&#xff01; 源码是wordpress开发的官网系统 后台非常简单…

python爬虫----BeautifulSoup(第二十天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

开源监控zabbix对接可视化工具grafana教程

今天要给大家介绍的是开源监控工具zabbix对接可视化工具grafana问题。 有一定运维经验的小伙伴大抵都或多或少使用过、至少也听说过开源监控工具zabbix&#xff0c;更进一步的小伙伴可能知道zabbix在数据呈现方面有着明显的短板&#xff0c;因此需要搭配使用第三方的可视化工具…

全新华为MateBook X Pro发布,将Ultra9放入980g超轻薄机身

2024年4月11日&#xff0c;在华为鸿蒙生态春季沟通会上全新的华为MateBook X Pro正式发布。该机以美学设计、创新科技以及智慧体验&#xff0c;追求重新定义Pro、重新定义旗舰&#xff0c;将颠覆消费者对传统轻薄本的认知。 华为MateBook X Pro追求极致轻薄与强大性能的完美结合…

python-使用bottle时间简易服务器

python-使用bottle时间简易服务器 调试读取文本所有内容字段解析json字符串解析追加写入文件 整理后整理后写入文件方法将目录下所有文本的内容批量追加到一个文本搜索字符串方法实现简易服务器通过浏览器访问 调试 读取文本所有内容 fopen("./howtousercbow/data/other…

pytorch实现胶囊网络(capsulenet)

胶囊网络在hinton刚提出来的时候小热过一段时间&#xff0c;之后热度并没有维持多久。vision transformer之后基本少有人问津了。不过这个模型思路挺独特的&#xff0c;值得研究一下。 这个模型的提出是为了解决CNN模型学习到的特征之间没有空间上的关系&#xff0c;从而对于各…

python毕业设计django游泳馆管理系统-flask

游泳馆管理系统具有信息管理功能的选择。游泳馆管理系统采用python技术&#xff0c;基于mysql开发&#xff0c;实现了首页&#xff0c;教练信息&#xff0c;培训信息&#xff0c;交流版块&#xff0c;活动公告&#xff0c;个人中心&#xff0c;后台管理等内容进行管理&#xff…

怎样将PDF转成PPT,有免费的工具吗?

PDF转换为PPT的需求在现代办公和学习中越来越常见。很多人可能遇到过需要将PDF文件中的内容转移到PPT中以方便编辑和展示的情况。幸运的是&#xff0c;现在市面上有许多工具可以帮助我们实现这一目标&#xff0c;而且其中不乏一些免费的选项。本文将详细介绍如何使用这些免费工…

Python 批量检测ip地址连通性,以json格式显示(支持传参单IP或者网段)

代码 ########################################################################## File Name: check_ip_test.py# Author: eight# Mail: 18847097110163.com # Created Time: Thu 11 Apr 2024 08:52:45 AM CST################################################…

小程序中配置scss

找到&#xff1a;project.config.json 文件 setting 模块下添加&#xff1a; "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后&#xff0c;重启开发工具&#xff0c;并新建文件 结果&#xff1a;

使用hexo+gitee从零搭建个人博客

一、环境准备 1.Node.js&#xff1a;下载 | Node.js 中文网 (nodejs.cn) &#xff0c;Hexo 是基于Node.js 的博客框架 教程&#xff1a;https://blog.csdn.net/weixin_52799373/article/details/123840137 node -v npm -v 安装 Node.js 淘宝镜像加速器 &#xff08;cnpm&am…

JS-28-AJAX

一、AJAX的定义 AJAX不是JavaScript的规范&#xff0c;它只是一个哥们“发明”的缩写&#xff1a;Asynchronous JavaScript and XML&#xff0c;意思就是用JavaScript执行异步网络请求。 如果仔细观察一个Form的提交&#xff0c;你就会发现&#xff0c;一旦用户点击“Submit”…