dsPIC30F/33F程序员参考手册 图2-1: 编程模型图 WO/WREG P0SH.8指令使用的影子寄存器 DV和MUL W1 结果寄存器 W2 D0指令使用的影子寄存器 W3 图注 W4 MAC操作数 W5 寄存器 W6 W7 工作寄存器 W8 W9 MAC地址 寄存器 W10 W11 W12IMAC偏移量 W13/MAC写返回 W14/帧指针 W15*/堆栈指针 *W15&SPLIM没有影子寄存器 SPLIM* 堆栈指针限制寄存器 39 31 15 0 DSP ACCA 累加器 ACCB 22 0 程序计数器 0 TBLPAG 数据表页地址 > 0 PSVPAG 程序空间可视性页地址 15 0 RCOUNT REPEAT循环计数器 15 0 DCOUNT DO循环计数器 22 DOSTART DO循环起始地址 22 0 DOEND DO循环结束地址 15 CORCON CPU内核控制寄存器 OA OB SA SB OAB SAB DA DC IPL2IPL1IPLO RA STATUS寄存器 SRH SRL DS70157BCN第2-4页 初稿 2006 Microchip Technology Inc
dsPIC30F/33F 程序员参考手册 DS70157B_CN 第 2-4 页 初稿 2006 Microchip Technology Inc. 图 2-1: 编程模型图 TABPAG 22 0 7 0 15 0 程序计数器 数据表页地址 STATUS 寄存器 工作寄存器 MAC 操作数 寄存器 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12/MAC 偏移量 W13/MAC 写返回 W14/ 帧指针 W15*/ 堆栈指针 MAC 地址 寄存器 39 31 0 ACCA ACCB PSVPAG 7 0 程序空间可视性页地址 OA OB SA SB Z RCOUNT 15 0 REPEAT 循环计数器 DCOUNT 15 0 DO 循环计数器 DOSTART 22 0 DO 循环起始地址 IPL2 IPL1 SPLIM* 堆栈指针限制寄存器 15 SRL * W15 & SPLIM 没有影子寄存器 OAB SAB 15 0 CPU 内核控制寄存器 图注 CORCON DA DC RA N C TBLPAG PSVPAG IPL0 OV W0 / WREG SRH DOEND DO 循环结束地址 22 0 DIV 和 MUL 结果寄存器 PUSH.S 指令使用的影子寄存器 DO 指令使用的影子寄存器 累加器 DSP
第2章编程模型 2.2.4 软件堆栈指针 W15专用作软件堆栈指针,将会被函数调用、异常处理以及返回指令自动修改。然而,W15可 像所有其他W寄存器一样被任何指令引用。这将简化对堆栈指针的读、写和控制操作。有关堆栈 指针的详细信息,可参阅第4.7.1节“软件堆栈指针”。 2.2.5 堆栈指针限制寄存器(SPLIM) SPLM是与堆栈指针有关的16位寄存器,用来防止堆栈指针上溢以及对超出用户分配堆栈存储 区的存储空间进行访问。有关SPLIM的详细信息,可参阅第4.7.5节“堆栈指针上滥”。 2.2.6 累加器A和累加器B 累加器A(ACCA)和累加器B(ACCB)皆为40位宽的寄存器。DSP类指令通过累加器执行 数学和移位操作。每个累加器都是由3个存储区映射的寄存器构成: ·ACCxU(bit39-32) ·ACCxH(bit31-16) ·ACCxL(bit15-0) 有关ACCA和ACCB使用的详细内容,可参阅第4.12节“累加器的使用”。 2.2.7 程序计数器 程序计数器(PC)为23位宽。通过PC<22:1>对4M×24位用户程序存储空间中的指令进行寻 址,其中PC<0>总是设定为0,以保持指令字对齐并提供与数据存储空间寻址的兼容性。这表明 在正常的指令执行过程中,PC值将以2为步长进行递增。 位于0x80000000及其以上地址的程序存储区用于存放器件配置数据、单元D以及器件D。,该 存储区域不能用来执行用户代码且PC也不能访问这个区域。然而,用户可通过使用表指令对这 个区域进行访问。有关访问配置数据、单元D和器件ID的详细内容,可参阅dsP/C30F系列 参考手册》(DS70046D_CN)。 2.2.8 TBLPAG寄存器 TBLPAG寄存器用来在表读和表写操作期间存放程序存储地址的高8位。表指令用来在程序存储 空间和数据存储空间之间传送数据。有关使用表指令访问程序存储区的详细内容,可参阅 dsP1C30F系列参考手册》(DS70046DCN)。 2.2.9 PSVPAG寄存器 程序空间可视性功能允许用户将32KB的程序存储空间映射到高32KB的数据地址空间。该功能 允许通过对数据存储区进行操作的指令透明访问常量数据。PSVPAG寄存器用于选择映射到数 据地址空间的32KB程序存储空间。有关程序空间可视性功能的具体内容,可参阅《sP1C30F 系列参考手册》(DS70046DCN). 2006 Microchip Technology Inc. 初稿 DS70157BCN第2-5页
2006 Microchip Technology Inc. 初稿 DS70157B_CN 第 2-5 页 第 2 章 编程模型 编程模型 2 2.2.4 软件堆栈指针 W15 专用作软件堆栈指针,将会被函数调用、异常处理以及返回指令自动修改。然而, W15 可 像所有其他 W 寄存器一样被任何指令引用。这将简化对堆栈指针的读、写和控制操作。有关堆栈 指针的详细信息,可参阅第 4.7.1 节 “软件堆栈指针”。 2.2.5 堆栈指针限制寄存器 (SPLIM) SPLIM 是与堆栈指针有关的 16 位寄存器,用来防止堆栈指针上溢以及对超出用户分配堆栈存储 区的存储空间进行访问。有关 SPLIM 的详细信息,可参阅第 4.7.5 节 “堆栈指针上溢”。 2.2.6 累加器 A 和累加器 B 累加器 A(ACCA)和累加器 B (ACCB)皆为 40 位宽的寄存器。DSP 类指令通过累加器执行 数学和移位操作。每个累加器都是由 3 个存储区映射的寄存器构成: • ACCxU (bit 39 - 32) • ACCxH (bit 31 - 16) • ACCxL (bit 15 - 0) 有关 ACCA 和 ACCB 使用的详细内容,可参阅第 4.12 节 “累加器的使用”。 2.2.7 程序计数器 程序计数器(PC)为 23 位宽。通过 PC<22:1> 对 4M x 24 位用户程序存储空间中的指令进行寻 址,其中 PC<0> 总是设定为 0,以保持指令字对齐并提供与数据存储空间寻址的兼容性。这表明 在正常的指令执行过程中, PC 值将以 2 为步长进行递增。 位于 0x80000000 及其以上地址的程序存储区用于存放器件配置数据、单元 ID 以及器件 ID。该 存储区域不能用来执行用户代码且 PC 也不能访问这个区域。然而,用户可通过使用表指令对这 个区域进行访问。有关访问配置数据、单元 ID 和器件 ID 的详细内容,可参阅 《dsPIC30F 系列 参考手册》(DS70046D_CN)。 2.2.8 TBLPAG 寄存器 TBLPAG 寄存器用来在表读和表写操作期间存放程序存储地址的高 8 位。表指令用来在程序存储 空间和数据存储空间之间传送数据。有关使用表指令访问程序存储区的详细内容,可参阅 《dsPIC30F 系列参考手册》(DS70046D_CN)。 2.2.9 PSVPAG 寄存器 程序空间可视性功能允许用户将 32 KB 的程序存储空间映射到高 32 KB 的数据地址空间。该功能 允许通过对数据存储区进行操作的指令透明访问常量数据。 PSVPAG 寄存器用于选择映射到数 据地址空间的 32 KB 程序存储空间。有关程序空间可视性功能的具体内容,可参阅 《dsPIC30F 系列参考手册》(DS70046D_CN)
dsPIC30F/33F程序员参考手册 2.2.10 RCOUNT寄存器 14位RCOUNT寄存器包含用于REPEAT指令的循环计数器。当执行REPEAT指令时,RCOUNT 将装载指令重复执行的次数,如“REPEAT#1it14”指令中的“Iit14”或“REPEAT Wn”指 令中M寄存器中的内容。REPEAT循环将被执行RCOUNT+1次。 :1:如果REPEAT循环执行过程被中断,则当再次进入前台代码时中断服务程序可将 RCOUNT清零以退出REPEAT循环。 2:有关REPEAT循环的详细内容,可参阅dsP1C30F系列参考手册)(DS70046D_CN)。 2.2.11 DCOUNT寄存器 14位DCOUNT寄存器包含用于硬件DO循环的循环计数器。当执行Do指令时,DCOUNT将装 载指令的循环计数值,如“D0#1it14,Expr”指令中的“1it14”或“D0Ns,Expr”指令中 Ws寄存器的低14位。DO循环将执行DCOUNT+1次。 注 1:DCOUNT包含一个影子寄存器。有关影子寄存器的信息,可参阅第2.2.16节“影 子寄存器”。 2:有关D0循环的详细内容,可参阅dsP1C30F系列参考手册)(DS70046D_CN)。 2.2.12 DOSTART寄存器 DOSTART寄存器包含硬件DO循环的起始地址。当执行Do指令时,DOSTART将装载紧接DO 指令的下一条指令的地址。该存储地址为DO循环的起始地址。当循环激活时,程序将在DO循 环的最后一条指令执行之后继续执行DOSTART地址中存储的指令。这种机制可实现零开销循 环。 注 1:DOSTART具有一个影子寄存器。有关影子寄存器的信息,可参阅第2.2.16节“影 子寄存器”。 2:有关D0循环的详细内容,可参阅《dsP1C30F系列参考手册)(DS70046D_CN)。 2.2.13 DOEND寄存器 DOEND寄存器包含硬件DO循环的终止地址。当执行DO指令时,DOEND将装载DO指令中的 表达式所指定的地址。该存储地址指定DO循环中的最后一条指令。当循环激活且DOEND地址 中存储的指令被执行后,程序将继续从DO循环起始地址(存储在DOSTART寄存器中)开始执 行。 注1:DOEND具有一个影子寄存器。有关影子寄存器的信息,可参阅第2.2.16节“影子 寄存器” 2:有关DO循环的详细内容,可参阅dsP1C30F系列参考手册)》(DS70046DCN)。 DS70157B_CN第2-6页 初稿 2006 Microchip Technology Inc
dsPIC30F/33F 程序员参考手册 DS70157B_CN 第 2-6 页 初稿 2006 Microchip Technology Inc. 2.2.10 RCOUNT 寄存器 14 位 RCOUNT 寄存器包含用于 REPEAT 指令的循环计数器。当执行 REPEAT 指令时,RCOUNT 将装载指令重复执行的次数,如 “REPEAT #lit14”指令中的 “lit14”或 “REPEAT Wn”指 令中 Wn 寄存器中的内容。 REPEAT 循环将被执行 RCOUNT + 1 次。 2.2.11 DCOUNT 寄存器 14 位 DCOUNT 寄存器包含用于硬件 DO 循环的循环计数器。当执行 DO 指令时,DCOUNT 将装 载指令的循环计数值,如 “DO #lit14,Expr”指令中的 “lit14”或 “DO Ws,Expr”指令中 Ws 寄存器的低 14 位。 DO 循环将执行 DCOUNT + 1 次。 2.2.12 DOSTART 寄存器 DOSTART 寄存器包含硬件 DO 循环的起始地址。当执行 DO 指令时,DOSTART 将装载紧接 DO 指令的下一条指令的地址。该存储地址为 DO 循环的起始地址。当循环激活时,程序将在 DO 循 环的最后一条指令执行之后继续执行 DOSTART 地址中存储的指令。这种机制可实现零开销循 环。 2.2.13 DOEND 寄存器 DOEND 寄存器包含硬件 DO 循环的终止地址。当执行 DO 指令时,DOEND 将装载 DO 指令中的 表达式所指定的地址。该存储地址指定 DO 循环中的最后一条指令。当循环激活且 DOEND 地址 中存储的指令被执行后,程序将继续从 DO 循环起始地址(存储在 DOSTART 寄存器中)开始执 行。 注 1:如果 REPEAT 循环执行过程被中断,则当再次进入前台代码时中断服务程序可将 RCOUNT 清零以退出 REPEAT 循环。 2:有关REPEAT循环的详细内容,可参阅《dsPIC30F系列参考手册》(DS70046D_CN)。 注 1:DCOUNT 包含一个影子寄存器。有关影子寄存器的信息,可参阅第 2.2.16 节 “影 子寄存器”。 2:有关 DO 循环的详细内容,可参阅《dsPIC30F 系列参考手册》(DS70046D_CN)。 注 1:DOSTART 具有一个影子寄存器。有关影子寄存器的信息,可参阅第 2.2.16 节“影 子寄存器”。 2:有关 DO 循环的详细内容,可参阅《dsPIC30F 系列参考手册》(DS70046D_CN)。 注 1:DOEND 具有一个影子寄存器。有关影子寄存器的信息,可参阅第 2.2.16 节“影子 寄存器”。 2:有关 DO 循环的详细内容,可参阅《dsPIC30F 系列参考手册》(DS70046D_CN)
第2章编程模型 2.2.14 STATUS寄存器 如寄存器2-1所示,16位STATUS寄存器用于保存最近执行指令的状态信息。其中操作状态位 用于MCU操作、循环操作以及DSP操作。此外,STATUS寄存器还包含用于中断处理的CPU 中断优先级位IPL<20>。 2.2.14.1 MCU ALU状态位 指令集中的大多数指令都会影响或使用MCU操作状态位。大多数逻辑、数学、循环/移位和位 操作指令都将在执行后修改MCU状态位。条件转移指令使用各状态位的状态来确定程序执行流。 第4.8节“条件转移指令”列出了所有条件转移指令。 进位、全零、溢出、负和半进位(C、Z、OV、N和DC)位用来指示MCU ALU的当前状态。 这些状态位的状态分别表明指令执行结果是否导致进位、全零、溢出、负的结果或半进位等事件。 2 当执行减法操作时,C标志位用作借位标志。 作为一个特殊的零状态位,Z状态位可用于扩展精度的算术运算。除使用进位或借位输入的指令 (ADDC、CPB、SUBB和SUBBR)外,所有指令都使用状态位Z作为普通Z标志。有关Z状态 位的使用,可参阅第4.9节“Z状态位”。 注1:在执行PUSH.s指令时,所有MCU位都将被保存到影子寄存器中。在执行POP.s 指令时,它们将恢复原先的内容。 2:在异常处理过程中,除DC标志(不在SRL中)外的所有MCU位都将被压入堆栈 (见第4.7.1节“软件堆找指针”)。 2.2.14.2 循环状态位 DO激活和REPEAT激活(DA和RA)状态位用来指明循环是否处于激活状态。DO指令将对 DA标志产生影响以表明DO循环处于激活状态。当执行DO循环中的第一条指令时,DA标志位 将被置1。当循环中的最后一条指令执行完时,DA标志位将被清零。同样,RA标志表明REPEAT 指令是否正在执行,而且只有RE卫EAT指令才会对该标志位的状态产生影响。当被重复的指令开 始执行时,RA标志位将被置1。当被重复的指令完成最后一次执行时,该标志位将被清零。 DA标志为只读位。这表明不能通过写1到DA来启动循环,也不能通过清零DA来终止循环。如 果必须提前终止DO循环,应使用EDT位(CORCON<11>)。 由于RA标志也是只读位,因此也不能对该位直接清零。然而,如果REPEAT或其目标指令被中 断,中断服务程序可对位于堆栈中SRL的RA标志位清零。该操作将在程序执行从中断服务程序 返回时禁止循环操作,因为此时恢复的RA将为O。 2006 Microchip Technology Inc. 初稿 DS70157BCN第2-7页
2006 Microchip Technology Inc. 初稿 DS70157B_CN 第 2-7 页 第 2 章 编程模型 编程模型 2 2.2.14 STATUS 寄存器 如寄存器 2-1 所示, 16 位 STATUS 寄存器用于保存最近执行指令的状态信息。其中操作状态位 用于 MCU 操作、循环操作以及 DSP 操作。此外, STATUS 寄存器还包含用于中断处理的 CPU 中断优先级位 IPL<2:0>。 2.2.14.1 MCU ALU 状态位 指令集中的大多数指令都会影响或使用 MCU 操作状态位。大多数逻辑、数学、循环 / 移位和位 操作指令都将在执行后修改MCU状态位。条件转移指令使用各状态位的状态来确定程序执行流。 第 4.8 节 “条件转移指令”列出了所有条件转移指令。 进位、全零、溢出、负和半进位 (C、 Z、 OV、 N 和 DC)位用来指示 MCU ALU 的当前状态。 这些状态位的状态分别表明指令执行结果是否导致进位、全零、溢出、负的结果或半进位等事件。 当执行减法操作时, C 标志位用作借位标志。 作为一个特殊的零状态位, Z 状态位可用于扩展精度的算术运算。除使用进位或借位输入的指令 (ADDC、 CPB、 SUBB 和 SUBBR)外,所有指令都使用状态位 Z 作为普通 Z 标志 。有关 Z 状态 位的使用,可参阅第 4.9 节 “Z 状态位”。 2.2.14.2 循环状态位 DO 激活和 REPEAT 激活 (DA 和 RA)状态位用来指明循环是否处于激活状态 。DO 指令将对 DA 标志产生影响以表明 DO 循环处于激活状态。当执行 DO 循环中的第一条指令时,DA 标志位 将被置 1。当循环中的最后一条指令执行完时,DA 标志位将被清零。同样,RA 标志表明 REPEAT 指令是否正在执行,而且只有 REPEAT 指令才会对该标志位的状态产生影响。当被重复的指令开 始执行时, RA 标志位将被置 1。当被重复的指令完成最后一次执行时,该标志位将被清零。 DA 标志为只读位。这表明不能通过写 1 到 DA 来启动循环,也不能通过清零 DA 来终止循环。如 果必须提前终止 DO 循环,应使用 EDT 位 (CORCON<11>)。 由于 RA 标志也是只读位,因此也不能对该位直接清零。然而,如果 REPEAT 或其目标指令被中 断,中断服务程序可对位于堆栈中 SRL 的 RA 标志位清零。该操作将在程序执行从中断服务程序 返回时禁止循环操作,因为此时恢复的 RA 将为 0。 注 1:在执行 PUSH.S 指令时,所有 MCU 位都将被保存到影子寄存器中。在执行 POP.S 指令时,它们将恢复原先的内容。 2:在异常处理过程中,除 DC 标志(不在 SRL 中)外的所有 MCU 位都将被压入堆栈 (见第 4.7.1 节 “软件堆栈指针”)
dsPIC30F/33F程序员参考手册 2.2.14.3 DSP ALU状态位 DSP类指令使用STATUS寄存器的高位字节(SRH),当数据经过其中一个加法器时,SRH中 内容将被修改。SRH为两个累加器均提供了溢出和饱和状态信息。饱和A、饱和B、溢出A和溢 出B(SA、SB、OA和OB)状态位提供了单独的累加器状态。而饱和AB和溢出AB(SAB和 OAB)状态位提供了联合的累加器状态。SAB和OAB状态位使得软件开发人员可高效地检查寄 存器是否出现饱和或溢出状况。 OA和OB状态位用来指示一个操作是否产生溢出至相应累加器的警戒位(bt32-39)。只有当 处理器处于超饱和模式或饱和模式被禁止时,这种情况才会发生。这表明用累加器的低31位无 法表示操作产生的数值。 SA和SB状态位用来指示一个操作是否从相应累加器的最高位产生溢出。无论何种饱和模式(禁 止、常规或超饱和),SA位和SB位都处于“粘住”状态。即当SA或SB置1时,该位只能由 软件手动清零,而与后续的DSP操作无关。在需要时,我们建议使用BC工R指令对这些位进行清 多。 为简便起见,OA和OB状态位通过逻辑或形成OAB标志,而将SA和SB状态位通过逻辑或形 成SAB标志。当实现用到两个累加器的算法时,通过这些累加器状态位可实现高效的溢出和饱和 检查。在进行算术运算溢出检查时,只需查询OAB即可完成,而不再需要单独查询OA和OB状 态位。同样,当进行饱和检查时,可只检查SAB而不是所有SA和SB状态位。注意,清零SAB 标志将同时对SA和SB位进行清零。 2.2.14.4 中断优先级状态位 SRL中的三个中断优先级(IPL)位SR<7:5>以及IPL3位CORCON<3>对用于异常处理的CPU PL进行设定。异常包括中断和硬件陷阱。中断具有的优先级为0至7,可由用户进行定义,而 硬件陷阱的优先级是固定的,为8至15。第4中断优先级位PL3为一个特殊的PL位,只可由 用户对其进行读或清零。该位只在硬件陷阱激活时才被置1,在陷阱处理后被清零。 CPU的IPL用来标识可中断处理器的最低优先级的异常。当等待处理的异常具有比CPU IPL更 高的中断优先级时,CPU才会对其进行处理。这表明,如果PL为0,所有优先级为1或更高的 异常都可中断处理器。如果PL为7,只有硬件陷阱才可中断处理器。 当正在处理一个异常时,PL将自动设定为该异常的优先级,这将禁止所有同等或更低优先级的 异常。当然而,由于PL字段为可读/写,用户可在中断服务程序中修改PL的低三位值以控制 何种异常具有优先处理权。由于在异常处理过程中SRL将被压入堆栈,因此在异常处理之后原先 的PL将被恢复。如果需要,用户也可通过设置NSTDIS位NTCON1<15>来避免异常嵌套。 注: 有关异常处理的全部信息可参阅《dsP1C30F系列参考手册)(DS70046D_CN)。 DS70157BCN第2-8页 初稿 2006 Microchip Technology Inc
dsPIC30F/33F 程序员参考手册 DS70157B_CN 第 2-8 页 初稿 2006 Microchip Technology Inc. 2.2.14.3 DSP ALU 状态位 DSP 类指令使用 STATUS 寄存器的高位字节(SRH),当数据经过其中一个加法器时,SRH 中 内容将被修改。SRH 为两个累加器均提供了溢出和饱和状态信息。饱和 A、饱和 B、溢出 A 和溢 出 B (SA、 SB、 OA 和 OB)状态位提供了单独的累加器状态。而饱和 AB 和溢出 AB (SAB 和 OAB)状态位提供了联合的累加器状态。SAB 和 OAB 状态位使得软件开发人员可高效地检查寄 存器是否出现饱和或溢出状况。 OA 和 OB 状态位用来指示一个操作是否产生溢出至相应累加器的警戒位 (bit 32-39)。只有当 处理器处于超饱和模式或饱和模式被禁止时,这种情况才会发生。这表明用累加器的低 31 位无 法表示操作产生的数值。 SA 和 SB 状态位用来指示一个操作是否从相应累加器的最高位产生溢出。无论何种饱和模式(禁 止、常规或超饱和), SA 位和 SB 位都处于 “粘住”状态。即当 SA 或 SB 置 1 时,该位只能由 软件手动清零,而与后续的 DSP 操作无关。在需要时,我们建议使用 BCLR指令对这些位进行清 零。 为简便起见,OA 和 OB 状态位通过逻辑或形成 OAB 标志,而将 SA 和 SB 状态位通过逻辑或形 成 SAB 标志。当实现用到两个累加器的算法时,通过这些累加器状态位可实现高效的溢出和饱和 检查。在进行算术运算溢出检查时,只需查询 OAB 即可完成,而不再需要单独查询 OA 和 OB 状 态位。同样,当进行饱和检查时,可只检查 SAB 而不是所有 SA 和 SB 状态位。注意,清零 SAB 标志将同时对 SA 和 SB 位进行清零。 2.2.14.4 中断优先级状态位 SRL 中的三个中断优先级(IPL)位 SR<7:5> 以及 IPL3 位 CORCON<3> 对用于异常处理的 CPU IPL 进行设定。异常包括中断和硬件陷阱。中断具有的优先级为 0 至 7,可由用户进行定义,而 硬件陷阱的优先级是固定的,为 8 至 15。第 4 中断优先级位 IPL3 为一个特殊的 IPL 位,只可由 用户对其进行读或清零。该位只在硬件陷阱激活时才被置 1,在陷阱处理后被清零。 CPU 的 IPL 用来标识可中断处理器的最低优先级的异常。当等待处理的异常具有比 CPU IPL 更 高的中断优先级时,CPU 才会对其进行处理。这表明,如果 IPL 为 0,所有优先级为 1 或更高的 异常都可中断处理器。如果 IPL 为 7,只有硬件陷阱才可中断处理器。 当正在处理一个异常时, IPL 将自动设定为该异常的优先级,这将禁止所有同等或更低优先级的 异常。当然而,由于 IPL 字段为可读 / 写,用户可在中断服务程序中修改 IPL 的低三位值以控制 何种异常具有优先处理权。由于在异常处理过程中 SRL 将被压入堆栈,因此在异常处理之后原先 的 IPL 将被恢复。如果需要,用户也可通过设置 NSTDIS 位 INTCON1<15> 来避免异常嵌套。 注: 有关异常处理的全部信息可参阅 《dsPIC30F 系列参考手册》(DS70046D_CN)