【问题标题】:Where to find I bit and how to edit it to enable interrupts in ARM Cortex-M4在哪里可以找到 I 位以及如何编辑它以在 ARM Cortex-M4 中启用中断
【发布时间】:2015-08-21 06:16:08
【问题描述】:

在 ARM Cortex-M4F MCU(特别是 TM4C1294NCPDT)中,为了处理中断(GPIO 中断),使中断工作的步骤之一是清除 I BIT。

我搜索了很多,但找不到任何有用的信息,谁能告诉我在哪里可以准确找到那个位以及如果我需要一些特殊程序如何编辑它?

如果我在解释之后被告知在哪里可以找到该信息,那就太好了(学习如何回答自己的任何其他问题)。

【问题讨论】:

  • 该设备的数据表有关于如何对 GPIO 进行编程的文档。它也有关于 NVIC(主中断控制器)的一些信息:ti.com/lit/ds/symlink/tm4c1294ncpdt.pdf 另外,您可能想看看Joseph Yiu 的“ARM Cortex-M3 和 Cortex-M4 权威指南”,这是一本非常易读的 Cortex ARM CPU 指南。当然,终极参考是ARM Architecture Reference Manuals,可以从ARM的网站下载:infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0403e.b/…
  • 还有一个generic programmer's guide for Cortex-M4 cores 可能有用。此外,这里似乎可能存在一些混淆——“I bit”听起来像是指“经典”和 A/R 类架构的 CPSR,而在 M 类上,PRIMASK 寄存器完成了相同的工作.无论哪种方式,在许多情况下,使用cps 指令比直接戳寄存器更简单。
  • @MichaelBurr 实际上我在里面搜索了所有内容,但不是在 ARM Cortex-M4 的权威指南中,可能是我不知道如何正确搜索。请你指导我在哪里可以找到我的问题的答案?

标签: arm embedded microcontroller cortex-m


【解决方案1】:

ARM Cortex-M 中断系统相当复杂且经过深思熟虑。它由 CPU 寄存器和紧密耦合的中断控制器 (NVIC) 组成。中断被优先化和向量化。对于较小的 8/16 位 MCU,没有单一的中断启用标志。

对于每个中断,有两个 ARM 内核实例将事件门控到 CPU:CPU PRIMASK 寄存器(一位),可以看出它与经典的中断启用标志最相似。其次是 NVIC 中的一个使能位。对于这些,CMSIS 标头中有一个 ARM 标准。这些为 PRIMASK 位提供函数 __enable_irq()__disable_irq()。外设中断本身必须由NVIC_EnableIRQ(IRQn_Type IRQn) 控制,其中IRQn 是MCU 特定头文件中定义的中断号。

最后,大多数情况下,每个外围模块中的中断使能位也是较小的 MCU 所知道的。

请注意,要使中断通过所有门必须打开(所有位都设置为“启用”)。使用 CMSIS 函数来操作位。他们很可能不会接受比手工制作的版本更多的说明。

编辑:

实际上没有必要用汇编程序或寄存器来摆弄自己。只需使用 CMSIS 功能,您自己很可能不会做得更好,但可能会更糟。这实际上是 CMSIS 的意图。

(结束编辑)

开始阅读 MCU 的参考手册和供应商的主页。这应该为设备提供参考和应用笔记。您还应该阅读 ARM 的技术参考手册、架构参考手册。实际上,只需仔细查看 CPU 的所有相关文档(M4 适合您)。这些是免费的,有些需要注册。

对于 NVIC,您不应直接访问它,而应使用 TI 为该 MCU 提供的 CMSIS 头文件(这些头文件需要一些特定于设备的设置)。如果不可用,您可以从 ARM 获得它们,但必须自己提供特定于设备的设置(它们很少,在 MCU 的参考手册中给出)。

由于 ARM Cortex-M4 有多个中断,您需要它们的符号名称来启用/禁用。这些也必须在定义所有外围模块的 MCU 头文件中定义(可能有多个这样的头文件)。名称以_IRQn 结尾,直接搜索即可。

要使用 Cortex-M4,您应该阅读提供的文档,或者您可以尝试阅读一本好书。但是,由于这里不是教程网站,也不允许推荐书籍,请自行搜索。

【讨论】:

  • 其实我昨天花了很多时间在网上搜索和阅读数据表,但我找不到任何有用的信息,你能帮我更多的人得到我需要的吗?
  • @MohammedNoureldin:我的回答确实包含了足够的信息以供开始......请理解这不是教程网站。但是,如果您有任何具体问题,欢迎您提出。
  • 每个GPIO也可以单独设置是否中断。有关这方面的信息,您必须转到 TM4C1294NCPDT 数据表。
  • @MichaelBurr 我的问题不在于 GPIO itelt 的中断,问题是直到现在仍然只是 I 位。
  • 实际上可以通过CPSIE ICPSID I 指令(以及__disable_irq()/__enable_irq() CMSIS 内在函数)的单个标志来全局启用/禁用中断
【解决方案2】:

CMSIS 为基于 Cortex-M 的设备提供标准的跨供应商软件接口。 CMSIS 定义了许多 functions for interacting with the NVIC 和 PRIMASK,包括内部函数 __disable_irq()/__enable_irq()

【讨论】:

  • 我在看一个视频,我真正理解的是我有两个选项来启用中断:1.是使用你提到的 CMSIS 中的功能。 2.是使用EN寄存器并启用相应的位。而且我可以随意使用任何我想要的,对吗?如果是,它们之间有什么区别?那么我比特的实际作用是什么?
  • @MohammedNoureldin :正如我提供的链接中所述,没有区别。 intrinsic 虚构是一种包装特定于处理器的操作,该操作不能直接在 C 中执行,并且避免了对汇编代码的需要。如果你看头文件中这些函数的定义,我相信它们只是CPSIE/D指令的内联汇编。
  • 好的,我的问题最简单的答案是:使用“CPSID I”或“CPSIE I”内联汇编代码,它们将分别设置或清除 PRIMASK (I) 位。 (当然这只能在特权模式下工作)。两个汇编指令分别相当于CMSIS中的__disable_irq()和__enable_irq()函数。
【解决方案3】:

好的,我的问题最简单的答案是:

使用“CPSID I”或“CPSIE I”内联汇编代码将分别设置或清除 PRIMASK (I) 位。 (当然这只能在特权模式下工作)。

两个汇编指令分别相当于CMSIS中的__disable_irq()__enable_irq()函数。

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2018-05-06
    • 2019-01-30
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2017-01-26
    相关资源
    最近更新 更多