garfield

【原创】飞思卡尔coldfire处理器外部中断使用

0
阅读(2839)

1 引言

本篇博文介绍飞思卡尔coldfire处理器外部中断的使用,给需要的朋友参考。

 

2 MCF521x EPORT的特点

外部中断输入模块(EPORT)有7个外部中断引脚:IRQ7~IRQ1。每个引脚可以独立地配置为电平敏感中断引脚、边沿检测中断引脚或通用输入/输出(GPIO)引脚。

2.1 描述

主要特点如下:

允许多达7个外部中断源

对低电平或两种边沿检测都敏感

每个引脚都可以作中断或普通I/O口用

施密特触发输入可以降低假中断次数

可以在三种低功耗模式下运行

3 EPORT模块的解释

利用飞思卡尔官方 M5213EVB开发板上用于请求中断的三个按钮,实例代码展示了EPORT模块是如何工作的。代码示范了如何配置和使用flash模块,使得编程人员可以很快地把它包含到他们的项目中。

MCF5213的EPORT其实就是7个外部中断引脚的集合体,每个引脚都可以独立地配置为低电平触发或边沿触发。如果选择边沿触发,还可以指定是上升沿、下降沿或两种都触发。施密特触发逻辑已经集成到该端口的设计中。如果配置为边沿触发,上升/下降过渡比较慢时可以避免产生假中断。

在低功耗运行的DOZE或WAIT模式下,EPORT的功能仍是完整的。事实上,它们可以使处理器跳出这些模式。在STOP模式下也一样,只不过因为所有的内部时钟被禁止,导致EPORT失去与边沿触发中断同步的能力;因此在STOP模式下只能检测到电平触发的中断。

为了将一个EPORT引脚用作外部中断请求源,必须通过GPIO引脚分配寄存器将该引脚配置为 EPORT功能并设置 EPORT寄存器中相应的输入位。在EPORT模式下,不再需要GPIO输入/输出寄存器。在GPIO模式下,EPORT输入/输出寄存器也不会产生任何影响。

3.1 实例:EPORT模块的实例学习

实例代码使用了M5213EVB上的以下外部硬件:

ABORT按钮  SW1按钮  SW2按钮  LED[1:4]

可以根据以下方法按三个按钮中的任一个来测试实例代码:

ABORT按钮的中断级别最高(level 7)。

每次执行IRQ7中断服务例程(ISR)时,0x05在LED上显示一段时间。

SW2按钮的中断级别居中(level 5)。

每次执行IRQ5中断服务例程(ISR)时,0x0C在LED上显示一段时间。

SW1按钮的中断level居中(level 4)。

每次执行IRQ4中断服务例程(ISR)时,0x03在LED上显示一段时间。

 

当中断请求的IRQ级别高于当前ISR的级别时,当前中断被新的中断请求切换。新中断完成后,原来的中断从被切换前的那行代码处继续执行。当中断请求的IRQ级别低于当前ISR的级别时,当前中断继续执行完成

后,才开始执行未处理中断。

 

3.2 实例:配置CFM模块

表2列出了EPORT的寄存器。

image

 

在实例代码中,三个引脚都被设置为检测上升沿事件触发,并根据IRQ引脚中断源改变M5213EVB上LED的显示内容。

3.3 寄存器的配置

本节介绍了会影响整个EPORT模块的寄存器配置,并给出了相关代码。

3.4 NQ口的引脚分配寄存器

下面的代码是用来将PNQPAR配置为EPORT功能,参见图1所示。

/* 使能该端口的IRQ信号 */

MCF_GPIO_PNQPAR = 0

| MCF_GPIO_PNQPAR_IRQ4_IRQ4

| MCF_GPIO_PNQPAR_IRQ5_IRQ5

| MCF_GPIO_PNQPAR_IRQ7_IRQ7;

image

 

3.4.1 EPORT引脚分配寄存器

可使用以下代码配置EPPAR。对该寄存器的修改见图2所示。

/* 设置EPORT为上升沿检测 */

MCF_EPORT_EPPAR = 0

| MCF_EPORT_EPPAR_EPPA4_RISING

| MCF_EPORT_EPPAR_EPPA5_RISING

| MCF_EPORT_EPPAR_EPPA7_RISING;

image

3.4.2 EPORT中断使能寄存器

为了写入图3所示的值,程序可使用以下代码配置EPPAR。

/* 清空当前EPORT中触发的事件 */

MCF_EPORT_EPIER = 0

| MCF_EPORT_EPIER_EPIE4

| MCF_EPORT_EPIER_EPIE5

| MCF_EPORT_EPIER_EPIE7;

image

 

3.4.3中断屏蔽寄存器

为了对IMRL写入图4所示的值,可使用以下代码。

/* 在中断控制器内使能相应中断 */

MCF_INTC_IMRL &= ~(0

| MCF_INTC_IMRL_MASK4

| MCF_INTC_IMRL_MASK5

| MCF_INTC_IMRL_MASK7

| MCF_INTC_IMRL_MASKALL);

 image

3.4.4状态寄存器

下面的代码根据图5配置状态寄存器。在修改SR[I]前必须先将SR[S]置位。

/*

* 修改5213的中断级别为0

* 以允许所有中断级别高于0的请求

*/

image

 

3.5 配置小结

为了将IRQ引脚配置为利用边沿检测外部事件,步骤如下:

1.修改vectors.s文件中提供的ISR(中断服务例程)地址。详细情况参加EPORT的SoftwareDemo软件中的vector.s。

2.在引脚分配寄存器中配置EPORT为主要功能。

3.写EPPAR寄存器,将每个引脚设置为边沿检测(上升、下降或两者都有)。

4.利用EPIER寄存器,清空EPORT的当前触发事件。

5.利用IMRL寄存器,使能中断控制器的相应中断。

6. 将5213中断级别修改为0,允许中断级别大于0的所有中断请求。中断级别的默认值为7。

7.对每个ISR:

通过EPPDR寄存器读取IRQ引脚的状态,直到无效。根据相应的ISR执行具体操作。在离开ISR之前,通过设置EPFR寄存器的相应位来清除中断事件。

4 配置注意事项

在配置和使用EPORT时,需要注意以下细节:

如果使用EPORT功能,需要设置引脚方向(输入或输出)。EPORT只工作在输入方式下。设置输出会禁止EPORT功能。

不能改变相关的IRQ中断级别。

使用IRQ引脚时,退出STOP模式的唯一方法是将所选的EPORT引脚设置为电平检测,因为在这种功耗模式下没有时钟可用于边沿检测。

为了保证电平触发的中断请求被响应,中断源必须保持信号assert直到软件有响应。

5 总结

EPORT模块是ColdFire处理器MCF521x中一个很有用的模块。为了区分这些事件的优先次序,每个引脚与一个即将被执行的动作相联系。每个引脚有一个不同的固定的中断级别。例如:每检测到一个事件时,IRQ7总是会执行,即使有一个低级别的IRQ中断(无屏蔽能力)在运行也无防。可以将其他的IRQ编程配置为禁止另外的IRQ。当正在执行一个事件且有一个中断发生时,新的事件可能被阻塞或立即被执行并阻塞先前的事件。所有这些特点允许编程人员在不失去对其他模块的控制下,建立强有力的应用来处理外部事件。