DSP中断子程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP 作业:中断系统的应用
中断源扩展方法:
有八个中断源,分别表示为IR1,IR2,…,IR8,各个中断源均为边沿触发方式,C5402建立相应的中断系统。构建硬件中断系统如图,每两个一组相“与”后,分别既然如此4个外部中断接口INT0、INT1、INT2、INT3。没组分别将两条线接于HPI 端口,此时,HPI 端口作为I/O 口使用。
ST0:状态寄存器0,地址6
ST1:状态寄存器1,地址7
BH:累加器B 的高价位,地址C
BL :累加器B 的低阶位,地址B
BG :累加器B 的保护位,地址D
PSHD Smem ;将Smem 中的数据压入堆栈
PSHM MMR ;将MMR 中的数据压入堆栈
POPD Smem ;将数据从栈顶弹至Smem 中
POPM MMR ;将数据从栈顶弹至MMR 中
;外部中断INT0中断服务子程序:
INT0ISR:
PSHM ST0 ;保存寄存器,将寄存器的值压入堆栈
PSHM ST1 ;保存寄存器,将寄存器的值压入堆栈
PSHM BG ;将地址D 压入堆栈,之后类似
PSHM BH
PSHM BL
PORTR HPIPORT, *(hpi_var ) ;从HPI 口读数据并存储到*(hpi_var )所在的地址 STL *(hpi_var ), B ;将*(hpi_var )的低十六位放到B 中
AND #01B, B ;加法运算
IR1IR2
IR3
IR4
IR5IR6
IR7
IR8
BC IR2,ANEQ ;首先判别是否是IR1,是,则执行服务程序
;否,则跳至对IR2的判断
;扩展中断IR0的服务程序主体
IR2:
STL *(hpi_var),B
AND #010B,B
BC INT0END,ANEQ ;首先判别是否是IR1,是,则执行服务程序
;否,则跳至结束
;扩展中断IR1的服务程序主体
INT0ED:
POPM BL ;将数据从栈顶弹至BL中
POPM BH ;将数据从栈顶弹至BH中,以下类似
POPM BG
POPM ST1
POPM ST0
RETE
;外部中断INT1中断服务子程序:
INT1ISR:
PSHM ST0 ;保存寄存器
PSHM ST1
PSHM BG
PSHM BH
PSHM BL
PORTR HPIPORT,*(hpi_var) ;读HPI口
STL *(hpi_var), B
AND #0100B, B
BC IR4,ANEQ ;首先判别是否是IR3,是,则执行服务程序
;否,则跳至对IR4的判断
;扩展中断IR3服务程序主体
IR4:
STL *(hpi_var), B
AND #01000B, B
BC INT0END,ANEQ ;首先判别是否是IR4,是,则执行服务程序
;否,则跳至结束;
下面代码跟上面雷同,不一一赘述,中断有响应时间,对扩展的中断源来说,实际中断响应时间要算引导程序的时间,过多的中断源,堆栈深度增加,是压栈、弹栈操作频繁,堆栈大小应慎重考虑,不然出现程序混乱错误,若以后要在dsp上发展再深入考虑中断与堆栈的关系。
;扩展中断IR4的服务程序主体
INT1ED:
POPM BL
POPM BH
POPM BG
POPM ST1
POPM ST0
RETE
;外部中断INT2中断服务子程序:
INT2ISR:
PSHM ST0 ;保存寄存器
PSHM ST1
PSHM BG
PSHM BH
PSHM BL
PORTR HPIPORT,*(hpi_var) ;读HPI口
STL *(hpi_var),B
AND #010000B,B
BC IR6,ANEQ ;首先判别是否是IR5,是,则执行服务程序
;否,则跳至对IR6的判断
;扩展中断IR5的服务程序主体
IR6:
STL *(hpi_var),B
AND #01000B,B
BC INT2END,ANEQ ;首先判别是否是IR6,是,则执行服务程序
;否,则跳至结束
;扩展中断IR6的服务程序主体
INT2ED:
POPM BL
POPM BH
POPM BG
POPM ST1
POPM ST0
RETE
;外部中断INT3中断服务子程序:
INT3ISR:
PSHM ST0 ;保存寄存器
PSHM ST1
PSHM BG
PSHM BH
PSHM BL
PORTR HPIPORT,*(hpi_var) ;读HPI口
STL *(hpi_var),B
AND #010000B,B
BC IR8,ANEQ ;首先判别是否是IR7,是,则执行服务程序
;否,则跳至对IR8的判断
;扩展中断IR7的服务程序主体
IR8:
STL *(hpi_var),B
AND #01000B,B
BC INT3END,ANEQ ;首先判别是否是IR8,是,则执行服务程序
;否,则跳至结束
;扩展中断IR8的服务程序主体
INT3ED:
POPM BL
POPM BH
POPM BG
POPM ST1
POPM ST0
RETE
由INT0、INT1、INT2、INT3的中断优先级顺序可知,前面的中断扩展出来的中断源高于后面的。又由于软件中先查询的比后查询的有更高的优先级,可以得知扩展后的8个终端的优先级顺序由高至低一次为IR1、IR2、IR3、IR4、IR5、IR6、IR7、IR8。