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