dsp 中断向量表

  • 格式:doc
  • 大小:32.00 KB
  • 文档页数:5

中断向量表

单片机的程序一般情况下上电之后是从0x0地址开始运行的,而0x0后面是关于硬件的一些对应的中断的入口地址。所以中断向量表其实就是硬件查表跳转表,相当于C语言的switch语句。如:

Switch(i)

{

Case 0: goto reset;

Case 1: goto int0 ;

….

}关于I的值就是硬件给出的中断向量。

2406中断向量表:

.ref _bad_trap

.ref _c_int0

.sect "vectors" ;自定义段名

_vector: ;向量表地址标识

RSVECT B _c_int0 ;C项目初始化入口地址

INT1 B _bad_trap ;没有用到的中断跳转到非法中断陷阱

INT2 B _bad_trap

INT3 B _PM6 ;有用到的中断,则写其实际中断的地址或标号

INT4 B _bad_trap ; PM 8 Int level 4 7

INT5 B _bad_trap ; PM A Int level 5 8

INT6 B _bad_trap ; PM C Int level 6 9

…….

.end

PAGE 0 : /* program memory */

VECS: origin = 00000h, length = 0007Fh

vectors : > VECS PAGE = 0

这样就可以把中断向量表写到正确的地址。

.ref _bad_trap 这个标号外部没有定义,为什么还用.ref,而不是用..global?

因为_bad_trap在这里只是声明函数,它实际函数可能是.C文件里的bad_trap()函数。

CPU中断向量地址和外设中断向量PIV有什么不同?什么是外设中断向量PIV?

一个CPU中断包括好几个外设中断,如INT1包括了PDPINTA、PDPINTB、ADCINT、XINT1、XINT2、SPIINT、RXINT、TXINT、CANMBINT、CANERINT。其中任一一个外设发生中断请求并没有被蔽屏的话,都会进入INT1中断,然后再在INT1中断里判断是哪个外设发生了中断。

判断哪个外设发生中断有两种方式,一是查询各外设的中断标志位来判断是否发生了中断;另一种就是根据PIV的值查外设中断向量表跳转进相应的中断服务子程序。 中断的优先级是否固定不可变,还是说书中列出的是默认的优先级?

ADC、外部引脚、SPI、SCI、CAN邮箱、CAN错误有高低优先级选择,其它的优先级固定。

为什么同一个中断源里的中断还有不同的中断优先级?进的是同一个中断程序,不同优先级有什么作用?

这是为了同时发生中断时,决定CPU先响应哪个中断。

2008-2-27

前面的中断向量只是进入到CPU级中断跳转,可以对对应的中断标志位判断后再进对应的中断;其实硬件有个专门的外设中断PIV向量,从CPU级中断跳转进GSIR后,再根据外设中断PIV进相应中断。

用PIV中断向量来判断不同的外设中断时要两个中断向量表:

CPU中断向量表:0~40H地址的向量表,向量由硬件给出,跳转也由硬件完成。

外设中断向量表:可以存在程序区的任意区间,向量由PIV给出,跳转由程序计算后完成。

可以看出,CPU级中段主要是把中断分为不同的优先级,而PIV向量表主要是对应不同的外设的。

CPU级中断向量:

.sect "vectors"

_vector:

RSVECT B int0 ;复位

INT1 B GISR1 ;外部中断1通用服务子程序

INT2 B GISR2 ;外部中断2通用服务子程序

INT3 B GISR3 ;外部中断3通用服务子程序

INT4 B GISR4 ;外部中断4通用服务子程序

INT5 B GISR5 ;外部中断5通用服务子程序

INT6 B GISR6 ;外部中断6通用服务子程序

RESERVED B _bad_trap ;保留,分析中断用

SW_INT8 B _bad_trap ;软件中断8~16

SW_INT9 B _bad_trap ;

SW_INT10 B _bad_trap ;

SW_INT11 B _bad_trap ;

SW_INT12 B _bad_trap ;

SW_INT13 B _bad_trap ;

SW_INT14 B _bad_trap ;

SW_INT15 B _bad_trap ;

SW_INT16 B _bad_trap ;

TRAP B _bad_trap ;TRAP指令中断

NMI B _bad_trap ;不可屏蔽软中断

EMU_TRAP B _bad_trap ;用于仿真

SW_INT20 B _bad_trap ;软件中20~31 SW_INT21 B _bad_trap ;

SW_INT22 B _bad_trap ;

SW_INT23 B _bad_trap ;

SW_INT24 B _bad_trap ;

SW_INT25 B _bad_trap ;

SW_INT26 B _bad_trap ;

SW_INT27 B _bad_trap ;

SW_INT28 B _bad_trap ;

SW_INT29 B _bad_trap ;

SW_INT30 B _bad_trap ;

SW_INT31 B _bad_trap ;

外设中断向量表(按外设中断号建立):

.text

PVECTORS B PHANTOM ;假中断 PIV=0H

B XINT1_ISR ;外部中断0,PIV=1H

B PHANTOM

B PHANTOM

B ADCINT_ISR ;ADC中断,PIV=4H

B SPIINT_ISR ;SPI中断 ,PIV=5H

B RXINT_ISR ;SCI接收中断,PIV=6H

B TXINT_ISR ;SCI发送中断,PIV=7H

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B XINT2_ISR ;外部中断2,PIV=11H

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PDIINTB _ISR ; 功率驱动保护引脚中断,PIV=19H

B PHANTOM

B PHANTOM B PHANTOM

B PHANTOM

B PHANTOM

B PHANTOM

B PDPINTA_ISR ;功率驱动保护引脚中断,PIV=20H

B CMP1INT_ISR ;比较器1中断,PIV=21H

B CMP2INT_ISR ;比较器2中断,PIV=22H

B CMP3INT_ISR ;比较器3中断,PIV=23H

B CMP4INT_ISR ;比较器4中断,PIV=24H

B CMP5INT_ISR ;比较器5中断,PIV=25H

B CMP6INT_ISR ;比较器6中断,PIV=26H

B T1PINT_ISR ;定时器1周期中断,PIV=27H

B T1CINT_ISR ;定时器1比较中断,PIV=28H

B T1UFINT_ISR ;定时器1下溢中断,PIV=29H

B T1OFINT_ISR ;定时器1上溢中断,PIV=2AH

B T2PINT_ISR ;定时器2周期中断,PIV=2BH

B T2CINT_ISR ;定时器2比较中断,PIV=2CH

B T2UFINT_ISR ;定时器2下溢中断,PIV=2DH

B T2OFINT_ISR ;定时器2上溢中断,PIV=2EH

B T3PINT_ISR ;定时器3周期中断,PIV=2FH

B T3CINT_ISR ;定时器3比较中断,PIV=30H

B T3UFINT_ISR ;定时器3下溢中断,PIV=31H

B T3OFINT_ISR ;定时器3上溢中断,PIV=32H

B CAP1INT_ISR ;捕获1中断,PIV=33H

B CAP2INT_ISR ;捕获1中断,PIV=34H

B CAP3INT_ISR ;捕获1中断,PIV=35H

B CAP4INT_ISR ;捕获1中断,PIV=36H

B CAP5INT_ISR ;捕获1中断,PIV=37H

B CAP6INT_ISR ;捕获1中断,PIV=38H

B T4PINT_ISR ;定时器4周期中断,PIV=39H

B T4CINT_ISR ;定时器4比较中断,PIV=3AH

B T4UFINT_ISR ;定时器4下溢中断,PIV=3BH

B T4OFINT_ISR ;定时器4上溢中断,PIV=3CH

B PHANTOM

B PHANTOM

B PHANTOM

B CANMBINT_SIR ;CAN邮箱中断,PIV=40H

B CANERINT_SIR ;CA N错误中断,PIV=41H

.end