我在LinuxMint 17.2 64b上使用arm-none-eabi-gcc toolchain,v 4.8.2。
我,在业余爱好者层面,尝试使用TM4C123G板及其常用功能(编码各种闪光灯,uart东西......)但总是尽量保持尽可能接近金属而不使用其他库(例如CMSIS ...)尽可能。也没有IDE(CCS,Keil ......),只有Linux终端窗口,董事会和我...所有这些主要用于教育目的。
问题:我试图实现通常的中断函数,例如:
EnableInt(清除特殊注册表PRIMASK的第0位,第I位):
CPSIE I
WaitForInt:
WFI
DisableInt:
CPSID I
例如,我将此函数添加到我的.c文件中,用于EnableInt:
void EnableInt(void)
{ __asm(" cpsie i\n");
}
...这个编译但是执行似乎没有正常工作(在最简单的blinky.c版本中,一旦我在C代码中调用了EnableInt(),我就无法获得任何LED动作)。可以找到blinky.c代码here。
在.c文件中编写这些中断例程的正确方法是什么(理想情况下不使用其他库,只需设置/清除相应寄存器的位......)?
编辑:删除了bx lr指令 - 但EnableInt()似乎没有更好的效果 - 仍在寻找解决方案。
EDIT2:实际上,如上定义的函数EnableInt()现在正在工作。我的SysTick_Handler被错误地映射到启动文件中的中断向量表(而我原来的问题是我在Edit1中删除的bx lr指令)。
答案 0 :(得分:2)
您的Tivia MCU所包含的ARM Cortex-M4 CPU基本上不需要软件环境采取特殊操作来进入/退出中断处理程序。唯一的要求是使用AAPCS调用标准,如果为这个CPU进行编译,它应该是gcc的默认值。
ARM提供的一些紧密耦合的“核心”外设支持CPU。这些是大多数(如果不是全部)Cortex-M3 / 4 MCU的标准配置。 MCU供应商可以配置一些功能,但基本操作始终是相同的。
为简化软件开发,ARM推出了CMSIS软件标准。这至少包含一些头文件,这些头文件统一了对核心外设的访问并使用了特殊的CPU指令。其中包括操纵特殊CPU寄存器的内在函数,如PRIMASK,BASEMASK,OPTION等。另一个标题提供了核心外设和函数的定义,以便在简单访问不足的情况下操作其中的一些。
因此,其中一个外设支持CPU进行中断处理:NVIC
(嵌套向量中断控制器)。这优先考虑中断相互之间的相互作用,并向CPU提供中断向量,CPU使用该向量来获取中断处理程序的地址。
NVIC还包括所有中断源的使能位。因此,要由CPU处理中断,对于典型的MCU,您必须在两个或三个位置启用中断:
某些外设可能没有内部位,因此可能缺少最后一位。
为了使工作正常,你应该阅读参考手册(家庭指南,或类似的),然后经常有一些“编程Cortex-M4”如何(例如ST有一个用于STM32系列)。您还应该从ARM获取文档(可以免费下载)。
最后,您需要MCU供应商提供的CMSIS标头(TI此处)。这些应该适合您的MCU。你可能需要提供一些`#define's。
而且,是的,这是一些需要阅读的内容。但是,值得付出努力。或者,您可以从一本书开始。有一些可能有助于首先了解整个情况(很难从单个文档中获取 - 但可能)。