ARM Cortex-M0+中断机制与中断编程步骤

2023-05-16

中断基础知识

为什么需要使用中断?

如果通过查询接收标志查看一个字节是否收到,则需要时刻花费CPU等资源。但中断机制能够在收到一个字节后,通知CPU把收到的字节取走。

异常:CPU强行从正常运行的程序切换到由某些内部或外部条件所要求的处理任务(优先度高于正在运行的任务)。

引起异常的外部条件:来自外围硬件、硬件断点请求、访问错误和复位等。

引起异常的内部条件:指令、不对等错误、违反特权和跟踪等。

硬件复位(具有最高优先级)和硬件中断归类为异常;

 

中断:来自CPU外围设备的强行任务切换请求。软件上表现为将程序PC计数器指针强制转换到中断服务程序入口的地址运行。CPU对复位、中断异常具有相同的处理过程,可统一称为中断。

中断源:可以引起CPU产生中断的外部器件。一个CPU可以识别多个中断源。每个中断源产生中断后,分别要进行相应的中断服务例程ISR,ISR的起始地址为中断向量地址连续几存储在中断向量表。中断向量表是一个指针数组。明,内容是中断服务例程ISR的首地址。

中断向量号:每个CPU能够识别的中断源编号。

中断服务例程ISR:中断产生后转去运行的程序。

中断发生以后,中断硬件、软件机制通知所有正在运行的程序,并保存当前CPU状态,转而运行一个中断处理程序。处理程序完成以后,恢复CPU至运行中断之前的状态,使得中断前的程序得以继续运行。

中断处理过程

中断请求:当某一个中断源需要CPU为其服务时,它会向CPU发送中断请求信号。中断控制器获取其中断向量号,并对其相应寄存器的“中断请求位”置位,以便通知CPU是何种中断请求。

中断检测:CPU会在每条指令结束时检测有没有中断请求情况,若有中断确实允许中断,则响应该中断请求。

中断响应:CPU会查找中断源所对应的模块中断是否被允许,若被允许,则响应该中断请求。

中断处理:中断响应的过程要求CPU保存当前环境的上下文于堆栈中,通过中断向量号找到中断向量表中对应的中断服务例程ISR,转而运行中断处理服务ISR。由于CPU在中断服务例程要使用CPU内部寄存器,所以需要调用ISR之前,将CPU内部寄存器保存至指定的RAM地址中,即堆栈。

中断返回:中断结束后,再将该RAM地址(堆栈)中的数据恢复到CPU内部寄存器中,从而使中断前后程序运行现场没有任何变化。

ARM Cortex-M0+中断编程结构

中断过程

  1. 模块中断源向嵌套中断向量控制寄存器NVIC发出中断请求信号
  2. NVIC对发来的中断信号进行管理,判断该模块中断是否被使能。若使能,通过私有外设总线PPB发送给M0+内核,由内核进行中断处理。
  3. 如果同时有多个中断信号到来,NVIC根据设定好的中断优先级进行判断,优先级高的中断首先响应,优先级低的中断挂起,压入堆栈保存;
  4. 如果优先级相同的对个中断源同时请求,则先响应IRQ号较小的,其他的被挂起。

中断向量号&非内核中断请求号IRQ

串口接收中断编程步骤

 

  1. 在头文件uart.h中,设定UART_2的实际使用的引脚。

     

  2. 修改main.c文件,在初始化外设模块位置调用uart构件中的初始化函数。

  3. 在初始化外设模块位置调用uart构件中使能模块中断函数。

     

  4. 在开总中断位置调用common.h文件中的开总中断宏函数。

     

  5. 在中断向量表文件中根据中断向量号的顺序找到串口2接收中断服务例程的函数名。然后在中断处理程序文件中添加该函数名。

     

  6. 只要串口2接收到一个字节,这个中断处理程序就会被执行一次。

为规范管理,同一将各个中断服务程序放在工程框架中的isr.c文件中。

串口中断服务例程

当串口2有一个字节的数据到来时产生接收中断,将会执行串口2中断处理函数。

该程序先进入临界区关总中断,接收一个带来的字符。如果接收成功,则把该字符发送回去,退出临界区。

 

 

 

嵌入式技术基础与实践(第4版)

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

ARM Cortex-M0+中断机制与中断编程步骤 的相关文章

  • ARM 未定义指令错误

    我在运行嵌入式系统 无协处理器 无 MMU Atmel 9263 时收到未定义指令错误 嵌入式系统的内存范围为 0x20000000 0x23FFFFFF 目前为止我遇到过两个案例 SP 0x0030B840 LR 2000AE78 LR指
  • 如何在ARMv8-a上启用Aarch32指令集?

    Raspberry Pi 3 使用具有 ARMv8 A53 内核的 Broadcom SoC https www raspberrypi org magpi raspberry pi 3 specs benchmarks 它还使用基于 De
  • 是否有专门设计的 C 函数或宏,用于以跨平台方式与汇编指令进行一对一编译以进行位操作?

    我有一个涉及仿真的项目 如果您查看我的帖子历史记录 您会看到我已经走了多远 并且我希望使用 C 进行伪二进制翻译并使用优化器和 或编译器使用 C 代码将我的 switch 语句内容编译为单个汇编指令 主要用于非常标准的指令 例如movs a
  • 使用 QEMU 模拟 Big Endian ARM 系统

    是否可以编译一些 Linux 内核并通过 QEMU 运行它 模拟一些 Big Endian ARM 处理器 如果 QEMU 无法做到这一点 我很想知道其他可以做到这一点的系统模拟器 我的基本目标是在尽可能多的本机环境中运行和调试专用的 Bi
  • 从 Visual Studio 交叉编译 ARM7 代码

    是否可以从 Visual Studio 2008 2010 Express 或 Professional 编译 ARM7 如果是这样 可以指导我如何做吗 我读过有关 Yagarto 工具链的其他帖子 这一切是如何融入图片中的 我在这个领域非
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • 手臂 g++ 中缺少一些东西

    我安装了 CodeSourcery g 工具链并尝试编译一个简单的 hello world 程序 include
  • 线程安全的向量和字符串容器?

    我之前发过一个问题 在嵌入式 Linux 平台上使用 std string 时出现段错误 https stackoverflow com questions 2412667 seg fault when using stdstring on
  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015

随机推荐

  • ZED摄像头的使用

    原链接 https community bwbot org topic 518 运行测试平台 小强ROS机器人 1 安装CUDA 1 1 禁用原有的驱动 如果你之前安装了nvidia的开源驱动 xff0c 即通过apt get 安装的驱动
  • 头文件包含顺序

    头文件包含顺序 原理 xff1a 当通过 include指令包含另一个头文件时 xff0c 编译预处理器用头文件的内容取代 include指令 xff0c 也就是说 xff0c 头文件的所有内容最终都会被合并到某一个或某几个源文件中 xff
  • 计算机网络(五): ros下socket编程示例

    ros下socket编程示例 服务器端 span class token macro property span class token directive keyword include span span class token str
  • 三种方式实现:进度条

    1 Bootstrap实现进度条 bootstrap min css下载地址 xff1a https cdn staticfile org twitter bootstrap 3 3 7 css bootstrap min css boot
  • 物理端口与逻辑端口

    若 1 端口 端口可分为物理端口与逻辑端口 所谓逻辑端口指的是计算机内部或交换机路由器内的端口 xff0c 看不见 xff0c 摸不着 所谓物理端口 xff0c 就是可见的端口 xff0c 像 xff1a 交换机路由器集线器 RJ11端口
  • RS485接收数据后发送乱码

    序 最近调块板子上面有几路485 xff0c 控制芯片STM32F407VE 转换芯片ADM2587 xff0c 使用485转换器连接电脑 xff0c 发现串口助手向板子发送数据后会收到乱码 xff0c 经软硬件联合调试排除bug 一 问题
  • python urllib.parse

    urlparse span class token keyword from span urllib span class token punctuation span parse span class token keyword impo
  • HTTP学习(5)--demo编写(1)

    一个基于Java的HTTP服务器demo 前面几篇博客 xff0c 大致介绍了几个方面的例子 xff0c 例如报文解析 报文组装等 现在打算将这些东西集合起来 xff0c 编写一个小HTTP服务器demo 期间遇到了很多问题 xff0c 也
  • 用Python写一个监督你刷李永乐考研题目的简单小程序

    import datetime import xlwings import math month 61 datetime datetime now strftime 39 m 39 date 61 datetime datetime now
  • 对于遗传算法,谈谈个人看法

    最近在学习遗传算法 xff0c 小有体会 这个用数学方法来模拟生物学过程的算法实在是有很多值得玩味的地方 遗传算法要干什么 xff1f 比如Z 61 f x y 我们要找到他在x 0 1 y 0 1 区间上的最大值 我们就先随机在x 0 1
  • AD(altium designer)软件的基础使用(硬件的一些总结,写的有些乱,高手请略过)

    1 快捷键 xff1a Ctrl 43 R 复制并重复粘贴 Shift 43 c 取消选择 Space 逆时针旋转对象 Shift 43 space 顺时针旋转对象 X 水平翻转对象 Y 垂直翻转对象 G切换捕捉栅格 V F View中的F
  • C++字节转换 (byte转int 互转)(BCD和HEX转换)

    2个字节short int 高低位转化 short int y 61 0x7f21 y 61 y amp 0xff00 gt gt 8 y amp 0x00ff lt lt 8 printf 34 x 34 y 用short型变量储存 xf
  • 王者荣耀-数模论文分享(虽然结果我自己都不信)

    基于基础数据的王者荣耀英雄强度评估及英雄设计 摘要 王者荣耀是当下很火爆的一款手机游戏 xff0c 如何基于当下的双方阵容选择合适的英雄来获得胜利 xff0c 是一个值得探讨的问题 xff0c 现基于游戏数据对于各个英雄的强度进行建模评估
  • 用蚁群算法求解TSP问题

    TSP是什么 xff1f TSP全称Travelling salesman problem 中文名 xff1a 旅行商问题 就是模拟退火中讲到的14个城市之间巡回旅行 xff0c 求路径最短的问题 为什么偏偏找他呢 xff1f 因为这是一个
  • python 语法小进阶1

    1 filter 是通过生成 True 和 False 组成的迭代器将可迭代对象中不符合条件的元素过滤掉 xff1b 而 map 返回的则是 True 和 False 组成的迭代器 gt gt gt res1 61 map lambda n
  • 焊接的技巧与方法

    手工焊接操作的基本步骤 1 清洁焊接对象的表面 xff0c 这一步是必须的 xff0c 就算你再赶时间也不能偷懒 用小刀或者砂纸把焊点打磨光亮 xff0c 露出铜的光泽 铜表面的氧化物会阻碍焊锡与之形成合金 xff0c 这一步做得不到位的话
  • 计算机网络体系结构

    计算机网络体系结构 一 计算机网络概述计算机网络的概念 组成与功能概念 xff1a 计算机网络 功能 xff1a 数据通信 连通性 资源共享分布式处理 信息综合处理 提高可靠性 负载均衡 发展的三个阶段组成 xff1a 物理组成 xff1a
  • 嵌入式技术基础与实践(第4版)

    1 5 2020 开放权限 在此之前 xff0c 防报告查重 嵌入式系统概述 嵌入式系统常用术语 嵌入式系统常用的C语言基本语法概要 M0 43 体系结构与指令系统简介 存储映象 中断源 硬件最小系统 GPIO及基本打通原理 程序的基本调试
  • 串行通信基础知识与UART驱动构件使用方法

    串行通信基础 串行通信接口 异步串行通信 UART 常称为 串口 或SCI xff0c 在USB未普及之前 xff0c 是PC机必备通信接口之一 通信方式为单字节通信 xff0c 是最简单的串行通信方式 RS232 RS485 接线简单 x
  • ARM Cortex-M0+中断机制与中断编程步骤

    中断基础知识 为什么需要使用中断 xff1f 如果通过查询接收标志查看一个字节是否收到 xff0c 则需要时刻花费CPU等资源 但中断机制能够在收到一个字节后 xff0c 通知CPU把收到的字节取走 异常 xff1a CPU强行从正常运行的