【原创】ColdFire微控制器MCF521x的外部中断输入模块的使用
0赞1.今天简单介绍一下飞思卡尔coldfire系列处理器eport模块的使用,欢迎拍砖。
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上显示一段时间。
表1给出了一些按钮组合。执行中断时会出现两种情况:
当中断请求的IRQ级别高于当前ISR的级别时,当前中断被新的中断请求切换。新中断完成后,原来的中断从被切换前的那行代码处继续执行。 当中断请求的IRQ级别低于当前ISR的级别时,当前中断继续执行完成后,才开始执行未处理中断。
3.2 实例:配置CFM模块
表2列出了EPORT的寄存器。
在实例代码中,三个引脚都被设置为检测上升沿事件触发,并根据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;
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;
3.4.2 EPORT中断使能寄存器
为了写入图3所示的值,程序可使用以下代码配置EPPAR。
/* 清空当前EPORT中触发的事件 */
MCF_EPORT_EPIER = 0
| MCF_EPORT_EPIER_EPIE4
| MCF_EPORT_EPIER_EPIE5
| MCF_EPORT_EPIER_EPIE7;
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);
3.4.4 状态寄存器
下面的代码根据图5配置状态寄存器。在修改SR[I]前必须先将SR[S]置位。
/*
* 修改5213的中断级别为0
* 以允许所有中断级别高于0的请求
*/
asm(move.w #0x2000,SR);
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。当正在执行一个事件且有一个中断发生时,新的事件可能被阻塞或立即被执行并阻塞先前的事件。所有这些特点允许编程人员在不失去对其他模块的控制下,建立强有力的应用来处理外部事件。