您的当前位置:首页正文

dsp 中断向量表

2023-05-23 来源:我们爱旅游
中断向量表

单片机的程序一般情况下上电之后是从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

; ; ; ; ; ; ; ; ; ; ;

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

PVECTORS

.text

B B B B B B B B B B B B B B B B B B B B B B B B B B B B

PHANTOM XINT1_ISR PHANTOM PHANTOM ADCINT_ISR SPIINT_ISR RXINT_ISR TXINT_ISR PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM XINT2_ISR PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM PHANTOM PDIINTB _ISR PHANTOM PHANTOM

;假中断 PIV=0H

;外部中断0,PIV=1H

;ADC中断,PIV=4H ;SPI中断 ,PIV=5H

;SCI接收中断,PIV=6H ;SCI发送中断,PIV=7H

;外部中断2,PIV=11H

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

B B B B PHANTOM PHANTOM PHANTOM PHANTOM B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B

B

.end PDPINTA_ISR ;功率驱动保护引脚中断,PIV=20H CMP1INT_ISR ;比较器1中断,PIV=21H CMP2INT_ISR ;比较器2中断,PIV=22H CMP3INT_ISR ;比较器3中断,PIV=23H CMP4INT_ISR ;比较器4中断,PIV=24H CMP5INT_ISR ;比较器5中断,PIV=25H CMP6INT_ISR ;比较器6中断,PIV=26H T1PINT_ISR ;定时器1周期中断,PIV=27H T1CINT_ISR ;定时器1比较中断,PIV=28H T1UFINT_ISR ;定时器1下溢中断,PIV=29H T1OFINT_ISR ;定时器1上溢中断,PIV=2AH T2PINT_ISR ;定时器2周期中断,PIV=2BH T2CINT_ISR ;定时器2比较中断,PIV=2CH T2UFINT_ISR ;定时器2下溢中断,PIV=2DH T2OFINT_ISR ;定时器2上溢中断,PIV=2EH T3PINT_ISR ;定时器3周期中断,PIV=2FH T3CINT_ISR ;定时器3比较中断,PIV=30H T3UFINT_ISR ;定时器3下溢中断,PIV=31H T3OFINT_ISR ;定时器3上溢中断,PIV=32H CAP1INT_ISR ;捕获1中断,PIV=33H CAP2INT_ISR ;捕获1中断,PIV=34H CAP3INT_ISR ;捕获1中断,PIV=35H CAP4INT_ISR ;捕获1中断,PIV=36H CAP5INT_ISR ;捕获1中断,PIV=37H CAP6INT_ISR ;捕获1中断,PIV=38H

T4PINT_ISR ;定时器4周期中断,PIV=39H T4CINT_ISR ;定时器4比较中断,PIV=3AH T4UFINT_ISR ;定时器4下溢中断,PIV=3BH T4OFINT_ISR ;定时器4上溢中断,PIV=3CH

PHANTOM PHANTOM PHANTOM

CANMBINT_SIR ;CAN邮箱中断,PIV=40H CANERINT_SIR ;CA N错误中断,PIV=41H

_bad_trap与PANTOM都只是假中断,只是为了保证系统按照可控方式进行处理。可以写成: _bad_trap PANTOM KICK_DOG ;喂狗宏

RET

如果中断的现场保护是在CPU级中断中执行,而现场恢复在外设中断中,那么CPU级假中断_bad_trap和外设级假中断 PANTOM将不一样。 _bad_trap可以直接返回,而PANTOM则需要现场恢复,因为在进外设级中断前先进了CPU级中断,现场已经在那时被保存了。

以上这种情况在一般情况下是不会发生的,但有时候CPU在刚开始执行初始化程序时会进已经蔽屏的中断,这时就会出现上述问题。 原因未知。

外部中断通用服务子程序:

GISR:

….

LDP LACC

;现场保护 #PIVR>>7

PIVR,1 ;一条跳转指令占两字程序空间,所以跳转表实际地址为

;(PIVR)×2+# PVECTORS

# PVECTORS ;PIVR中断向量号*2+PIV中断向量表起始地址 ;跳转到SISR

ADD

BACC

可以把6个外设中断通用服务子程序用同一个子程序来处理。如GISR~GISR6都写成GISR。

因篇幅问题不能全部显示,请点此查看更多更全内容