1 / 20

高速 DSP 原理、应用及实践

高速 DSP 原理、应用及实践. 自动化测试与控制研究所 许永辉 2011.3.2. Part2 :中断控制. 1. 中断概述. 中断是为使 CPU 具有对外界异步事件的处理能力而设置的。当这些事件发生时, DSP 应及时执行这些事件所要求的任务。 中断就是要求 CPU 暂停当前的工作,转而去处理这些事件,处理完以后,再回到原来被中断的地方继续原来的工作。这些中断源可以是片内的,如定时器等,也可以是片外的,如 A/D 转换及其他片外装置。 显然,一个中断服务包括保存当前处理现场,完成中断任务,恢复各寄存器和现场,然后返回继续执行被暂时中断的程序。. 2. 中断概述.

tamyra
Télécharger la présentation

高速 DSP 原理、应用及实践

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 高速DSP原理、应用及实践 自动化测试与控制研究所 许永辉 2011.3.2

  2. Part2:中断控制

  3. 1 中断概述 • 中断是为使CPU具有对外界异步事件的处理能力而设置的。当这些事件发生时,DSP应及时执行这些事件所要求的任务。 • 中断就是要求CPU暂停当前的工作,转而去处理这些事件,处理完以后,再回到原来被中断的地方继续原来的工作。这些中断源可以是片内的,如定时器等,也可以是片外的,如A/D转换及其他片外装置。 • 显然,一个中断服务包括保存当前处理现场,完成中断任务,恢复各寄存器和现场,然后返回继续执行被暂时中断的程序。

  4. 2 中断概述 • 中断管脚上一个跳变(上升沿/下降沿)将会在中断标志寄存器(IFR)置一个即将发生的中断状态。 • 如果这个中断被使能,则CPU开始处理这个中断,将当前程序流程转向中断服务程序。 • 当几个中断源同时向CPU请求中断时,CPU会根据中断源的优先级别,优先响应级别最高的中断请求。 • DM642有8个寄存器管理中断服务。

  5. 3 中断类型和中断信号 • 中断类型 • RESET:复位 • NMI:不可屏蔽中断 • INT4-15:可屏蔽中断 • 来源 • RESET:管脚信号 • NMI:管脚信号 • INT4-15:管脚信号或片内外设

  6. 4 复位(RESET) 复位是最高级别中断,它被用来停止CPU工作,并使之返回到一个已知状态。复位与其他类型中断在以下方面是不同的: • RESET是低电平有效信号,而其他的中断是在转向高电平的上升沿有效。 • 为了正确地重新初始化CPU,在RESET再次变成高电平之前必须保持10个时钟脉冲的低电平。 • 复位使所有正在进行的指令执行都被打断,所有的寄存器返回到它们的默认状态。 • 复位中断服务取指包必须放在地址为0的内存中。 • 复位不受转移指令的影响。

  7. 5 不可屏蔽中断(NMI) • NMI优先级别为2,它通常用来向CPU发出严重硬件问题的警报,如电源故障等。为实现不可屏蔽中断处理,在中断使能寄存器中的不可屏蔽中断使能位(NMIE)必须置1。如果NMIE置l,阻止NMI处理的惟一可能是不可屏蔽中断发生在转移指令的延迟间隙内。 • NMIE在复位时被清零以防止复位被打断。当一个NMI发生时,NMIE也被清零,这样就阻止了另一个NMI的处理。NMIE不可人为地清0,但可以用程序置位,使嵌套NMI能够运行。在NMIE为0时,所有可屏蔽中断(INT4-INTl5)也都被禁止。

  8. 6 可屏蔽中断(INT4-INT15) 2.3 1、DM642的CPU有12个可屏蔽中断,它们被连接到芯片外部或片内外设,也可由软件控制或者不用。 2、中断发生时将中断标志寄存器(IFR)的相应位置1。 3、假设一个可屏蔽中断不发生在转移指令的延迟间隙内,它还须满足下列条件才能得到响应,受到处理。 • 控制状态寄存器(CSR)中的全局中断使能位(GIE)置l。 • 中断使能寄存器(IER)中的NMIE位置1。 • IER中的相应中断使能位置l。 • 在IFR中没有更高优先级别的中断标志(IF)位为1。

  9. 7 中断控制寄存器

  10. 8 控制状态寄存器(CSR) • CSR包含控制和状态位,其中2位GIE和PGIE用于控制中断。全局中断使能位(GIE,Global Interrupt Enable)是CSR的bit0,控制GIE的值可以使能或禁止所有的可屏蔽中断。 • CSR的bitl是PGIE,PGIE保存先前的GIE值,即在响应可屏蔽中断时,保存GIE的值,而GIE被清0。这样在处理一个可屏蔽中断期间,就防止了另外一个可屏蔽中断的发生。

  11. 9 中断使能寄存器(IER) • IER控制每一个中断源是否使能。通过IER中相应某个中断位置l或者清0可以使能或禁止某个中断。 • IER的bit 0对应于复位,该位只可读(值为1)不可写,由于bit 0总为l,所以复位总被使能。 • bitIE4-IEl5写1或写0分别使能或禁止相关中断。 • NMIE=0时,禁止所有非复位中断;NMIE=l时,GIE和相应的IER位一起控制INTl5-INT4中断使能。对NMIE写0无效,只有复位或NMI发生时它才清0。

  12. 10 中断标志寄存器(IFR) • 中断标志寄存器(IFR)包括INT4~INTl5和NMI的状态。 • 当一个中断发生时,IFR中的相应位被置1,否则为0。 • 读取IFR,可检查中断状态。 • 如上图所示, IFR的高16位与IER一样,为保留位。

  13. 11 中断设置/清除寄存器(ISR/ICR) • ISR和ICR可以用程序设置和清除IFR中的可屏蔽中断位 • 对ISR的IS4-ISl5位写1会引起IFR对应中断标志位置1 • 对ICR的IC4-ICl5位写1会引起IFR对应标志位置0 • 对ISR和ICR的任何位写0无效,设置和清除ISR和ICR的任何位都不影响NMI和复位。 • 从硬件来的中断有优先权,它废弃任何对ICR的写入。当同时对ICR和ISR的同一位写入时,对ISR写入优先。

  14. 12 中断选择器和外部中断 • DM642的DSP内核支持16个优先级别的中断 • INT0是不可屏蔽中断,被DSP的复位中断源占用,不能通过软件使能或禁止,优先级别最高。INT1被NMI中断占用,INT2和INT3保留未用。 • DM642中断源多于16个,12个可屏蔽中断(INT_4-INT_15)的中断源可以通过修改中断选择控制寄存器MUX和HMUXL来进行编程。INT_15优先级别最低。

  15. 13 DM642可用的中断源

  16. 14 中断选择器 • DM642有22个外设中断源(C6000最多有32个),CPU只提供12个可用中断 • 中断多路复用寄存器决定了DM642中断源与CPU从4到15中断(INT4-INT15)的映射关系。外部中断极性寄存器设置了外部中断的极性。

  17. 15 外部中断极性寄存器(EXPOL) 外部中断极性寄存器,如图3-11所示,允许用户改变4个外部中断(EXT_INT4-7)的极性 XIP值为0时,一个从低到高的上升沿触发一个中断 XIP值为1时,一个从高到低的下降沿触发一个中断 XIP的默认值是0

  18. 16 中断选择寄存器 • MUX中的INTSEL域,允许映射中断源为特定的中断。 INTSEL4-15对应CPU中断INT4-INT15 • 通过设定INTSEL域为所期望的中断选择号,如表3-3所示可以映射任何中断源到任何CPU中断

  19. 17 C语言中断服务程序 • Interrupt关键字 • 必须用interrupt声明中断函数 • 中断函数入口和返回值必须是void类型 • 库函数dev6x.lib • dev6x.lib实现了中断向量段.vec 无需再编写vectors.asm • 使用dev6x.lib步骤 • 将dev6x.lib加到工程中 • 在.cmd文件中把.vec 段配置到0地址 • 在主程序中包含头文件intr.h • 在主程序main函数中调用intr.reset函数 • 调用intr_hook等函数

  20. 18 中断服务程序例子 #include "intr.h“ interrupt void example(); void main() { *(int*)extpol=0x00000000; //设置外部中断极性是上升沿 intr_reset(); //初始化中断向量表 intr_hook(example,CPU_INT4); //“挂中断” INTR_ENABLE(CPU_INT4); //使能CPU_INT4. INTR_ENABLE(NMIE); //使能不可屏蔽中断 INTR_GLOBAL_ENABLE(); //使能全局中断 … } Interrupt void example() { … }

More Related