dsPIC30F4011/4012 图3-5: 数据空间窗口映射到程序空间的操作 数据空间 程序空间 0x0000 0x000100 15为 PSVPAG(1) EA<15>=0 0x00☐ 8 / 数据 16 空间 15 0x8000 EA 23 15 EA<15>=1 地址 15 组合 0x001200 数据空间的上半部分 映射到程序空间 0xFFFF 0x007FFE BSET CORCON,#2 PSV bit set MOV #0x00,W0 Set PSVPAG register MOV WO,PSVPAG MOV 0x9200,W0 Access program memory location using a data space access 数据读 注: PSVPAG是8位寄存器,包含程序空间地址的bit<22:15> (即,它定义了程序空间页,数据空间的上半部分要映射到这个程序空间页)。 3.2 数据地址空间 在执行除MAC类指令之外的任何指令时,X块由64KB 数据地址空间(包括全部Y地址)组成。在执行一条 内核具有两个数据空间。数据空间可以看作是独立的 MAC类指令时,X块由64KB数据地址空间组成,但不包 (对于某些DSP指令而言),或者看作是统一的线性地 括Y地址块(只用来读数据)。换句话说,所有其他指 址范围(对于某些MCU指令而言)。使用两个地址发 令把整个数据存储空间当作一个复合的地址空间。MAC 生单元(AGLU)和独立的数据路径访问这两个数据空 类指令把Y地址空间从数据空间中抽取出来,使用源自 间。 W10和W11的EA对其进行寻址。剩下的X数据空间 3.2.1 数据存储空间映射 则使用W8和W9来寻址。只有通过MAC类指令才能同 时访问这两个地址空间。 数据存储空间分为两块,X和Y数据空间。这个架构的 关键之处在于,Y空间是X空间的子集,Y空间完全包 数据存储空间映射如图3-6所示。 含在X空间中。为了提供表面看似的线性寻址空间,X 图3-7给出了对MCU和DSP指令如何访问X和Y数 和Y空间要有连续的地址。 据空间的图形汇总。 2007 Microchip Technology Inc. DS70135ECN第25页
2007 Microchip Technology Inc. DS70135E_CN 第 25 页 dsPIC30F4011/4012 图 3-5: 数据空间窗口映射到程序空间的操作 3.2 数据地址空间 内核具有两个数据空间。数据空间可以看作是独立的 (对于某些 DSP 指令而言),或者看作是统一的线性地 址范围 (对于某些 MCU 指令而言)。使用两个地址发 生单元 (AGU)和独立的数据路径访问这两个数据空 间。 3.2.1 数据存储空间映射 数据存储空间分为两块,X 和 Y 数据空间。这个架构的 关键之处在于,Y 空间是 X 空间的子集,Y 空间完全包 含在 X 空间中。为了提供表面看似的线性寻址空间, X 和 Y 空间要有连续的地址。 在执行除 MAC 类指令之外的任何指令时,X 块由 64 KB 数据地址空间 (包括全部 Y 地址)组成。在执行一条 MAC类指令时,X块由64 KB数据地址空间组成,但不包 括 Y 地址块 (只用来读数据)。换句话说,所有其他指 令把整个数据存储空间当作一个复合的地址空间。 MAC 类指令把 Y 地址空间从数据空间中抽取出来,使用源自 W10 和 W11 的 EA 对其进行寻址。剩下的 X 数据空间 则使用 W8 和 W9 来寻址。只有通过 MAC 类指令才能同 时访问这两个地址空间。 数据存储空间映射如图 3-6 所示。 图 3-7 给出了对 MCU 和 DSP 指令如何访问 X 和 Y 数 据空间的图形汇总。 23 15 0 PSVPAG(1) 15 15 EA<15> = 0 EA<15> = 1 数据 16 空间 EA 数据空间 程序空间 8 15 23 0x0000 0x8000 0xFFFF 0x00 0x000100 0x007FFE 数据读 数据空间的上半部分 映射到程序空间 注: PSVPAG 是 8 位寄存器,包含程序空间地址的 bit <22:15> (即,它定义了程序空间页,数据空间的上半部分要映射到这个程序空间页)。 0x001200 地址 组合 BSET CORCON,#2 ; PSV bit set MOV #0x00, W0 ; Set PSVPAG register MOV W0, PSVPAG MOV 0x9200, W0 ; Access program memory location ; using a data space access
dsPIC30F4011/4012 图3-6: dsPIC30F4011/4012的数据存储空间映射 MSB LSB 地址 16位 地址 MSB LSB 0x0001 0x0000 2KB SFR空间 SFR空间 0x07FF 0x07FE 0x0801 1 0x0800 X数据RAM(X) 4096字节 1 Near数据 2KB 0xOBFF 0x0BFE 空间 SRAM空间 0x0C01 1 0x0C00 Y数据RAM(Y) / 0xOFFF 0xOFFE 0x1001 1 0x1000 1 0x8001 0x8000 X数据 未实现(X) 可选择 映射到 程序存储器 0xFFFF OxFFFE DS70135E_CN第26页 2007 Microchip Technology Inc
dsPIC30F4011/4012 DS70135E_CN 第 26 页 2007 Microchip Technology Inc. 图 3-6: dsPIC30F4011/4012 的数据存储空间映射 0x0000 0x07FE 0x0BFE 0xFFFE LSB 16 位 地址 MSB LSB MSB 地址 0x0001 0x07FF 0x0BFF 0xFFFF 0x8001 0x8000 0x0FFF 0x0FFE 0x1001 0x1000 0x0801 0x0800 0x0C01 0x0C00 Near 数据 空间 2 KB SFR 空间 2 KB SRAM 空间 4096 字节 未实现(X) X 数据 SFR 空间 X 数据 RAM(X) Y 数据 RAM(Y) 程序存储器 映射到 可选择
dsPIC30F4011/4012 图3-7: 用于MCU和DSP(Ac类)指令的数据空间示例 SFR空间 SFR空间 1 未用 × (Y空间) Y空间 未用 国X 1 1 未用 国X 非MAC类操作(读/写) MAC类操作(只读) MAC类操作(写) 使用任何W寄存器的间接EA 使用W8和W9的间接EA使用W10和W11的间接EA 2007 Microchip Technology Inc. DS70135ECN第27页
2007 Microchip Technology Inc. DS70135E_CN 第 27 页 dsPIC30F4011/4012 图 3-7: 用于 MCU 和 DSP (MAC 类)指令的数据空间示例 SFR 空间 (Y 空间) X 空间 SFR 空间 未用 X 空间 X 空间 Y 空间 未用 未用 非 MAC 类操作(读 / 写) MAC 类操作(只读) 使用任何 W 寄存器的间接 EA 使用 W8 和 W9 的间接 EA 使用 W10 和 W11 的间接 EA MAC 类操作(写)
dsPI1C30F4011/4012 3.2.2 数据空间 3.2.3 数据空间宽度 X数据空间可用于所有指令,并且支持所有寻址模式。 内核数据宽度为16位。所有内部寄存器均按16位宽的 读数据总线和写数据总线是独立的。X读数据总线是所 字来组织。数据存储空间以字节可寻址的16位宽的块 有指令的返回数据路径,它把数据空间视为组合的X和 来组织。 Y地址空间。对于双操作数读指令(MAC类),它还是 X地址空间的数据路径。X写数据总线是所有指令对数 3.2.4 数据对齐 据空间进行写操作的唯一路径。 为了维持与PIC®器件的向后兼容性,并提高数据存储空 X数据空间还支持所有指令的模寻址,不过要受到寻址 间的使用效率,dsPIC30F指令集既支持字操作,也支 模式的限制。位反转寻址只是在写X数据空间时才支 持字节操作。在数据存储器和寄存器中,数据按照字来 持。 对齐,但是,所有数据空间EA都将解析为字节。数据 MAC类指令(CLR、ED、EDAC、MAC、MOVSAC、MPY 字节读取将读取包含字节的整个字,使用任何EA的LSb MPY.N和MSC)将Y数据空间与X数据空间配合使用,提 来确定要选取的字节。选取的字节将存放到X数据路径 供了两条并行的数据读取路径。不能通过Y总线进行任 的LSB中(不可能出现来自Y数据路径的字节访问, 何写操作。MAC类指令使用两个专用的W寄存器指针 因为MAC类指令只能取整字)。这就是说,数据存储器 W10和W11,它们始终寻址Y数据空间,与X数据空 和寄存器被组织为两个并行的字节宽的实体,它们共享 间独立:而W8和W9则始终寻址X数据空间。注意, (字)地址译码,但写入线独立。数据字节写操作只写 在累加器回写期问,数据地址空间被视为X和Y数据空 阵列或寄存器中与字节地址匹配的那一侧。 间的组合,从而写操作通过X总线进行。所以,可以写 这种字节可访问能力的结果是,所有的有效地址计算 整个数据空间中的任何地址。 (包括那些由DSP操作产生的有效地址,它们只能是字 Y数据空间仅用于与MAC类指令相关的数据预取操作。 长度的数据)在内部进行换算,以适应字对齐的存储空 它也支持自动循环缓冲区的模寻址。当然,所有其他指 间。例如,内核将识别执行后修改寄存器间接寻址模式 令可以通过X数据路径把Y数据地址空间作为复合线性 Ws++]的结果,对于字节操作产生的值是Ws+1,而 空间的一部分来进行访问。 对于字操作产生的值是s+2。 图3-6给出了X和Y数据空间之间的边界定义,用户不 所有字访问必须按偶数地址对齐。不支持不对齐的字数 能设定改变边界。如果EA指向其所在地址空间之外的 据取,所以在混合字节和字操作时,或者从8位MCU 傲据,或者指向物理存储器之外的存储单元,将返回全 代码移植时,必须要小心。如果试图进行未对齐的读或 零的字/字节。例如,尽管Y地址空间对于使用任何寻 写操作,将产生地址错误陷阱。如果在读操作时产生错 址模式的所有非MAC指令都是可见的,但如果一条MAC 误,正在执行的指令将完成:而如果在写操作时产生错 指令试图使用W8或W9(X空间指针)从该空间取数 误,指令仍将执行,但不会进行写入。无论是哪种情况, 据,则将返回0x0000。 都会产生陷阱,从而系统和/或用户能够检查地址错误 发生之前的机器状态。 表3-2: 非法存储器访问的后果 图38: 数据对齐 试图进行的操作 返回数据 MSB LSB EA=未实现的地址 0x0000 15 87 0 在MAC指令中使用W8或W9访问 0x0000 0001 字节1 字节0 0000 Y数据空间 0003 字节3 字节2 0002 在MAC指令中使用W10或W11访 0x0000 问X数据空间 0005 字节5 字节4 0004 所有有效地址(EA)均为16位宽,并且指向数据空间 内的字节。所以,数据空间地址范围为64KB或32K字。 DS70135ECN第28页 2007 Microchip Technology Inc
dsPIC30F4011/4012 DS70135E_CN 第 28 页 2007 Microchip Technology Inc. 3.2.2 数据空间 X 数据空间可用于所有指令,并且支持所有寻址模式。 读数据总线和写数据总线是独立的。X 读数据总线是所 有指令的返回数据路径,它把数据空间视为组合的 X 和 Y 地址空间。对于双操作数读指令 (MAC 类),它还是 X 地址空间的数据路径。 X 写数据总线是所有指令对数 据空间进行写操作的唯一路径。 X 数据空间还支持所有指令的模寻址,不过要受到寻址 模式的限制。位反转寻址只是在写 X 数据空间时才支 持。 MAC 类指令(CLR、ED、EDAC、MAC、MOVSAC、MPY、 MPY.N和MSC)将Y数据空间与X数据空间配合使用,提 供了两条并行的数据读取路径。不能通过 Y 总线进行任 何写操作。 MAC 类指令使用两个专用的 W 寄存器指针 W10 和 W11,它们始终寻址 Y 数据空间,与 X 数据空 间独立;而 W8 和 W9 则始终寻址 X 数据空间。注意, 在累加器回写期间,数据地址空间被视为 X 和 Y 数据空 间的组合,从而写操作通过 X 总线进行。所以,可以写 整个数据空间中的任何地址。 Y 数据空间仅用于与 MAC 类指令相关的数据预取操作。 它也支持自动循环缓冲区的模寻址。当然,所有其他指 令可以通过 X数据路径把 Y数据地址空间作为复合线性 空间的一部分来进行访问。 图 3-6 给出了 X 和 Y 数据空间之间的边界定义,用户不 能设定改变边界。如果 EA 指向其所在地址空间之外的 数据,或者指向物理存储器之外的存储单元,将返回全 零的字 / 字节。例如,尽管 Y 地址空间对于使用任何寻 址模式的所有非 MAC 指令都是可见的,但如果一条 MAC 指令试图使用 W8 或 W9 (X 空间指针)从该空间取数 据,则将返回 0x0000。 所有有效地址(EA)均为 16 位宽,并且指向数据空间 内的字节。所以,数据空间地址范围为64 KB或32K字。 3.2.3 数据空间宽度 内核数据宽度为 16 位。所有内部寄存器均按 16 位宽的 字来组织。数据存储空间以字节可寻址的 16 位宽的块 来组织。 3.2.4 数据对齐 为了维持与PIC®器件的向后兼容性,并提高数据存储空 间的使用效率, dsPIC30F 指令集既支持字操作,也支 持字节操作。在数据存储器和寄存器中,数据按照字来 对齐,但是,所有数据空间 EA 都将解析为字节。数据 字节读取将读取包含字节的整个字,使用任何EA的LSb 来确定要选取的字节。选取的字节将存放到 X 数据路径 的 LSB 中 (不可能出现来自 Y 数据路径的字节访问, 因为 MAC 类指令只能取整字)。这就是说,数据存储器 和寄存器被组织为两个并行的字节宽的实体,它们共享 (字)地址译码,但写入线独立。数据字节写操作只写 阵列或寄存器中与字节地址匹配的那一侧。 这种字节可访问能力的结果是,所有的有效地址计算 (包括那些由 DSP 操作产生的有效地址,它们只能是字 长度的数据)在内部进行换算,以适应字对齐的存储空 间。例如,内核将识别执行后修改寄存器间接寻址模式 [Ws++] 的结果,对于字节操作产生的值是 Ws + 1,而 对于字操作产生的值是 Ws + 2。 所有字访问必须按偶数地址对齐。不支持不对齐的字数 据取,所以在混合字节和字操作时,或者从 8 位 MCU 代码移植时,必须要小心。如果试图进行未对齐的读或 写操作,将产生地址错误陷阱。如果在读操作时产生错 误,正在执行的指令将完成;而如果在写操作时产生错 误,指令仍将执行,但不会进行写入。无论是哪种情况, 都会产生陷阱,从而系统和 / 或用户能够检查地址错误 发生之前的机器状态。 图 3-8: 数据对齐 表 3-2: 非法存储器访问的后果 试图进行的操作 返回数据 EA = 未实现的地址 0x0000 在 MAC 指令中使用 W8 或 W9 访问 Y 数据空间 0x0000 在 MAC 指令中使用 W10 或 W11 访 问 X 数据空间 0x0000 15 8 7 0 0001 0003 0005 0000 0002 0004 字节 1 字节 0 字节 3 字节 2 字节 5 字节 4 MSB LSB
dsPIC30F4011/4012 所有装入W寄存器的字节都将被装入相应的LSB中: 堆栈指针限制寄存器(SPLIM)与堆栈指针相关。复位 相应的MSB不变。 时SPLIM不被初始化。与堆栈指针的情况一样, 提供了一条符号扩展(SE)指令,允许用户把8位有 SPLIM<0>被强制为0,因为所有的堆栈操作必须是字 符号数据转换为16位有符号值。或者,对于16位无符 对齐的。每当使用W15作为源指针或目标指针产生有 号数据,用户可以通过在适当地址处执行一条零扩展 效地址(EA)时,将与SPLIM中的值进行比较。如果 (ZE)指令清零任何W寄存器的MSB. 堆栈指针(W15)的内容与SPLIM寄存器的内容相等, 则执行压栈操作时不产生堆栈错误陷阱。但在随后的压 尽管大多数指令能够对字或字节大小的数据进行操作, 栈操作时将会产生堆栈错误陷阱。这样的话,当堆栈增 但要注意的是,部分指令(包括DSP指令)只对字大 长超过RAM中地址Ox2000时,如果要想产生堆栈错误 小的数据进行操作。 陷阱,用值0x1FFE来初始化SPLIM即可 3.2.5 NEAR数据空间 类似地,当堆栈指针地址小于0x0800时,就会产生堆 栈指针下溢(堆栈错误)陷阱,从而避免了堆栈干扰特 X地址存储空间中,在0x0000和0x1FFF之间保留了 一个8KB的“near”数据空间,在所有存储器直接寻 殊功能寄存器(Special Function Register,,SFR)空 间。 址指令中,可以通过一个13位的绝对地址字段来直接 访问这个数据空间。其余的X地址空间和所有Y地址空 在对SPLIM寄存器进行写操作之后,不应紧跟着使用 间都是间接寻址的。此外,使用MOV指令可以寻址整个 W15进行间接读操作的指令。 X数据空间,这支持通过16位地址字段进行存储器直 接寻址。 图3-9: CALL堆栈帧 3.2.6 软件堆栈 0x000015 0 dsPIC DSC具备一个软件堆栈。W15用作堆栈指针。 堆栈指针总是指向第一个可用的空字,并且从低地址向 高地址方向增长。它在弹出堆栈之前递减,而在压入堆 栈之后递增,如图3-9所示。注意,对于任何CAL工指 令时的PC压栈,在压入堆栈之前,PC的MSB要进行 PC<15:0> 4W15(CALL前) 零扩展,从而确保了MSB始终是清零的。 000000000PC<22:16> 注 在异常处理期间,在将P℃压入堆栈之前, <空字> 4W15(CAIL后) 要先将PC的MSB与SRL寄存器组合在 一起。 POR [--W15] PUS#[W15++] 2007 Microchip Technology Inc. DS70135ECN第29页
2007 Microchip Technology Inc. DS70135E_CN 第 29 页 dsPIC30F4011/4012 所有装入 W 寄存器的字节都将被装入相应的 LSB 中; 相应的 MSB 不变。 提供了一条符号扩展 (SE)指令,允许用户把 8 位有 符号数据转换为 16 位有符号值。或者,对于 16 位无符 号数据,用户可以通过在适当地址处执行一条零扩展 (ZE)指令清零任何 W 寄存器的 MSB。 尽管大多数指令能够对字或字节大小的数据进行操作, 但要注意的是,部分指令 (包括 DSP 指令)只对字大 小的数据进行操作。 3.2.5 NEAR 数据空间 X 地址存储空间中,在 0x0000 和 0x1FFF 之间保留了 一个 8 KB 的 “near”数据空间,在所有存储器直接寻 址指令中,可以通过一个 13 位的绝对地址字段来直接 访问这个数据空间。其余的 X 地址空间和所有 Y 地址空 间都是间接寻址的。此外,使用 MOV 指令可以寻址整个 X 数据空间,这支持通过 16 位地址字段进行存储器直 接寻址。 3.2.6 软件堆栈 dsPIC DSC 具备一个软件堆栈。 W15 用作堆栈指针。 堆栈指针总是指向第一个可用的空字,并且从低地址向 高地址方向增长。它在弹出堆栈之前递减,而在压入堆 栈之后递增,如图 3-9 所示。注意,对于任何 CALL 指 令时的 PC 压栈,在压入堆栈之前,PC 的 MSB 要进行 零扩展,从而确保了 MSB 始终是清零的。 堆栈指针限制寄存器(SPLIM)与堆栈指针相关。复位 时 SPLIM 不被初始化。与堆栈指针的情况一样, SPLIM<0> 被强制为 0,因为所有的堆栈操作必须是字 对齐的。每当使用 W15 作为源指针或目标指针产生有 效地址 (EA)时,将与 SPLIM 中的值进行比较。如果 堆栈指针(W15)的内容与 SPLIM 寄存器的内容相等, 则执行压栈操作时不产生堆栈错误陷阱。但在随后的压 栈操作时将会产生堆栈错误陷阱。这样的话,当堆栈增 长超过 RAM 中地址 0x2000 时,如果要想产生堆栈错误 陷阱,用值 0x1FFE 来初始化 SPLIM 即可。 类似地,当堆栈指针地址小于 0x0800 时,就会产生堆 栈指针下溢(堆栈错误)陷阱,从而避免了堆栈干扰特 殊功能寄存器 (Special Function Register, SFR)空 间。 在对 SPLIM 寄存器进行写操作之后,不应紧跟着使用 W15 进行间接读操作的指令。 图 3-9: CALL 堆栈帧 注: 在异常处理期间,在将 PC 压入堆栈之前, 要先将 PC 的 MSB 与 SRL 寄存器组合在 一起。 < 空字 > PC<15:0> 000000000 15 0 W15(CALL 前) W15(CALL 后) 堆栈向高地址增长 PUSH:[W15++] POP:[--W15] 0x0000 PC<22:16>