第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上的以下外部硬件:

3.2 实例:配置CFM模块
表2列出了EPORT的寄存器。
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]
- ● 每次执行IRQ7中断服务例程(ISR)时,0x05在LED上显示一段时间。 SW2按钮的中断级别居中(level 5)。
- ● 每次执行IRQ5中断服务例程(ISR)时,0x0C在LED上显示一段时间。 SW1按钮的中断level居中(level 4)。
- ● 每次执行IRQ4中断服务例程(ISR)时,0x03在LED上显示一段时间。 表1给出了一些按钮组合。执行中断时会出现两种情况:
- (1)当中断请求的IRQ级别高于当前ISR的级别时,当前中断被新的中断请求切换。新中断完成后,原来的中断从被切换前的那行代码处继续执行。
- (2)当中断请求的IRQ级别低于当前ISR的级别时,当前中断继续执行完成后,才开始执行未处理中断。
表1 EPORT演示软件的实例

表2列出了EPORT的寄存器。
表2 EPORT寄存器
在实例代码中,三个引脚都被设置为检测上升沿事件触发,并根据IRQ引脚中断源改变M5213EVB上LED的显示内容。
3.3 寄存器的配置
本节介绍了会影响整个EPORT模块的寄存器配置,并给出了相关代码。
3.4 NQ口的引脚分配寄存器

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;

图2 EPORT引脚分配寄存器
3.4.2 EPORT中断使能寄存器
为了写入图3所示的值,程序可使用以下代码配置EPPAR。
/* 清空当前EPORT中触发的事件 */
MCF_EPORT_EPIER = 0
| MCF_EPORT_EPIER_EPIE4
| MCF_EPORT_EPIER_EPIE5
| MCF_EPORT_EPIER_EPIE7;

图3 EPORT端口中断使能寄存器

图4 中断屏蔽寄存器高32位
<<上一页 下一页>>

在实例代码中,三个引脚都被设置为检测上升沿事件触发,并根据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;
/* 使能该端口的IRQ信号 */
MCF_GPIO_PNQPAR = 0
| MCF_GPIO_PNQPAR_IRQ4_IRQ4
| MCF_GPIO_PNQPAR_IRQ5_IRQ5
| MCF_GPIO_PNQPAR_IRQ7_IRQ7;

图1 NQ口引脚分配寄存器(PNQPAR)
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;

图2 EPORT引脚分配寄存器
3.4.2 EPORT中断使能寄存器
为了写入图3所示的值,程序可使用以下代码配置EPPAR。
/* 清空当前EPORT中触发的事件 */
MCF_EPORT_EPIER = 0
| MCF_EPORT_EPIER_EPIE4
| MCF_EPORT_EPIER_EPIE5
| MCF_EPORT_EPIER_EPIE7;

图3 EPORT端口中断使能寄存器
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);
为了对IMRL写入图4所示的值,可使用以下代码。
/* 在中断控制器内使能相应中断 */
MCF_INTC_IMRL &= ~(0
| MCF_INTC_IMRL_MASK4
| MCF_INTC_IMRL_MASK5
| MCF_INTC_IMRL_MASK7
| MCF_INTC_IMRL_MASKALL);

图4 中断屏蔽寄存器高32位
3.4.4 状态寄存器
下面的代码根据图5配置状态寄存器。在修改SR[I]前必须先将SR[S]置位。
/*
* 修改5213的中断级别为0
* 以允许所有中断级别高于0的请求
*/
asm(move.w #0x2000,SR);

图5 状态寄存器
下面的代码根据图5配置状态寄存器。在修改SR[I]前必须先将SR[S]置位。
/*
* 修改5213的中断级别为0
* 以允许所有中断级别高于0的请求
*/
asm(move.w #0x2000,SR);

图5 状态寄存器
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寄存器的相应位来清除中断事件。
为了将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寄存器的相应位来清除中断事件。
<<上一页 下一页>>


