预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

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 PSHDSmem;将Smem中的数据压入堆栈 PSHMMMR;将MMR中的数据压入堆栈 POPDSmem;将数据从栈顶弹至Smem中 POPMMMR;将数据从栈顶弹至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 ;加法运算 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 IR