48
© 2011 Microchip Technology Inc. DS70359B_CN 2-1 CPU 2 2 CPU 目录 本章包括下列主题: 2.1 简介................................................................................................................................ 2-2 2.2 编程模型......................................................................................................................... 2-5 2.3 软件堆栈指针 ................................................................................................................. 2-9 2.4 CPU 寄存器说明 .......................................................................................................... 2-13 2.5 算术逻辑单元 (ALU................................................................................................. 2-19 2.6 DSP 引擎 ..................................................................................................................... 2-20 2.7 除法支持....................................................................................................................... 2-30 2.8 指令流类型 ................................................................................................................... 2-31 2.9 循环结构....................................................................................................................... 2-34 2.10 地址寄存器相依性 ........................................................................................................ 2-39 2.11 数据空间仲裁停顿 ........................................................................................................ 2-41 2.12 寄存器映射 ................................................................................................................... 2-42 2.13 相关应用笔记 ............................................................................................................... 2-44 2.14 版本历史....................................................................................................................... 2-45

2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

  • Upload
    others

  • View
    25

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPU

CP

U

2

目录

本章包括下列主题:

2.1 简介................................................................................................................................ 2-2

2.2 编程模型......................................................................................................................... 2-5

2.3 软件堆栈指针 ................................................................................................................. 2-9

2.4 CPU 寄存器说明 .......................................................................................................... 2-13

2.5 算术逻辑单元(ALU)................................................................................................. 2-19

2.6 DSP 引擎 ..................................................................................................................... 2-20

2.7 除法支持....................................................................................................................... 2-30

2.8 指令流类型 ................................................................................................................... 2-31

2.9 循环结构....................................................................................................................... 2-34

2.10 地址寄存器相依性 ........................................................................................................ 2-39

2.11 数据空间仲裁停顿 ........................................................................................................ 2-41

2.12 寄存器映射 ................................................................................................................... 2-42

2.13 相关应用笔记 ............................................................................................................... 2-44

2.14 版本历史....................................................................................................................... 2-45

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-1 页

Page 2: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.1 简介

dsPIC33E/PIC24E CPU 采用 16 位 (数据)的改进型哈佛架构,具有增强指令集,其中包括对数字信号处理的强大支持。CPU 具有 24 位指令字,指令字带有长度可变的操作码字段。程序计数器(Program Counter, PC)为 24 位宽,可以寻址 大 4M x 24 位的用户程序存储空间。

指令预取机制可帮助维持吞吐量,并使指令的执行具有可预测性。除了改变程序流的指令、双字传送(MOV.D)指令、PSV 访问和表指令以外,大多数指令都以单周期有效执行速率执行。使用DO和 REPEAT指令支持无开销的程序循环结构,这两条指令在任意时刻都可以被中断。

2.1.1 寄存器

dsPIC33E/PIC24E 器件在编程模型中有 16 个 16 位工作寄存器。每个工作寄存器都可作为数据、地址或地址偏移量寄存器。第16个工作寄存器(W15)作为软件堆栈指针工作,用于中断和调用。

2.1.2 指令集

dsPIC33E/PIC24E 指令集具有两类指令:

• MCU 类指令

• DSP 类指令

这两类指令无缝地集成到架构中,并从单个执行单元执行。指令集包含多种寻址模式,指令的设计可使 C 编译器的效率达到 优。

2.1.3 数据空间寻址

基本数据空间可以作为 32K 字或 64 KB 寻址,并被分成两块,称为 X 和 Y 数据存储区。每个存储块有自己独立的地址发生单元(Address Generation Unit,AGU)。MCU 类指令只通过 X 存储区 AGU 进行操作,可将整个存储器映射作为一个线性数据空间访问。一些 DSP 指令通过 X 和Y 的 AGU 进行操作以支持双操作数读操作,这样会将数据地址空间分成两个部分。 X 和 Y 数据空间的边界视具体器件而定。

可选择将数据存储空间的高 32 KB 映射到任何 16K 程序字边界内的程序空间。程序空间到数据空间的映射功能(称为程序空间可视性(Program Space Visibility,PSV))让任何指令都能像访问数据空间一样访问程序空间。此外,基本数据空间地址与读页寄存器或写页寄存器(DSRPAG或 DSWPAG)配合使用,可构成扩展数据空间(Extended Data Space,EDS)地址。EDS 可以作为 8M 字或 16 MB 寻址。关于 EDS、PSV 和表访问的更多详细信息,请参见第 3 章“数据存储器”(DS70595)。

在 dsPIC33E 器件中,X 和 Y 地址空间都支持无开销循环缓冲区(模寻址)。模寻址省去了 DSP算法的软件边界检查开销。X AGU 的循环寻址可以用于任何 MCU 类指令。X AGU 还支持位反转寻址,大幅简化了基 2 FFT 算法对输入或输出数据的重新排序。

注: 本系列参考手册章节旨在用作对器件数据手册的补充。根据不同的器件型号,本手册章节可能并不适用于所有 dsPIC33E/PIC24E 器件。

请参见当前器件数据手册中“CPU”章节开头部分的注,以检查本文档是否支持您所使用的器件。

器件数据手册和系列参考手册章节可从 Microchip 网站 http://www.microchip.com下载。

DS70359B_CN 第 2-2 页 © 2011 Microchip Technology Inc.

Page 3: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.1.4 寻址模式

CPU 支持以下寻址模式:

• 固有寻址(无操作数)

• 相对寻址

• 立即数寻址

• 存储器直接寻址

• 寄存器直接寻址

• 寄存器间接寻址

根据每条指令的功能要求,每条指令与预定义的寻址模式组相关联。对于每条指令,支持 多 6 种寻址模式。

对于大多数指令, dsPIC33E/PIC24E 能在单个指令周期内执行以下功能:

• 数据存储器读操作

• 工作寄存器(数据)读操作

• 数据存储器写操作

• 程序(指令)存储器读操作

因此,支持三操作数指令,允许在单个周期内执行 A+B=C 这样的操作。

2.1.5 DSP 引擎和指令 (仅限 dsPIC33E 器件)

DSP 引擎具有:

• 一个高速 17 位 x 17 位乘法器

• 一个 40 位 ALU

• 两个 40 位饱和累加器

• 一个 40 位双向桶形移位寄存器,能在单个周期内将一个 40 位的值右移或左移 多 16 位

DSP 指令可以无缝地与所有其他指令一起操作,且设计为能获得 佳实时性能。MAC指令及其他相关指令能够在从存储器取出两个数据操作数的同时,将两个 W 寄存器相乘。这要求数据空间对于这些指令拆分为两块,但对于所有其他指令保持线性。这是通过将某些工作寄存器分配给每个地址空间,以透明和灵活的方式实现的。

2.1.6 异常处理

dsPIC33E/PIC24E 具有向量异常机制,带有 多 8 个不可屏蔽陷阱源和 多 246 个中断源。可以为每个中断源分配 7 个优先级之一。根据应用要求,用户可以在固定和可变中断延时之间进行选择。关于中断延时的更多信息,请参见第 6 章 “中断”(DS70600)。图 2-1 给出了dsPIC33E/PIC24E CPU 框图。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-3 页

Page 4: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

图 2-1: dsPIC33E/PIC24E CPU 框图

上电延时定时器

振荡器起振定时器

指令译码和控制

OSC1/CLKI

MCLR

VDD,VSS

时序发生

16

PCH PCL

16

程序计数器

16 位 ALU

24

24

24

24

X 数据总线

IR

PCU

16

16 16

W 寄存器阵列

除法支持

引擎

DSP

RO

M锁存

16

Y 数据总线

EA 多路开关

X RAGUX WAGU

Y AGU

AVDD,AVSS

16

24

16

16

16

16

16

16

16

8

中断控制器

PSV 和表数据访问控制模块

堆栈控制逻辑

循环控制逻辑

数据锁存器数据锁存器

Y 数据RAM

X 数据RAM

地址锁存器

地址锁存器

至各模块的控制信号

16

数据锁存器

I/O 端口

16

16

16

X 地址总线

Y地

址总

线

24

立即

数数

程序存储器

看门狗定时器

复位POR/BOR

地址锁存器

外设模块

16 x 16

DS70359B_CN 第 2-4 页 © 2011 Microchip Technology Inc.

Page 5: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.2 编程模型

图 2-2 给出了 dsPIC33E/PIC24E 的编程模型。编程模型中的所有寄存器都是存储器映射的,并且可以通过指令直接操作。表 2-1 提供了编程模型中每个寄存器的说明。

除了编程模型中包含的寄存器,dsPIC33E/PIC24E 还包含用于模寻址、位反转寻址和中断的控制寄存器。这些寄存器将在本文档后续章节中进行说明。

与编程模型相关的所有寄存器都是存储器映射的,如表 2-8 中所示。

表 2-1: 编程模型的寄存器说明

寄存器名称 说明

W0 至 W15 工作寄存器阵列

ACCA 和 ACCB(1) 40 位 DSP 累加器

PC 23 位程序计数器

SR ALU 和 DSP 引擎状态寄存器

SPLIM 堆栈指针限制值寄存器

TBLPAG 表存储器页地址寄存器

DSRPAG 扩展数据空间(EDS)读页寄存器

DSWPAG 扩展数据空间(EDS)写页寄存器

RCOUNT REPEAT循环计数寄存器

DCOUNT(1) DO循环计数寄存器

DOSTARTH 和 DOSTARTL(1) DO循环起始地址寄存器 (高字节和低字节)

DOENDH 和 DOENDL(1) DO循环结束地址寄存器 (高字节和低字节)

CORCON 包含 DSP 引擎和 DO循环控制位

注 1: 这些寄存器仅在 dsPIC33E 器件中存在。关于可用性,请参见具体器件的数据手册。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-5 页

Page 6: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

图 2-2: 编程模型

RCOUNT

15 0REPEAT循环计数器

15 0DO循环计数器

DCOUNT

DOSTART

24 0

DO循环起始地址

15 0

CPU 内核控制寄存器CORCON

DO循环结束地址DOEND

24 0

00

00

015

工作寄存器

W1

W2

W3

W4

W5

W6

W7

W8

W9

W10

W11

W12

W13

W14/ 帧指针

W15/ 堆栈指针

SPLIM 堆栈指针限制寄存器

W0/WREG

DIV 和 MUL结果寄存器

图注

嵌套 DO

39 031

DSP累加器

ACCA

ACCB

15

MAC 操作数寄存器

MAC 地址寄存器

状态寄存器

ZOA OB SA SB IPL2 IPL1

SRL

OAB SAB DA DC RA N CIPL0 OV

SRH

堆栈

PUSH.S和POP.S影子寄存器

TABPAG

22 0

7 0

程序计数器

数据表页地址

PSVPAG

9 0X 数据空间读页地址

TBLPAG

DSRPAG

0

PSVPAG

8 0X 数据空间写页地址

DSWPAG

DS70359B_CN 第 2-6 页 © 2011 Microchip Technology Inc.

Page 7: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.2.1 工作寄存器阵列

16 个工作 (W)寄存器可用作数据、地址或地址偏移量寄存器。 W 寄存器的功能由访问它的指令的寻址模式决定。

dsPIC33E/PIC24E 指令集可被分为两种指令类型:

• 寄存器指令

• 文件寄存器指令

2.2.1.1 寄存器指令

寄存器指令可将每个 W 寄存器用作数据值或地址偏移值。例 2-1 给出了寄存器指令。

例 2-1:

2.2.1.2 文件寄存器指令

文件寄存器指令对在指令操作码和寄存器 W0 中包含的特定存储器地址进行操作。 W0 是一个可在文件寄存器指令中使用的特殊工作寄存器。在文件寄存器指令中,工作寄存器 W1-W15 不可被指定为目标寄存器。

文件寄存器指令与只有一个 W 寄存器的现有 PIC® MCU 器件向后兼容。在汇编语法中使用标号“WREG”来表示文件寄存器指令中的 W0。例 2-2 给出了文件寄存器指令。

例 2-2:

2.2.1.3 W 寄存器存储器映射

W 寄存器是存储器映射的,因此可以用文件寄存器指令访问 W 寄存器,如例 2-3 所示。

例 2-3:

此外,还可执行一条将 W 寄存器同时用作地址指针和操作数目标的指令,如例 2-4 所示。

例 2-4:

注: 关于寻址模式和指令语法的完整说明,请参见 《16 位 MCU 和 DSC 程序员参考手册》(DS70157E_CN)。

MOV W0,W1 ; move contents of W0 to W1

MOV W0,[W1] ; move W0 to address contained in W1

ADD W0,[W4],W5 ; add contents of W0 to contents pointed

; to by W4.Place result in W5.

MOV WREG,0x0100 ; move contents of W0 to address 0x0100

ADD 0x0100,WREG ; add W0 to address 0x0100, store in W0

MOV 0x0004, W10 ; equivalent to MOV W2, W10

其中:

0x0004 = W2的存储器地址

MOV W1,[W2++]

其中:

W1 = 0x1234

W2 = 0x0004 ;[W2] addresses W2

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-7 页

Page 8: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

在上例中, W2 的内容是 0x0004。由于 W2 被用作地址指针,它指向存储器中的 0x0004 单元。W2 也映射到存储器中的该地址。虽然这是不太可能发生的事件,但不到运行时不可能检测到。dsPIC33E/PIC24E 确保数据写操作占据主导,使上例中 W2 = 0x1234。

2.2.1.4 W 寄存器和字节模式指令

将W寄存器阵列作为目标寄存器的字节指令只影响目标寄存器的 低有效字节(Least SignificantByte, LSB)。由于工作寄存器是存储器映射的,因此可以通过对数据存储空间进行字节宽度的访问来操作 LSB 和 高有效字节 (Most Significant Byte, MSB)。

2.2.2 影子寄存器

编程模型中的许多寄存器都有相关的影子寄存器,如图 2-2 所示。所有影子寄存器均不能直接访问。

在执行函数调用或中断服务程序(Interrupt Service Routine,ISR)时,PUSH.S和 POP.S指令用于快速现场保存 / 恢复。 PUSH.S指令会将以下寄存器的值传送到它们各自的影子寄存器中:

• W0...W3

• SR (仅 N、 OV、 Z、 C 和 DC 位)

POP.S 指令会将值从影子寄存器恢复到这些寄存器中。例 2-5 给出了使用 PUSH.S 和 POP.S指令的代码示例。

例 2-5:

PUSH.S 指令会改写先前保存在影子寄存器中的内容。影子寄存器深度只有一层,所以如果多个软件任务使用影子寄存器,必须小心。

用户应用程序必须确保任何使用影子寄存器的任务均不会被同样使用该影子寄存器且具有更高优先级的任务中断。如果允许较高优先级的任务中断较低优先级的任务,较低优先级任务保存在影子寄存器中的内容将被较高优先级任务改写。

2.2.3 未初始化的 W 寄存器复位

W 寄存器阵列(W15 除外)在发生所有复位时被清零,并且在被写入前视为未经初始化。试图将未初始化的寄存器用作地址指针将会复位器件。

必须执行字写操作来初始化 W 寄存器。字节写操作不会影响初始化检测逻辑。

MyFunction:PUSH.S ; Save W registers, MCU statusMOV #0x03,W0 ; load a literal value into W0ADD RAM100 ; add W0 to contents of RAM100BTSC SR,#Z ; is the result 0?BSET Flags,#IsZero ; Yes, set a flagPOP.S ; Restore W regs, MCU status

RETURN

DS70359B_CN 第 2-8 页 © 2011 Microchip Technology Inc.

Page 9: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.3 软件堆栈指针

W15寄存器作为专用的软件堆栈指针并被异常处理、子程序调用和返回自动修改;但是,W15 可以被任何指令以与所有其他 W 寄存器相同的方式引用。这样就简化了对堆栈指针的读、写和操作(例如,创建堆栈帧)。

所有复位均将 W15 初始化为 0x1000。该地址确保在所有 dsPIC33E/PIC24E 器件中,堆栈指针(Stack Pointer, SP)指向有效的 RAM 并允许不可屏蔽陷阱异常使用堆栈。这些可能在 SP 被用户软件初始化之前发生。在初始化期间,可以将 SP 再编程以指向数据空间内的任何单元。

堆栈指针总是指向第一个可用的空字并从低地址到高地址填充软件堆栈。图 2-3 显示了它如何在弹出(读)堆栈时预递减,以及在堆栈 (写)压入时后递增。

当 PC 压入堆栈时, PC<15:0> 被压入第一个可用的堆栈字,然后 PC<22:16> 被压入第二个可用的堆栈单元。对于任何 CALL 指令执行期间的 PC 压栈,压栈前 PC 的 MSB 被零扩展,如图2-3 所示。在异常处理期间,PC 的 MSB 与 CPU 状态寄存器 SR 的低 8 位组合在一起。这样就能在中断处理期间自动保存 SRL 的内容。

图 2-3: CALL指令的堆栈操作

2.3.1 软件堆栈示例

可使用 PUSH和 POP指令操作软件堆栈。 PUSH和 POP指令相当于将 W15 用作目标指针的 MOV指令。例如,要将 W0 的内容压入堆栈,可通过:

PUSH W0

该语法相当于:

MOV W0,[W15++]

要将栈顶的内容返回 W0,可通过:

POP W0

该语法相当于:

MOV [--W15],W0

注: 为了防止不对齐的堆栈访问, W15<0> 被硬件固定设置为 0。

注: 堆栈指针W15永远不会受分页影响;因此,堆栈地址被限制在基本数据空间(0x0000– 0xFFFF)中。

< 空字 >

PC<15:1>PC<22:16>

015

W15(CALL前)

W15(CALL后)

堆栈向高地址增长

b‘000000000’

CALL SUBR

SFA

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-9 页

Page 10: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

图 2-4 至图 2-7 给出了如何使用软件堆栈的示例。图 2-4 显示了器件初始化时的软件堆栈。W15已经初始化为 0x1000。该示例假设 0x5A5A 和 0x3636 这两个值已被分别写入 W0 和 W1。图 2-5中第一次压入堆栈,W0 中包含的值被复制到堆栈中。W15 自动更新以指向下一个可用的堆栈单元(0x1002)。在图 2-6 中, W1 的内容被压入堆栈。图 2-7 显示了如何弹出堆栈,以及栈顶值(先前从 W1 压入)如何被写入 W3。

图 2-4: 器件复位时的堆栈指针

图 2-5: 执行第一条 PUSH指令后的堆栈指针

图 2-6: 执行第二条 PUSH指令后的堆栈指针

图 2-7: 执行一条 POP指令后的堆栈指针

0x0000

0xFFFE

0x1000W15

W15 = 0x1000W0 = 0x5A5AW1 = 0x3636

0x0000

0xFFFE

0x5A5A

W15 = 0x1002W0 = 0x5A5AW1 = 0x3636

0x1000 PUSH W00x1002W15

0x0000

0xFFFE

0x5A5A0x3636

W15 = 0x1004W0 = 0x5A5AW1 = 0x3636

0x1000PUSH W1

0x10020x1004W15

0x0000

0xFFFE

0x05A5A0x03636

0x3636 → W3W15 = 0x1002

POP W3

0x10020x1000

W15

DS70359B_CN 第 2-10 页 © 2011 Microchip Technology Inc.

Page 11: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.3.2 W14 软件堆栈帧指针

帧是堆栈中用户定义的存储器段,供单个子程序使用。通过使用 LNK(分配堆栈帧)和 ULNK(释放堆栈帧)指令可以将工作寄存器 W14 用作堆栈帧指针。当不用作帧指针时, W14 可被指令当作普通的工作寄存器使用。

关于将 W14 用作堆栈帧指针的软件示例,请参见《16 位 MCU 和 DSC 程序员参考手册》(DS70157E_CN)。

2.3.3 堆栈指针上溢

堆栈指针限制寄存器(SPLIM)用于指定堆栈缓冲区的大小。 SPLIM 是一个 16 位寄存器,但SPLIM<0> 被固定为 0,因为所有的堆栈操作都必须按字对齐。

直到一个字写入 SPLIM 后才会使能堆栈上溢检查。在此之后,只能通过器件复位禁止堆栈上溢检查。所有将 W15 用作源或目标寄存器而产生的有效地址将与 SPLIM 中的值作比较。如果堆栈指针(W15)的内容比 SPLIM 寄存器的内容大 2,并且执行了压栈操作,则不会在后续压栈操作时产生堆栈错误陷阱。例如,如果想要在堆栈指针递增到超出 RAM 中的地址 0x2000 时引起堆栈错误陷阱,可将 SPLIM 初始化为值 0x1FFE。

如果使能了堆栈上溢检查,则当 W15 有效地址计算越过了数据空间的末尾(0xFFFF)时,也会产生堆栈错误陷阱。

关于堆栈错误陷阱的更多信息,请参见第 6 章 “中断”(DS70600)。

2.3.4 堆栈指针下溢

复位时堆栈被初始化为 0x1000。如果堆栈指针地址小于 0x1000,则会产生堆栈错误陷阱。

2.3.5 堆栈帧有效 (SFA)控制

W15 不会受分页影响,因此地址范围限制为 0x000000 至 0x00FFFF。但是,当通过堆栈帧指针(W14)寻址的堆栈帧处于有效状态时 (即,在 LNK 指令之后),任何用户软件函数的 W14 将仅专用于该函数。因此,需要能够在将 W14 用作通用 W 寄存器和用作堆栈帧指针之间动态地进行切换。 SFA 状态 (CORCON<2>)位可以实现该功能,无需任何额外的软件开销。

当 SFA 清零时,W14 可以与任意页寄存器配合使用。当 SFA 置 1 时,W14 不受分页影响,并锁定为与 W15 相同的地址范围(0x000000 至 0x00FFFF)。 SFA 寄存器锁定的操作如下:

• LNK指令将 SFA 置 1 (并创建一个堆栈帧)。

• ULNK指令将 SFA 清零 (并删除堆栈帧)。

注: 任何使用 W15 寄存器的内容来产生有效地址(Effective Address, EA)的指令均有可能产生堆栈错误陷阱。因此,如果 W15 的内容比 SPLIM 寄存器的内容大 2,并且执行了一条 CALL指令或发生了中断,则会产生堆栈错误陷阱。

当 SFA 位为高电平时,LNK指令会产生堆栈错误陷阱;当 SFA 位为 0时,ULNK指令会产生堆栈错误陷阱。

注: 对 SPLIM 的写操作后面不应紧跟一个使用 W15 的间接读操作。

注: 通常,数据空间中 0x0000 和 0x0FFF 之间的单元预留给内核和外设的特殊功能寄存器。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-11 页

Page 12: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

• CALL、CALLW、CALLWL、RCALL和 RCALLW指令或向量中断还会将 SFA 位压入堆栈(将它放入已入栈 PC 的 低有效位 (Least Significant bit, LSb)),并在压栈操作完成之后清零 SFA 位。被调用的过程以及中断向量现在可以自由地使用 W14 作为通用寄存器,也可以使用 LNK指令创建另一个堆栈帧。

• RETURN、 RETLW和 RETFIE指令都会从先前入栈值中恢复 SFA 位。

SFA 位是只读位。它只能通过执行 LNK指令置 1,通过 ULNK、CALL、CALLW、CALLWL、RCALL和 RCALLW指令清零。

DS70359B_CN 第 2-12 页 © 2011 Microchip Technology Inc.

Page 13: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.4 CPU 寄存器说明

2.4.1 SR:CPU 状态寄存器

dsPIC33E/PIC24E CPU 有一个 16 位状态寄存器(Status Register, SR)。寄存器 2-1 给出了CPU SR 的详细说明。该寄存器的 LSB 被称为 SRL (状态寄存器低字节)。 MSB 被称为 SRH(状态寄存器高字节)。

SRL 包含:

• 所有的 MCU ALU 操作状态标志

• CPU 中断优先级状态位 IPL<2:0>

• REPEAT循环有效状态位 RA (SR<4>)

在异常处理期间, SRL 与 PC 的 MSB 组合形成一个完整的字值,然后将该字值压入堆栈。

SRH 包含:

• DSP 加法器 / 减法器状态位

• DO循环活动位 DA (SR<9>)

• 半进位位 DC (SR<8>)

SR 位可读 / 写,但以下各位例外:

• DA 位 (SR<8>)是只读位

• RA 位 (SR<4>)是只读位

• OA、OB(SR<15:14>)、OAB(SR<11>)、SA、SB(SR<13:12>)和 SAB(SR<10>)位是可读 / 写位;但是一旦置 1,它们将保持置 1 状态直到被用户应用程序清零,而与任何后续 DSP 操作的结果无关。

2.4.2 CORCON:内核控制寄存器

内核控制寄存器(CORCON)具有控制 DSP 乘法器和 DO循环硬件操作的位。 CORCON 寄存器还包含 IPL3 状态位,它与 IPL<2:0> (SR<7:5>)组合形成 CPU 中断优先级。

注: 清零 SAB 位也会清零 SA 和 SB 位。同样,清零 OAB 位也会清零 OA 和 OB 位。《16 位 MCU 和 DSC 程序员参考手册》(DS70157E_CN)中提供了对受各指令影响的状态寄存器位的说明。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-13 页

Page 14: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

寄存器 2-1: SR:CPU 状态寄存器

R/W-0 R/W-0 R/W-0 R/W-0 R/C-0 R/C-0 R -0 R/W-0

OA(2) OB(2) SA(1,2) SB(1,2) OAB(2) SAB(2) DA(2) DC

bit 15 bit 8

R/W-0(3,4) R/W-0(1,2) R/W-0(3,4) R-0 R/W-0 R/W-0 R/W-0 R/W-0

IPL<2:0> RA N OV Z C

bit 7 bit 0

图注: U = 未实现位,读为 0

R = 可读位 W = 可写位 C = 可清零位

-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15 OA:累加器 A 溢出状态位 (2)

1 = 累加器 A 已溢出0 = 累加器 A 未溢出

bit 14 OB:累加器 B 溢出状态位 (2)

1 = 累加器 B 已溢出0 = 累加器 B 未溢出

bit 13 SA:累加器 A 饱和 “粘住”状态位 (1,2)

1 = 累加器 A 饱和或在某时已经饱和0 = 累加器 A 未饱和

bit 12 SB:累加器 B 饱和 “粘住”状态位 (1,2)

1 = 累加器 B 饱和或在某时已经饱和0 = 累加器 B 未饱和

bit 11 OAB:OA 和 OB 组合的累加器溢出状态位 (2)

1 = 累加器 A 或 B 已溢出0 = 累加器 A 和 B 都未溢出

bit 10 SAB:SA 和 SB 组合的累加器“粘住”状态位 (2)

1 = 累加器 A 或 B 饱和或在过去某时已经饱和0 = 累加器 A 和 B 都未饱和

bit 9 DA: DO循环活动位 (2)

1 = 正在进行 DO循环0 = 不在进行 DO循环

bit 8 DC:MCU ALU 半进位 / 借位标志位1 = 结果的第 4 个低位 (对于字节大小的数据)或第 8 个低位 (对于字大小的数据)发生了进位0 = 结果的第 4 个低位 (对于字节大小的数据)或第 8 个低位 (对于字大小的数据)未发生进位

注 1:对 SR 的数据写操作可以修改 SA 和 SB 位,方法是向 SA 和 SB 写入数据或清零 SAB 位。要避免可能出现的 SA 或 SB 位写竞争条件,不要使用位操作来修改 SA 和 SB 位。

2:这些位仅在 dsPIC33E 器件中存在。关于可用性,请参见具体器件的数据手册。

3:IPL<2:0> 位与 IPL<3> 位(CORCON<3>)组合形成 CPU 中断优先级。如果 IPL<3> = 1,那么括号中的值表示 IPL。当 IPL<3> = 1时,禁止用户中断。

4:当 NSTDIS (INTCON1<15>) = 1时, IPL<2:0> 状态位是只读位。

DS70359B_CN 第 2-14 页 © 2011 Microchip Technology Inc.

Page 15: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

bit 7-5 IPL<2:0>:CPU 中断优先级状态位 (3,4)

111 = CPU 中断优先级为 7 (15)。禁止用户中断。 110 = CPU 中断优先级为 6 (14)101 = CPU 中断优先级为 5 (13)100 = CPU 中断优先级为 4 (12)011 = CPU 中断优先级为 3 (11)010 = CPU 中断优先级为 2 (10)001 = CPU 中断优先级为 1 (9)000 = CPU 中断优先级为 0 (8)

bit 4 RA: REPEAT循环活动位1 = 正在进行 REPEAT循环0 = 不在进行 REPEAT循环

bit 3 N:MCU ALU 负标志位1 = 结果为负0 = 结果为非负(零或正值)

bit 2 OV: MCU ALU 溢出标志位该位用于有符号的算术运算 (以二进制补码方式进行)。它表示量值上的溢出,这种溢出将导致符号位改变状态。 1 = 有符号算术运算(本次算术运算)中发生溢出0 = 未发生溢出

bit 1 Z:MCU ALU 全零标志位1 = 影响 Z 位的任何运算在过去某时已将该位置 10 = 影响 Z 位的 近一次运算已将该位清零 (即运算结果非零)

bit 0 C:MCU ALU 进位 / 借位标志位1 = 结果的 高有效位发生了进位0 = 结果的 高有效位未发生进位

寄存器 2-1: SR:CPU 状态寄存器(续)

注 1:对 SR 的数据写操作可以修改 SA 和 SB 位,方法是向 SA 和 SB 写入数据或清零 SAB 位。要避免可能出现的 SA 或 SB 位写竞争条件,不要使用位操作来修改 SA 和 SB 位。

2:这些位仅在 dsPIC33E 器件中存在。关于可用性,请参见具体器件的数据手册。

3:IPL<2:0> 位与 IPL<3> 位(CORCON<3>)组合形成 CPU 中断优先级。如果 IPL<3> = 1,那么括号中的值表示 IPL。当 IPL<3> = 1时,禁止用户中断。

4:当 NSTDIS (INTCON1<15>) = 1时, IPL<2:0> 状态位是只读位。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-15 页

Page 16: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

寄存器 2-2: CORCON:内核控制寄存器

U-0 U-0 R/W-0 R/W-0 R/W-0 R-0 R-0 R-0

— — US<1:0>(2) EDT(1,2) DL<2:0>(2)

bit 15 bit 8

R/W-0 R/W-0 R/W-1 R/W-0 R/C-0 R-0 R/W-0 R/W-0

SATA(2) SATB(2) SATDW(2) ACCSAT(2) IPL3(3) SFA RND(2) IF(2)

bit 7 bit 0

图注:

R = 可读位 W = 可写位 U = 未实现位,读为 0

-n = POR 时的值 1 = 置 1 0 = 清零 x = 未知

bit 15-14 未实现:读为 0

bit 13-12 US<1:0>:DSP 乘法无符号 / 有符号控制位11 = 保留10 = DSP 引擎执行混合符号乘法运算01 = DSP 引擎执行无符号乘法运算 00 = DSP 引擎执行有符号乘法运算

bit 11 EDT:DO循环提前终止控制位 (1)

1 = 在当前循环迭代结束时终止执行 DO循环0 = 无影响

bit 10-8 DL<2:0>:DO循环嵌套层级状态位111 = 正在进行 7 层 DO循环嵌套

001 = 正在进行 1 层 DO循环嵌套000 = 正在进行 0 层 DO循环嵌套

bit 7 SATA: ACCA 饱和使能位1 = 使能累加器 A 饱和0 = 禁止累加器 A 饱和

bit 6 SATB: ACCB 饱和使能位1 = 使能累加器 B 饱和0 = 禁止累加器 B 饱和

bit 5 SATDW: DSP 引擎的数据空间写饱和使能位1 = 使能数据空间写饱和0 = 禁止数据空间写饱和

bit 4 ACCSAT: 累加器饱和模式选择位1 = 9.31 饱和(超饱和)0 = 1.31 饱和(正常饱和)

bit 3 IPL3:CPU 中断优先级状态位 3(3)

1 = CPU 中断优先级大于 70 = CPU 中断优先级等于或小于 7

注 1:该位总是读为 0。

2:这些位仅在 dsPIC33E 器件中存在。关于可用性,请参见具体器件的数据手册。

3: IPL3 位与 IPL<2:0> 位 (SR<7:5>)组合形成 CPU 中断优先级。

DS70359B_CN 第 2-16 页 © 2011 Microchip Technology Inc.

Page 17: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

bit 2 SFA: 堆栈帧有效状态位1 = 堆栈帧有效。无论 DSRPAG 和 DSWPAG 值如何, W14 和 W15 都寻址 0x0000 至 0xFFFF0 = 堆栈帧无效。 W14 和 W15 寻址 EDS 或基本数据空间

bit 1 RND:舍入模式选择位

1 = 使能有偏(常规)舍入0 = 使能无偏(收敛)舍入

bit 0 IF: 整数或小数乘法器模式选择位1 = 使能 DSP 乘法运算的整数模式0 = 使能 DSP 乘法运算的小数模式

寄存器 2-2: CORCON:内核控制寄存器(续)

注 1:该位总是读为 0。

2:这些位仅在 dsPIC33E 器件中存在。关于可用性,请参见具体器件的数据手册。

3: IPL3 位与 IPL<2:0> 位(SR<7:5>)组合形成 CPU 中断优先级。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-17 页

Page 18: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.4.3 其他 dsPIC33E/PIC24E CPU 控制寄存器

以下寄存器也与 dsPIC33E/PIC24E CPU 有关,但会在《dsPIC33E/PIC24E 系列参考手册》的其他章节中对这些寄存器进行更详细的说明。

• TBLPAG:表页寄存器

TBLPAG 寄存器用于在表读和表写操作过程中保存程序存储器地址的高 8 位。表指令用于在程序存储空间和数据存储空间之间传输数据。更多详细信息,请参见第 4 章“程序存储器”(DS70613)。

• DSRPAG:扩展数据空间读页寄存器

10 位 DSRPAG 寄存器将 X 数据空间读访问地址空间扩展为总共 32 MB。 DSRPAG 页值介于 0x001 和 0x1FF 之间时,读操作将访问称为扩展数据空间(Extended Data Space,EDS)的 16 MB 地址空间。 DSRPAG 页值介于 0x200 和 0x2FF 之间时,读操作将访问 8 MB 的PSV 地址空间(因为 低有效字(least significant word, lsw)是只读的)。 DSRPAG 页值介于 0x300 和 0x3FF 之间时,将重复 8 MB 的 PSV 地址空间,但允许用户读取每个 PSV地址的 高有效字节。关于 DSRPAG 寄存器的更多详细信息,请参见第 3 章“数据存储器”(DS70595)。

• DSWPAG:扩展数据空间写页寄存器

9 位 DSWPAG 寄存器将数据空间写访问空间扩展至 16 MB (不允许写入 PSV 空间)。DSWPAG 页值介于 0x01 和 0x1FF 之间时,写操作将访问 EDS。关于 DSWPAG 寄存器的更多详细信息,请参见第 3 章 “数据存储器”(DS70595)。

• MODCON:模控制寄存器

MODCON 寄存器用于使能和配置模寻址(循环缓冲区)。关于模寻址的更多详细信息,请参见第 3 章 “数据存储器”(DS70595)。

• XMODSRT 和 XMODEND:X 模起始和结束地址寄存器

XMODSRT 和 XMODEND 寄存器保存在 X 数据存储器地址空间中实现的模(循环)缓冲区的起始和结束地址。关于模寻址的更多详细信息,请参见第3章“数据存储器”(DS70595)。

• YMODSRT 和 YMODEND:Y 模起始和结束地址寄存器

YMODSRT 和 YMODEND 寄存器保存在 Y 数据存储器地址空间中实现的模(循环)缓冲区的起始和结束地址。关于模寻址的更多详细信息,请参见第3章“数据存储器”(DS70595)。

• XBREV:X 模位反转寄存器

XBREV 寄存器设置用于位反转寻址的缓冲区大小。关于位反转寻址的更多详细信息,请参见第 3 章 “数据存储器”(DS70595)。

• DISICNT:禁止中断计数寄存器

DISI指令使用DISICNT寄存器将优先级为1-6的中断在指定的几个周期内禁止。更多信息,请参见第 6 章 “中断”(DS70600)。

DS70359B_CN 第 2-18 页 © 2011 Microchip Technology Inc.

Page 19: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.5 算术逻辑单元(ALU)

dsPIC33E/PIC24E ALU 为 16 位宽,并能进行加法、减法、单个位移位和逻辑运算。除非另外声明,算术运算一般采用二进制补码方式进行。根据不同的运算,ALU 可能会影响 SR 寄存器中以下位的值:

• 进位标志位(C)

• 全零标志位(Z)

• 负标志位(N)

• 溢出标志位(OV)

• 半进位标志位(DC)

在减法运算中, C 和 DC 状态位分别作为借位位和半借位位。

根据所使用的指令模式,ALU 可执行 8 位或 16 位运算。根据指令的寻址模式,ALU 运算的数据可以来自 W 寄存器阵列或数据存储器。同样,ALU 的输出数据可被写入 W 寄存器阵列或数据存储单元。

关于受各指令、寻址模式和 8 位 /16 位指令模式影响的 SR 位的信息,请参见《16 位 MCU 和 DSC程序员参考手册》(DS70157E_CN)。

2.5.1 字节到字的转换

dsPIC33E/PIC24E 具有两条在混合执行 8 位和 16 位 ALU 运算时很有用的指令。

• 符号扩展(SE)指令,该指令可以从 W 寄存器或数据存储器获取字节值,并产生经过符号扩展的字值,存储到 W 寄存器中。

• 零扩展(ZE)指令,该指令可以将 W 寄存器或数据存储器中字值的高 8 位清零,并将结果放入目标 W 寄存器中。

注 1:字节操作使用 16 位 ALU,并可能产生超过 8 位的结果。但是,如果要保持与 PICMCU 器件的向后兼容性,所有字节操作的 ALU 结果必须被写回为一个字节 (即,不修改 MSB),并且只根据结果 LSB 的状态更新 SR 寄存器。

2:字节模式中执行的所有寄存器指令只会影响 W 寄存器的 LSB。可以使用访问 W 寄存器的存储器映射内容的文件寄存器指令修改任何 W 寄存器的 MSB。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-19 页

Page 20: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.6 DSP 引擎

DSP 引擎是一个硬件模块,它的输入数据来自 W 寄存器阵列,但具有自己的专用结果寄存器。DSP 引擎由与 MCU ALU 相同的指令译码器驱动。此外,所有操作数的 EA 都在 W 寄存器阵列中产生。 DSP 引擎的工作不能与 MCU 指令流同时进行,虽然 MCU ALU 和 DSP 引擎资源可以由指令集中的所有指令共用。

DSP 引擎由以下组件组成:

• 高速 17 位 x 17 位乘法器

• 桶形移位寄存器

• 40 位加法器 / 减法器

• 两个目标累加器寄存器

• 舍入逻辑(具有可选的模式)

• 饱和逻辑(具有可选的模式)

DSP 引擎的数据输入来自于以下来源:

• 对于双源操作数 DSP 指令,直接来自 W 阵列 (寄存器 W4、 W5、 W6 或 W7)。 W4、W5、 W6 和 W7 寄存器的数据值通过 X 和 Y 存储区数据总线预取

• 对于所有其他 DSP 指令,来自 X 存储区数据总线

DSP 引擎的数据输出写入以下目标之一:

• 由所执行的 DSP 指令定义的目标累加器

• 到数据存储器地址空间中任意单元的 X 存储区数据总线

DSP 引擎能执行固有、不需要其他数据的累加器 - 累加器操作。

MCU 移位和乘法指令使用 DSP 引擎硬件来获取它们的结果。在这些操作中,X 存储区数据总线用于数据读取和写入。

图 2-8 给出了 DSP 引擎的框图。

注: 关于与本节相关的详细代码示例和指令语法,请参见 《16 位 MCU 和 DSC 程序员参考手册》(DS70157E_CN)。

DS70359B_CN 第 2-20 页 © 2011 Microchip Technology Inc.

Page 21: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

图 2-8: DSP 引擎框图

补零

符号扩展

桶形

移位

40 位累加器 A

40 位累加器 B

舍入逻

X数

据总

线

至 / 来自 W 阵列

加法器

饱和

取补

32

3232

16

16 16

16

4040

40 40Y数

据总

线

40

16

40

乘法器 / 定标器

17 位 x 17 位

16 位至 17 位

转换

饱和逻

寄存器

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-21 页

Page 22: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.6.1 数据累加器 (仅限 dsPIC33E 器件)

两个 40 位数据累加器 ACCA 和 ACCB 是表 2-3 中列出的 DSP 指令的结果寄存器。每个累加器通过存储器映射到以下 3 个寄存器,其中的 “x”表示特定的累加器:

• ACCxL:ACCx<15:0>

• ACCxH:ACCx<31:16>

• ACCxU:ACCx<39:32>

对于使用累加器的小数运算,小数点位于 bit 31 右侧。可在每个累加器中存储的小数值的范围为-256.0 至 (256.0 – 2-31)。 对于使用累加器的整数运算,小数点位于 bit 0 右侧。可在每个累加器中存储的整数值的范围为-549,755,813,888 至 549,755,813,887。

2.6.2 乘法器

dsPIC33E/PIC24E 具有一个由 MCU ALU 和 DSP 引擎共用的 17 位 x 17 位乘法器。该乘法器可以执行有符号、无符号或混合符号运算,并支持 1.31 小数 (Q.31)或 32 位整数结果。

乘法器接受 16 位输入数据,并会将数据转换为 17 位。乘法器的有符号操作数会进行符号扩展。无符号输入操作数则进行零扩展。因为数据在乘法器内部使用 17 位表示,所以可以正确地执行混合符号和无符号的 16 位 x 16 位乘法运算。

对于整数和小数乘法器模式,数据在硬件中的表示方式如下:

• 整型数据的固有表示形式为有符号的二进制补码值,其中 高有效位 (Most Significant bit, MSb)定义为符号位。一般来说, N 位二进制补码整数的范围为 -2N-1 至 2N-1 – 1。

• 小数数据表示为二进制补码小数,其中 MSb 定义为符号位,小数点暗含在符号位之后(Q.X 格式)。暗含小数点的 N 位二进制补码小数的范围为 -1.0 至(1 – 21-N)。

表 2-2 列出了整数和小数模式下的数据范围。图 2-9 和图 2-10 说明了乘法器硬件在整数和小数模式下是如何解释数据的。

整数或小数乘法器模式选择(IF)位(CORCON<0>)决定表 2-3 中列出的指令的整数 / 小数运算。IF 位不会影响表 2-4 中列出的 MCU 乘法指令,这些指令总是执行整数运算。对于小数运算,乘法器会将结果向左换算一位。结果的 LSb 总是清零。在器件复位时,对于 DSP 运算,乘法器默认设为小数模式。

表 2-2: dsPIC33E/PIC24E 数据范围

寄存器长度 整数范围 小数范围 小数分辨率

16 位 -32768 至 32767

-1.0 至 (1.0 – 2-15)(Q.15 格式)

3.052 x 10-5

32 位 -2,147,483,648 至 2,147,483,647

-1.0 至 (1.0 – 2-31)(Q.31 格式)

4.657 x 10-10

40 位 -549,755,813,888 至 549,755,813,887

-256.0 至 (256.0 – 2-31)(带有 8 个警戒位的 Q.31 格式)

4.657 x 10-10

DS70359B_CN 第 2-22 页 © 2011 Microchip Technology Inc.

Page 23: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

图 2-9: 0x4001 的整数和小数表示

图 2-10: 0xC002 的整数和小数表示

0x4001 的不同表示

整数 :

-215 214 213 212 . . . .

0x4001 = 214 + 20 = 16385

1.15 小数 :

2-15

0

2-1 2-2 2-3 . . . . -20

20

0x4001 = 2-1 + 2-15 = 0.500030518

暗含小数点

.

1 10 0 0 0 0 0 0 0 0 0 0 0 0

0 1 10 0 0 0 0 0 0 0 0 0 0 0 0

0xC002 的不同表示

整数 :

-215 214 213 212 . . . .

0xC002 = -215 + 214 + 20 = -32768 + 16384 + 2 = -16382

1.15 小数 :

2-15 . 2-1 2-2 2-3 . . . .-20

20

0xC002 = -20 + 2-1 + 2-14 = -1 + 0.5 + 0.000061035 = -0.499938965

暗含小数点

1 1 00 0 0 0 0 0 0 0 0 0 0 0 1

1 1 00 0 0 0 0 0 0 0 0 0 0 0 1

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-23 页

Page 24: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.6.2.1 DSP 乘法指令 (仅限 dsPIC33E 器件)

表 2-3 中汇总了使用乘法器的 DSP 指令。

表 2-3: 使用乘法器的 DSP 指令

DSP 乘法器无符号 / 有符号控制(US)位(CORCON<13:12>)决定 DSP 乘法指令是执行有符号(默认)、无符号还是混合符号运算。US 位不会影响 MCU 乘法指令,具有用于有符号或无符号运算的 MCU 乘法指令。如果 US 位设置为 01,则表 2-3 中列出的指令的输入操作数会被视为无符号值,无符号值总是进行零扩展,扩展到乘法器值的第 17 位。如果 US 位设置为 00,则操作数会进行符号扩展。

如果 US 位(CORCON<13:12>)设置为 10,则以上所列指令的操作数将根据 W 寄存器源而视为有符号或无符号值。如果 W 寄存器源为奇编号(W5 或 W7),则认为操作数为有符号。如果W 寄存器源为偶编号,则认为操作数为无符号。在使用累加器(它总是有符号)进行任何运算之前,如果有一个操作数为有符号或两个操作数均为有符号,则会对结果进行符号扩展,否则对它进行零扩展。

2.6.2.2 MCU 乘法指令

同一个乘法器还支持包括 16 位有符号、无符号和混合符号整数乘法的 MCU 乘法指令,如表 2-4中所示。由 MUL指令执行的所有乘法运算均产生整数结果。MUL指令可以使用字节或字长度的操作数。字节输入操作数将产生 16 位结果,而字输入操作数将产生 16 位结果或 32 位结果,结果存放在 W 阵列的指定寄存器中或累加器中。

表 2-4: 使用乘法器的 MCU 指令

DSP 指令 说明 等价代数表达式

MAC 相乘并与累加器相加,或者平方并与累加器相加

a = a + b * ca = a + b2

MSC 相乘再从累加器中减去 a = a – b * cMPY 相乘 a = b * cMPY.N 相乘并将结果取负 a = -b * cED 偏欧氏距离 a = (b – c)2

EDAC 将偏欧氏距离与累加器相加 a = a + (b – c)2

注 1: 使用乘法器的 DSP 指令可以工作于小数(1.15)或整数模式。

MCU 指令 说明

MUL/MUL.UU 将两个无符号整数相乘,产生 32 位结果。

MUL.SS 将两个有符号整数相乘,产生 32 位结果。

MUL.SU/MUL.US 将一个有符号整数与一个无符号整数相乘,产生 32 位结果。

MULW.UU 将两个无符号整数相乘,产生 16 位结果。

MULW.SS 将两个有符号整数相乘,产生 16 位结果。

MULW.SU/MULW.US 将一个有符号整数与一个无符号整数相乘,产生 16 位结果。

注 1: 使用乘法器的 MCU 指令只能工作于整数模式。

DS70359B_CN 第 2-24 页 © 2011 Microchip Technology Inc.

Page 25: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.6.3 数据累加器加法器 / 减法器

数据累加器具有一个 40 位加法器 / 减法器,该加法器 / 减法器带有用于乘法器结果的自动符号扩展逻辑(如果有符号)。它可以选择两个累加器(A 或 B)之一作为其累加前的源累加器和累加后的目标累加器。对于 ADD(累加器)和 LAC 指令,可选择通过桶形移位寄存器在累加之前将要累加或装入的数据进行换算。

40 位加法器 / 减法器可以选择将它的其中一个操作数输入取负,以更改结果的符号(不会改变操作数)。取负操作在相乘并相减 (MSC)或相乘并取负(MPY.N)运算期间使用。

40 位加法器 / 减法器有一个额外的饱和模块,如果使能,饱和模块将控制累加器的数据饱和。

2.6.3.1 累加器状态位

支持饱和与溢出的 6 个状态寄存器位位于 CPU 状态寄存器(SR)中,表 2-5 中列出了这些位:

表 2-5: 累加器溢出和饱和状态位

每次数据经过累加器加法 / 减法逻辑时,就会修改 OA 和 OB 位。置 1 时,它们指示 近的操作已溢出到累加器警戒位(bit 32 至 bit 39)。此类溢出不是灾难性溢出;警戒位会保留累加器数据。 OAB 状态位的值是 OA 和 OB 的逻辑或运算值。

在 OA 和 OB 位置 1 时,可以选择产生算术错误陷阱。使能该陷阱的方法是将中断控制器的中断控制寄存器 1 中相应的溢出陷阱允许位 OVATE 或 OVBTE(INTCON1<10> 或 <9>)置 1。通过陷阱事件,用户可以根据需要立即执行修正操作。

每次数据经过累加器饱和逻辑时,SA 和 SB 位可能置 1。置 1 之后,这两位会保持置 1,直到用户应用程序将其清零。SAB 状态位指示 SA 和 SB 的逻辑或运算值。置 1 时,这两位指示累加器已溢出其 大范围(对于 32 位饱和是 bit 31,而 40 位饱和是 bit 39),将发生饱和(如果饱和使能)。

未使能饱和时,SA 和 SB 位指示发生了灾难性溢出(累加器的符号被破坏)。如果灾难性溢出陷阱允许(COVTE)位(INTCON1<8>)置 1,当饱和被禁止时,SA 和 SB 位将产生算术错误陷阱。 SA 和 SB 位可以用软件置 1,从而使能高效的现场状态切换。关于算术警告陷阱的更多信息,请参见第 6 章 “中断”(DS70600)。

状态位 位置 说明

OA SR<15> 累加器 A 溢出到警戒位 (ACCA<39:32>)

OB SR<14> 累加器 B 溢出到警戒位 (ACCB<39:32>)

SA SR<13> ACCA 已饱和(bit 31 溢出并饱和)或ACCA 溢出到警戒位并饱和(bit 39 溢出并饱和)

SB SR<12> ACCB 已饱和(bit 31 溢出并饱和)或ACCB 溢出到警戒位并饱和(bit 39 溢出并饱和)

OAB SR<11> OA 和 OB 的逻辑或。清零 OAB 的同时也将清零 OA 和 OB。

SAB SR<10> SA 和 SB 的逻辑或。清零 SAB 的同时也将清零 SA 和 SB。

注: 根据累加器饱和是否使能,SA、SB 和 SAB 状态位具有不同的含义。累加器饱和模式通过 CORCON 寄存器进行控制。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-25 页

Page 26: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.6.3.2 饱和和溢出模式

dsPIC33E/PIC24E CPU 支持三种饱和和溢出模式。

• 累加器 bit 39 饱和:

在该模式下,饱和逻辑将 大的正 9.31 值(0x7FFFFFFFFF)或 小的负 9.31 值(0x8000000000)装入目标累加器。SA 或 SB 位置 1 并保持置 1 直到被用户应用程序清零。该饱和模式对于扩展累加器的动态范围非常有用。

要配置该饱和模式,需要将累加器饱和模式选择(ACCSAT)位(CORCON<4>)置 1。此外,需要将 ACCA 饱和使能(SATA)位(CORCON<7>)和 / 或 ACCB 饱和使能(SATB)位(CORCON< 6>)置 1,以使能累加器饱和。

• 累加器 bit 31 饱和:

在该模式下,饱和逻辑将 大的正 1.31 值(0x007FFFFFFF)或 小的负 1.31 值(0xFF80000000)装入目标累加器。SA 或 SB 位置 1 并保持置 1 直到被用户清零。当该饱和模式生效时,除了对于累加器值的符号扩展之外,将不使用警戒位 bit 32 至 bit 39。因此,SR 中的 OA、 OB 或 OAB 位永远不会置 1。

要配置该溢出和饱和模式,必须清零 ACCSAT (CORCON<4>)位。此外,必须将 SATA(CORCON<7>)和 / 或 SATB (CORCON<6>)位置 1,以使能累加器饱和。

• 累加器灾难性溢出:

如果 SATA (CORCON<7>)和 / 或 SATB (CORCON<6>)位未置 1,则不会对累加器执行任何饱和操作,并且允许累加器一直溢出到 bit 39 (破坏它的符号)。如果灾难性溢出陷阱允许(COVTE)位(中断控制器中的 INTCON1<8>)置 1,则灾难性溢出会产生算术错误陷阱。

只有执行通过 40 位 DSP ALU 修改两个累加器之一的 DSP 指令时,才会发生累加器饱和和溢出检测。通过 MCU 类指令将累加器作为存储器映射寄存器访问时,不会发生饱和和溢出检测。此外,表 2-5 中列出的累加器状态位不会被修改。但是,MCU 状态位(Z、N、C、OV 和 DC)会被修改,具体取决于访问累加器的 MCU 指令。关于算术错误陷阱的更多信息,请参见第 6 章“中断”(DS70600)。

2.6.3.3 数据空间写饱和

除了加法器 / 减法器饱和,对数据空间进行写操作也会饱和,而不会影响源累加器的内容。通过该功能可以对数据进行限制,同时不会损害累加器在中间计算阶段期间的动态范围。使能数据空间写饱和的方法是将 DSP 引擎对数据空间写饱和使能 (SATDW)控制位(CORCON<5>)置1。默认情况下,在器件复位时会使能数据空间写饱和。

数据空间写饱和功能与 SAC 和 SAC.R 指令配合工作。执行这些指令时,累加器中保存的值永远不会被修改。硬件通过执行以下步骤来获取饱和的写结果:

1. 根据指令中指定的算术移位值对读取数据进行换算。

2. 对换算数据进行舍入(仅对于 SAC.R)。

3. 根据警戒位的值将换算 / 舍入值饱和为 16 位结果。如果数据值大于 0x007FFF,则写入存储器的数据达到饱和,为 大的正 1.15 值 0x7FFF。如果输入数据小于 0xFF8000,则写入存储器的数据达到饱和,为 小的负 1.15 值 0x8000。

DS70359B_CN 第 2-26 页 © 2011 Microchip Technology Inc.

Page 27: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.6.3.4 累加器 “回写”

MAC 和 MSC 指令可以选择将非当前操作目标的累加器的舍入形式写入数据存储空间。通过 X 总线寻址组合的 X 和 Y 地址空间,执行回写操作。这种累加器回写功能对于某些算法 (例如 FFT和 LMS 滤波器)非常有用。

累加器回写硬件支持以下寻址模式:

• W13,寄存器直接寻址:

非目标累加器的舍入内容以 1.15 小数结果形式写入 W13。

• [W13]+ = 2,带后递增的寄存器间接寻址:

非目标累加器的舍入内容以 1.15 小数形式写入 W13 指向的地址。然后 W13 递增 2。

2.6.4 舍入逻辑 (仅限 dsPIC33E 器件)

舍入逻辑在累加器写 (存储)过程中执行常规的(有偏)或收敛的(无偏)舍入功能。舍入模式由舍入模式选择(RND)位(CORCON<1>)的状态决定。它会产生一个 16 位的 1.15 数据值,该值被送到数据空间写饱和逻辑。如果指令不指明舍入,则会存储一个截取的 1.15 数据值。

图 2-11 给出了两种舍入模式。常规舍入模式取累加器的 bit 15,对它进行零扩展,并将它与 高有效字(most significant word, msw)相加(不包括警戒或溢出位(bit 16 至 bit 31))。如果累加器的 低有效字(lsw)在 0x8000 和 0xFFFF 之间(包括 0x8000),则 msw 递增 1。如果累加器的 lsw 在 0x0000 和 0x7FFF 之间,则 msw 保持不变。此算法的结果是经过一系列随机舍入操作,值会稍稍偏大(正偏)。

除非 lsw 等于 0x8000,否则收敛的(或无偏)舍入操作方式与常规舍入相同。 lsw 等于 0x8000时,要对 msw 的 LSb (累加器的 bit 16)进行检测。如果它为 1, msw 递增 1。如果它为 0,msw 不变。假设 bit 16 本身是随机的,这样的机制将消除任何可能累加的舍入偏差。

通过 X 总线, SAC和 SAC.R指令将目标累加器内容的截取(SAC)或舍入(SAC.R)形式存储到数据存储器(这受数据饱和的影响)。更多信息,请参见第 2.6.3.3 节 “数据空间写饱和”。

对于 MAC类指令,累加器回写数据路径总是会受舍入模式影响。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-27 页

Page 28: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

图 2-11: 常规和收敛舍入模式

2.6.5 桶形移位寄存器 (仅限 dsPIC33E 器件)

桶形移位寄存器可在单个周期内将数据算术右移或左移 多 16 位。 DSP 或 MSU 指令可以使用桶形移位寄存器进行多位移位。

移位寄存器需要一个有符号二进制值,用来确定移位操作的幅度 (位数)和方向:

• 正值将操作数右移

• 负值将操作数左移

• 值为 0则不改变操作数

桶形移位寄存器的宽度为 40 位,以适应累加器的宽度。对于 DSP 移位操作,提供 40 位的输出结果;对于 MCU 移位操作,提供 16 位的结果。

表 2-6 汇总了使用桶形移位寄存器的指令。

表 2-6: 使用 DSP 引擎桶形移位寄存器的指令

2.6.6 DSP 引擎模式选择 (仅限 dsPIC33E 器件)

前面几节中讨论的 DSP 引擎的这些工作特性可以通过 CPU 内核配置寄存器(CORCON)进行选择:

• 小数或整数乘法运算

• 常规或收敛舍入

• ACCA 自动饱和使能 / 禁止

• ACCB 自动饱和使能 / 禁止

• 对于写数据存储器的自动饱和使能 / 禁止

• 累加器饱和模式选择

2.6.7 DSP 引擎陷阱事件 (仅限 dsPIC33E 器件)

为了处理 DSP 引擎中的异常,可以产生算术错误陷阱,它们通过中断控制寄存器(INTCON1)进行选择。它们是:

01516

01516

01516

01516

1000 0000 0000 00001XXX XXXX XXXX XXXX

0XXX XXXX XXXX XXXX 1000 0000 0000 0000

1

0

常规(有偏) 收敛(无偏)

以下情况时,进行上舍入(msw 加 1):

以下情况时,进行下舍入(不加任何值):

以下情况时,进行上舍入(msw 加 1):

1. lsw = 0x8000 且 bit 16 = 12. lsw > 0x8000

lsw >= 0x8000

lsw < 0x8000

以下情况时,进行下舍入(不加任何值):

1. lsw = 0x8000 且 bit 16 = 02. lsw < 0x8000

msw

msw

msw

msw

指令 说明

ASR 对数据存储单元进行算术多位右移。

LSR 对数据存储单元进行逻辑多位右移。

SL 对数据存储单元进行多位左移。

SAC 存储 DSP 累加器,并可选择进行移位。

SFTAC 移位 DSP 累加器。

DS70359B_CN 第 2-28 页 © 2011 Microchip Technology Inc.

Page 29: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

• ACCA 溢出陷阱允许,使用 OVATE (INTCON1<10>)

• ACCB 溢出陷阱允许,使用 OVBTE (INTCON1<9>)

• 灾难性 ACCA 和 / 或 ACCB 溢出陷阱允许,使用 COVTE (INTCON1<8>)

陷阱的产生通过以下错误状态位进行指示:

• OVAERR (INTCON1<14>)

• OVBERR (INTCON1<13>)

• COVAERR (INTCON1<12>)

• COVBERR (INTCON1<11>)

当用户应用程序尝试使用 SFTAC 指令将某个值移位为超出 大允许范围(±16 位)时,也会产生算术错误陷阱。该陷阱源不能被禁止,它通过移位累加器错误状态(SFTACERR)位 (中断控制器中的 INTCON1<7>)进行指示。该指令仍将执行,但移位的结果不会写入目标累加器。

关于 INTCON1 寄存器中各位和算术错误陷阱的更多信息,请参见第 6 章“中断”(DS70600)。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-29 页

Page 30: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.7 除法支持

dsPIC33E/PIC24E 支持以下类型的除法运算:

• DIVF:16/16 位有符号小数除法(仅限 dsPIC33E 器件)

• DIV.SD:32/16 位有符号除法

• DIV.UD:32/16 位无符号除法

• DIV.SW:16/16 位有符号除法

• DIV.UW:16/16 位无符号除法

所有除法指令的商都放在工作寄存器 W0 中,余数放在 W1 中。 16 位除数可以位于任意 W 寄存器中。 16 位被除数可以位于任意 W 寄存器中, 32 位被除数必须位于一对相邻的 W 寄存器中。

所有除法指令都是迭代运算,必须在 REPEAT循环内执行 18 次。开发人员需要负责编写 REPEAT指令。完整的除法运算需要 19 个指令周期来执行。

与任何其他 REPEAT循环一样,除法流可以被中断。在循环的每次迭代之后,所有数据存储到相应的数据寄存器中,因此用户应用程序需要负责在 ISR 中保存相应的 W 寄存器。虽然 W 寄存器中的中间值对于除法硬件非常重要,但它们对于用户应用程序没有任何意义。除法指令必须在REPEAT循环中执行 18 次,以产生有意义的结果。

被零除错误会产生数学错误陷阱。该条件通过数学错误状态 (DIV0ERR)位 (中断控制器中的INTCON1<6>)进行指示。

关于除法指令的更多信息和编程示例,请参见《16 位 MCU 和 DSC 程序员参考手册》(DS70157E_CN)。

DS70359B_CN 第 2-30 页 © 2011 Microchip Technology Inc.

Page 31: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.8 指令流类型

dsPIC33E/PIC24E架构中的大多数指令占用程序存储器的一个字并在单个周期内执行。指令预取机制方便了单周期(1 TCY)执行。但是,某些指令的执行需要 2 个或更多个指令周期。因此,dsPIC® DSC 架构中有 7 种不同类型的指令流。本节将对这些指令流进行说明。

2.8.1 1 个指令字, 1 个指令周期

执行这些指令需要一个指令周期,如图 2-12 所示。大多数指令是单字单周期指令。

图 2-12: 指令流——单字单周期

2.8.2 1 个指令字, 2 个指令周期

在这些指令中,没有预取清除。这一类型的指令只有 MOV.D指令 (装入和存储双字)、 SFR 读取和 SFR 位操作。完成这些指令需要两个周期,如图 2-13 所示。

图 2-13: 指令流——单字双周期(MOV.D操作)

2.8.3 1 个指令字, 2 或 4 个指令周期 (程序流改变)

这些指令包括相对调用和跳转指令。当指令改变 PC (除了递增以外)时,程序存储器预取数据必须被丢弃。这使指令执行需要 4 个有效周期,如图 2-14 所示。

图 2-14: 指令流(程序流改变)

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6

1. MOV #0x55AA,W0 取指 1 执行 1

2. MOV W0,PORTA 取指 2 执行 2

3. MOV W0,PORTB 取指 3 执行 3

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6 TCY7 TCY8

1. MOV #0x1234,W2 取指 1 执行 1

取指 2 执行 2R/W 周期 1

2. MOV.D [W0++],W4 执行 2R/W 周期 2

3. MOV #0x00AA,W1 取指 3 不取指 执行 3

4. MOV #0x00CC,W0 取指 4 不取指 执行 4

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6 TCY7 TCY8 TCY9

1. ADD.B PORTA 取指 1 执行 1

2. BRA SUB_1 取指 2 执行 2

3. ADD.B PORTB 取指 3 清除

4. CLR W0 取指 4 清除

5. SUB_1:Instruction@ address SUB_1

取指 5 执行 5

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-31 页

Page 32: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.8.4 表读 / 写指令

这些指令将暂停取指令,向程序存储器中插入读或写周期。执行表操作时所取的指令将被保存一个周期,在紧接该表操作的下一个周期执行,如图 2-15 所示。

图 2-15: 指令流(表操作)

2.8.5 2 个指令字, 4 个指令周期——GOTO 或 CALL

在这些指令中,指令后的取指包含数据。这会产生一条 4 周期指令,如图 2-16 所示。如果 CPU只取了双字指令的第 2 个字而未取第 1 个字,则第 2 个字将被编码以作为 NOP执行。这在双字指令被跳过指令跳过时很重要(见图 2-16)。

图 2-16: 指令流(GOTO 或 CALL)

2.8.6 2 个指令字, 2 个指令周期——DO

在该指令中,指令之后取指操作中包含一个地址偏移量。该地址偏移量将与第一个指令地址相加,以生成 后的循环指令地址。

图 2-17: 指令流(DO)

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6 TCY7 TCY8 TCY9 TCY10

1. MOV #0x1234,W2 取指 1 执行 1

2. TBLRDL.w[W0++], W1 取指 2 执行 2

3. MOV #0x00AA,W1 取指 3 执行 3

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6 TCY7 TCY8 TCY9

1. MOV #0x55AA,W0 取指 1 执行 1

2. GOTO LABEL 取指 2a 执行 2

取指 2b

3. MOV #0x1111,W2 取指 3 清除

4. LABEL:Inst. @ address 取指 4 执行 4

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6 TCY7 TCY8

1. MOV W0,W1 取指 1 执行 1

2. DO #COUNT, OFFSET 取指 2a 执行 2

取指 2b

3. First Inst. of loop 取指 3 执行 3

DS70359B_CN 第 2-32 页 © 2011 Microchip Technology Inc.

Page 33: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.8.7 地址寄存器相依性

由于 X 数据空间的读写操作之间存在数据地址的相依性,这些指令会遭遇停顿。为了解决这种资源冲突,插入了一个额外的周期,这在第 2.10 节 “地址寄存器相依性”中进行了讨论。

图 2-18: 指令流水线流程——单字单周期(带指令停顿)

2.8.8 中断处理

关于中断处理的指令流水线流程的详细信息,请参见第 6 章 “中断”(DS70600)。

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6 TCY7

1. MOV W0,W1 取指 1 执行 1

2. MOV [W1],W4 取指 2 执行 2

3. MOV W4, LATB 取指 3 停顿 执行 3

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-33 页

Page 34: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.9 循环结构

dsPIC33E/PIC24E 支持 REPEAT和 DO指令结构,以提供无条件自动程序循环控制。REPEAT指令用于实现单指令程序循环。DO指令用于实现多指令程序循环。这两条指令使用 CPU 状态寄存器(SR)内的控制位来临时修改 CPU 操作。

2.9.1 REPEAT循环结构

REPEAT指令会使紧随其后的指令重复执行指定次数。可以使用指令中包含的立即数值或某个 W寄存器中的值来指定 REPEAT计数值。 W 寄存器选项可使循环计数为软件变量。

REPEAT循环中的指令至少执行一次。REPEAT循环的迭代次数是 15 位立即数值 + 1 或 Wn + 1。

REPEAT指令的两种语法形式如下所示:

REPEAT #lit15 ; RCOUNT <-- lit15(有效目标指令)

REPEAT Wn ; RCOUNT <-- Wn(有效目标指令)

2.9.1.1 REPEAT操作

REPEAT操作的循环计数保存在 16 位 REPEAT 循环计数器寄存器(RCOUNT)中,该寄存器是存储器映射的。 RCOUNT 由 REPEAT 指令初始化。如果 RCOUNT 为非零值, REPEAT 指令将REPEAT循环活动(RA)状态位 (SR<4>)设置为 1。

RA 是只读位,不能用软件修改。REPEAT循环计数值大于 0时,程序计数器不会递增。而且,程序计数器递增被禁止直到 RCOUNT = 0。关于 REPEAT循环的指令流示例,请参见图 2-19。

对于等于 0的循环计数值,REPEAT的作用相当于 NOP,并且 RA(SR<4>)位不置 1。REPEAT循环在开始执行前实际上是被禁止的,这样可以在预取后续指令时(即在正常的执行流中)让目标指令只执行一次。

图 2-19: REPEAT指令流水线流程

注: 紧随 REPEAT指令之后的指令(即目标指令)总是至少执行一次,该指令的执行次数总是会比 15 位立即数或 W 寄存器操作数指定的值多一次。

TCY0 TCY1 TCY2 TCY3 TCY4 TCY5 TCY6 TCY7 TCY8 TCY9 TCY10

1. REPEAT #0x2 取指 1 执行 1

2. MAC W4*W5,A,[W8]+=2,W4 取指 2 执行 2

3. BSET PORTA,#3 执行 2

执行 2

取指 3 执行 3

PC(指令结束时) PC PC+2 PC+2 PC+2 PC+4 PC+4 PC+4

RCOUNT(指令结束时) X 2 1 0 0 0 0

RA(指令结束时) 0 1 1 0 0 0 0

注: 重复相同指令产生的结果是,由于闪存延时的原因,即使所重复指令执行的是 PSV读操作,第一次和 后一次迭代也分别需要 5 个 TCY 和 6 个 TCY。所有其他迭代的有效吞吐量则为每周期一条指令。但是,这种数据流水线仅限于某些寻址模式:后递增或后递减 1 或 2。

DS70359B_CN 第 2-34 页 © 2011 Microchip Technology Inc.

Page 35: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.9.1.2 中断 REPEAT循环

REPEAT指令循环可在任何时候被中断。

在异常处理期间, RA 位的状态保存在堆栈中以便让用户应用程序在任何数量的嵌套中断中进一步执行更多的 REPEAT循环。SRL 压入堆栈后,RA 状态位被清零以便从 ISR 内部恢复正常执行流程。

使用 RETFIE指令从 ISR 返回 REPEAT循环不需要任何特殊处理。中断会在 RETFIE指令的第 5 个周期预取要重复的指令。当 SRL 寄存器被弹出堆栈时,压入堆栈的 RA 位将会恢复,此时如果它置1,那么中断的 REPEAT循环将会恢复。

2.9.1.2.1 REPEAT循环的提前终止

通过用软件将 RCOUNT 寄存器清零,可以在 ISR 中比正常情况提前终止中断的 REPEAT循环。

2.9.1.3 REPEAT指令的限制

除了以下指令外,任何其他指令均可紧随 REPEAT之后:

• 程序流控制指令(任何跳转、比较和跳过、子程序调用以及返回等指令)

• 另一条 REPEAT或 DO指令

• DISI、 ULNK、 LNK、 PWRSAV或 RESET指令

• MOV.D指令

2.9.2 DO循环结构 (仅限 dsPIC33E 器件)

DO指令可以对其后跟随的一组指令执行指定的次数,无需软件开销。直到结束地址并包含结束地址在内的一组指令会被重复执行。DO指令的重复计数值可以通过一个 15 位立即数值 + 1 或通过在指令中声明的 W 寄存器的内容 + 1 进行指定。

DO指令的 15 位立即数形式的语法如下所示:

DO #lit15,LOOP_END ; DCOUNT <-- lit15Instruction1Instruction2

::

LOOP_END: Instruction n

DO指令的 W 寄存器声明形式的语法如下所示:

DO Wn,LOOP_END ; DCOUNT <-- Wn<15:0>Instruction1

Instruction2::

LOOP_END: Instruction n

注: 如果 REPEAT 循环被中断且正在处理 ISR,则用户应用程序在 ISR 内部执行另一条REPEAT指令前,必须先将 REPEAT 计数寄存器 (RCOUNT)压入堆栈。如果在 ISR 内部使用 REPEAT指令,则用户应用程序在执行 RETFIE指令前必须先将 RCOUNT 寄存器的值弹出堆栈。

注: 一些指令和 / 或指令寻址模式可以在 REPEAT 循环内执行,但不一定重复执行所有指令都有意义。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-35 页

Page 36: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

DO循环结构具有以下特性:

• DO循环的第一条指令不能为 PSV 读或表读

• 可以使用 W 寄存器来指定循环计数,从而可以在运行时定义循环计数

• 指令执行顺序不必是顺序的(即,可以存在跳转和子程序调用等)

• 循环结束地址不必大于起始地址

2.9.2.1 DO循环寄存器和操作

DO循环执行的迭代数为 15 位立即数值 + 1,或者是 Wn 值 + 1。如果使用 W 寄存器来指定迭代数,则高 2 位不用于指定循环计数。DO循环的操作类似于 C 编程语言中的 DO-WHILE结构,因为循环中的指令总是至少执行一次。

dsPIC33E/PIC24E 具有 3 个与 DO循环相关的寄存器:

• DO循环起始地址(DOSTART)寄存器用于保存 DO循环的起始地址。它是一个 22 位寄存器。

• DO循环结束地址(DOEND)寄存器用于保存 DO循环的结束地址。它是一个 22 位寄存器。

• DO循环计数器(DCOUNT)寄存器用于保存要由循环执行的迭代数。它是一个 16 位寄存器。

这些寄存器是存储器映射的,并在执行 DO指令时由硬件自动装入。这些寄存器的 MSb 和 LSb 固定为 0。 LSb 不存储在这些寄存器中,因为 PC<0> 总是强制为 0。

DO循环活动(DA)状态位(SR<9>)指示单个 DO循环(或嵌套的 DO循环)正处于有效状态。执行 DO指令时,DA 位会置 1,这将允许在每个后续指令周期将 PC 地址与 DOEND 寄存器进行比较。当 PC 与 DOEND 中的值匹配时, DCOUNT 递减 1。

如果 DCOUNT 寄存器不为零,则 PC 中会装入 DOSTART 寄存器中包含的地址,以启动 DO 循环的另一次迭代。当 DCOUNT 变为零时, DO循环终止。

如果没有任何其他嵌套 DO循环正在进行,则 DA 位也会清零。 DO循环可以在任意时刻被中断。

2.9.2.2 DO循环嵌套

DOSTART、DOEND 和 DCOUNT 寄存器各具有关联的硬件堆栈,使 DO循环硬件可以支持 多3 层嵌套。

DO循环嵌套层级(DL<2:0>)状态位(CORCON<10:8>)指示当前正在执行的 DO循环的嵌套层级。执行第一条 DO指令时,DL<2:0> 会设置为 ‘b001,指示正在执行一层 DO循环。DO循环活动(DA)位 (SR<9>)也将置 1。

当执行第一个 DO循环中的另一条 DO指令时,在 DOSTART、DOEND 和 DCOUNT 寄存器更新为新的循环值之前,它们的值会被传送到 DO 堆栈中。DL<2:0> 位会设置为 ‘b010,指示正在执行第二个、嵌套的 DO循环。 DA(SR<9>)位也会保持置 1。对于后续的嵌套 DO循环将会重复这一操作。

当 DO循环终止时,会自动从 DO 堆栈中恢复 DOSTART、 DOEND 和 DCOUNT 寄存器。

注: DO循环结构中的指令组总是至少执行一次。 DO循环的执行次数总是比立即数或 W寄存器操作数中指定的值多一次。

注: DL<2:0> (CORCON<10:8>)位组合 (逻辑或运算)构成 DA (SR<9>)位。如果正在执行嵌套的 DO循环,则只有与 外层循环关联的循环计数结束时 DA 位才会清零。

DS70359B_CN 第 2-36 页 © 2011 Microchip Technology Inc.

Page 37: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.9.2.3 DO 堆栈

DO 堆栈用于在遇到另一个 DO循环(即,嵌套 DO循环)时保存与正在进行的 DO循环相关联的以下元素。

• DOSTART 寄存器值

• DOEND 寄存器值

• DCOUNT 寄存器值

• 第一条循环指令

• 第二条循环指令,或第一条循环指令的第二个字 (如果它是一条双字指令)

请注意, DO 嵌套层级状态位域(DL<2:0>)也可用作指针来寻址 DO 堆栈。执行 DO 之后,DL<2:0> 会指向下一个可用堆栈单元。

第一条 DO指令在执行时不使用堆栈(实际上不填充堆栈)。后续 DO指令会开始填充 DO 堆栈,直到填充了 3 个堆栈单元为止。此时,在执行 后一条 DO指令之后,DL<2:0> = 4,指示正在执行第一条 DO循环加上 3 个嵌套 DO循环。此时将无法嵌套更多的 DO循环。

如果用户尝试在 DL<2:0> = 4 时另外嵌套一个 DO循环(在指令开始处 ,在 DO 嵌套层级递增之前), DO 堆栈溢出位 DO_OVR (INTCON3<4>)将置 1,并且会产生通用软陷阱。

图 2-20 给出了 DO 堆栈的概念表示图。

图 2-20: DO 堆栈概念图

2.9.2.4 DO循环的提前终止

有两种方式可以早于正常情况而提前终止 DO循环:

• 通过 DO循环提前终止控制(EDT)位(CORCON<11>),用户应用程序可以在 DO循环完成所有循环之前终止循环。向 EDT 位写入 1可以强制循环完成正在进行的迭代,然后终止。如果在循环的倒数第二条指令或 后一条指令期间 EDT 置 1,则会再执行一次循环的迭代。EDT 总是读为 0;将它清零不起任何作用。在 EDT 位置 1 之后,用户可以选择跳出DO循环。

• 或者,代码可以从除 后两条指令之外的任何其他点跳出循环 ( 后两条指令不能是流控制指令)。虽然 DA (SR<9>)位使能 DO循环硬件,但除非在指令预取期间遇到倒数第二条指令的地址,否则它不起任何作用。建议不要使用这种方法来终止 DO循环。

DCOUNTDOENDDOSTARTDL<2:0>

嵌套层级 3 寄存器

000

001

010

011

100

嵌套层级 1 操作

嵌套层级 2 寄存器

嵌套层级 1 寄存器

嵌套层级 2 操作

嵌套层级 3 操作

嵌套层级 4 操作

循环中偶指令操作循环中奇指令操作

注 1: 对于 DO 寄存器单元, DL<2:0> 代表在执行 DO 堆栈之前的值。

2: 对于 DO 指令缓冲区单元, DL<2:0> 代表在执行 DO 堆栈之后的值。

3: 如果 DL<2:0> = 0,则表示不存在任何处于有效状态的 DO 循环 (DA = 0)。

注: 建议不要在不使用EDT的情况下退出DO循环,因为硬件将会继续检查DOEND地址。

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-37 页

Page 38: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.9.2.5 DO循环的限制

使用 DO循环存在一些限制,例如:

• 何时可以读取 DOEND 寄存器

• 禁止将某些指令用作循环的 后两条指令

• 某些小循环长度是不允许的(循环长度指在循环中重复执行的指令块的长度)

2.9.2.5.1 DOEND 寄存器的限制

所有 DO 循环都必须至少包含两条指令,因为循环终止测试是在倒数第二条指令处执行。对于只包含一条指令的循环,应使用 REPEAT。

在紧随 DO指令或对 DOEND SFR 的文件寄存器写操作之后的指令中,用户软件不能读取特殊功能寄存器 DOEND。

DO循环中倒数第二条指令之前的指令不应修改:

• 由 CPU 中断优先级 (IPL)状态位 (SR<7:5>)控制的 CPU 优先级

• 由中断允许控制寄存器 IECn 控制的外设中断允许位

• 由中断优先级控制寄存器 IPCn 控制的外设中断优先级位

如果未遵循这些限制, DO循环可能无法正确执行。

2.9.2.5.2 第一条指令的限制

PSV 或表读不能为循环中的第一条指令。

2.9.2.5.3 后两条指令的限制

DO循环的 后两条指令不应为以下任一指令:

• 流控制指令(例如,任何跳转、比较和跳过、 GOTO、 CALL、 RCALL以及 TRAP指令)

• 另一条 REPEAT或 DO指令

• REPEAT循环中的目标指令。该限制意味着倒数第二条指令也不能为 REPEAT• 在程序空间中占用两个字的任何指令

• DISI指令

RETURN、 RETFIE和 RETLW可以作为 DO循环的 后两条指令之一正确工作,但用户应用程序需要负责返回到循环来完成循环。

2.9.2.5.4 循环长度限制

循环长度定义为 DO 循环中 后一条指令相对于第一条指令的有符号偏移。循环长度与循环中第一条指令的地址相加时,就会构成循环 后一条指令的地址。例如,循环长度为 1 意味着循环是一个单指令循环。循环长度不得为 -1、 0 或 1。

DS70359B_CN 第 2-38 页 © 2011 Microchip Technology Inc.

Page 39: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.10 地址寄存器相依性

dsPIC33E/PIC24E 架构支持大多数 MCU 类指令的数据空间读 (源)和数据空间写(目标)操作。AGU 进行的 EA 计算和后续数据空间读或写,每个操作都需要一个指令周期来完成。该时序导致每条指令的数据空间读和写操作部分重叠,如图 2-21 所示。由于这一重叠,“先写后读”(Read-After-Write,RAW)数据相依性可能会在指令边界处发生。RAW 数据相依性在运行时由dsPIC33E/PIC24E CPU 检测并处理。

图 2-21: 数据空间访问时序

2.10.1 先写后读相依性规则

如果 W 寄存器在当前指令中被用作写操作目标寄存器,并且所预取到指令读取的也是同一个 W寄存器,则适用以下规则:

• 如果对目标寄存器的写入(当前指令)不修改 Wn 的内容,则不发生停顿。

• 如果对源寄存器的读取(预取指令)不使用 Wn 计算 EA,则不发生停顿。

在每个指令周期中,dsPIC33E/PIC24E 硬件会自动检查以确定是否将发生 RAW 数据相依性。如果不满足上述条件,CPU 会在执行预取指令前自动增加一个指令周期的延时。指令停顿使目标 W寄存器有足够的时间先执行写入,再让下一条(预取的)指令使用写入的数据。表 2-7 提供了先写后读相依性的汇总。

ADD MOV

[W7]

[W10] [W9]++

X 空间地址 W7 W10 W8 W9

ADD W0, [W7], [W10]MOV [W8], [W9++]

[W8] X 空间 RAGU

指令寄存器 内容

X 空间 WAGU

1 个指令周期(TCY)

TCY1 TCY2 TCY3TCY0

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-39 页

Page 40: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

表 2-7: 先写后读相依性汇总

2.10.2 指令停顿周期

指令停顿实际上是加在指令读阶段前的一个指令周期的等待时间,以便让前面的写操作先完成再发生下一个读操作。为了达到中断延时的目的,停顿周期与检测到它的指令后的那条指令是关联的(即停顿周期总是在指令执行周期之前)。

如果检测到 RAW 数据相依性,dsPIC33E/PIC24E 将开始指令停顿周期。在指令停顿期间,会发生以下事件:

• 正在进行的(上一条指令的)写操作可以正常完成

• 在指令停顿周期结束前不会寻址数据空间

• 在指令停顿周期结束前禁止 PC 递增

• 在指令停顿周期结束前禁止再次取指

2.10.2.1 指令停顿周期和中断

当会造成指令停顿的两条相邻指令与中断事件同时发生时,可能会产生以下两个结果之一:

• 如果中断与第一条指令同时发生,则允许第一条指令完成,而第二条指令将在 ISR 完成后执行。在这种情况下,由于异常处理为第一条指令提供了完成写阶段的时间,停顿周期将在第二条指令中被消除。

• 如果中断与第二条指令同时发生,则允许第二条指令和附加的停顿周期在 ISR 前执行。在这种情况下,与第二条指令关联的停顿周期会正常执行。但是,停顿周期实际上会被嵌入到异常处理时序内。异常处理将会继续进行,如同普通的双周期指令被中断一样。

使用 Wn 的

目标寻址模式

使用 Wn 的

源寻址模式状态

示例(Wn = W2)

直接寻址 直接寻址 允许 ADD.w W0, W1, W2MOV.w W2, W3

直接寻址 间接寻址 停顿 ADD.w W0, W1, W2MOV.w [W2], W3

直接寻址 带有修改的间接寻址 停顿 ADD.w W0, W1, W2MOV.w [W2++], W3

间接寻址 直接寻址 允许 ADD.w W0, W1, [W2]MOV.w W2, W3

间接寻址 间接寻址 允许 ADD.w W0, W1, [W2]MOV.w [W2], W3

间接寻址 带有修改的间接寻址 允许 ADD.w W0, W1, [W2]MOV.w [W2++], W3

带有修改的间接寻址 直接寻址 允许 ADD.w W0, W1, [W2++]MOV.w W2, W3

间接寻址 间接寻址 停顿 ADD.w W0, W1, [W2]MOV.w [W2], W3; W2=0x0004 (mapped W2)

间接寻址 带有修改的间接寻址 停顿 ADD.w W0, W1, [W2]MOV.w [W2++], W3; W2=0x0004 (mapped W2)

带有修改的间接寻址 间接寻址 停顿 ADD.w W0, W1, [W2++]MOV.w [W2], W3

带有修改的间接寻址 带有修改的间接寻址 停顿 ADD.w W0, W1, [W2++]MOV.w [W2++], W3

DS70359B_CN 第 2-40 页 © 2011 Microchip Technology Inc.

Page 41: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.10.2.2 指令停顿周期和流改变指令

CALL 和 RCALL 指令使用工作寄存器 W15 写入堆栈,并且如果下一条指令的源读取使用 W15,可能会因此在下一条指令前强制执行指令停顿。

RETFIE和 RETURN指令永远不能在下一条指令前强制指令停顿,因为它们只能执行读操作。但是, RETLW指令能强制执行停顿,因为它会在 后一个周期写入 W 寄存器。

由于 GOTO和跳转指令不执行写操作,因此永远不能强制执行指令停顿。

2.10.2.3 指令停顿以及 DO和 REPEAT循环

除了增加指令停顿周期外, RAW 数据相依性不会影响 DO或 REPEAT循环的操作。

REPEAT 循环中预取的指令在循环完成或发生异常前不会改变。虽然寄存器相依性检查会跨指令边界进行,在 REPEAT循环中 dsPIC33E/PIC24E 实际上会比较同一条指令的源和目标地址。

DO循环的 后一条指令将预取循环起始地址处的指令或下一条指令(循环外部)。指令停顿决定将基于循环中的 后一条指令和预取指令的内容。

2.10.2.4 指令停顿和程序空间可视性 (PSV)

将程序空间(Program Space,PS)映射到数据空间,并且 X 空间 EA 处于可视的程序空间窗口中时,读或写周期会被重定向到程序空间中的地址。通常,从程序空间中访问数据的所有指令都需要 5 个指令周期,因此会产生一次停顿来确保数据可用。

PSV 地址空间中的指令操作与任何其他指令一样,会受到 RAW 数据相依性和所造成指令停顿的影响。在例 2-6 中,指令序列将需要 7 个指令周期来执行。通过 W1 进行 PSV 访问需要 5 个指令周期,同时插入一个额外周期来解决由 W2 导致的 RAW 数据相依性。

例 2-6:

2.11 数据空间仲裁停顿

扩展数据空间资源竞争也会产生 CPU 停顿。当数据空间仲裁逻辑确定必须停顿 CPU 周期,以允许其他总线主器件(例如,DMA 控制器或 USB 模块)访问数据存储器时,指令执行会被暂停,直到优先级较高的总线主器件完成数据访问为止。

ADD W0,[W1],[W2++] ; W1=0x8000, PSVPAG=0xAA, DSRPAG=0x0200

MOV[W2], [W3]

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-41 页

Page 42: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsP

IC33E

/PIC

24E系

列参

考手

DS

70359B_C

N第

2-42页

© 2011 M

icrochip Technolo

gy Inc.

Bit 2 Bit 1 Bit 0 复位时的状态

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0 0000 0000 0000 0000

0000 0000 0000 0001

0000 0000 0000 0001

xxxx xxxx xxxx xxxx

xxxx xxxx xxxx xxxx

0 xxxx xxxx xxxx xxx0

0000 0000 00xx xxxx

0 xxxx xxxx xxxx xxx0

2.12 寄存器映射

表 2-8 中提供了与 dsPIC33E/PIC24E CPU 相关的寄存器汇总。

表 2-8: dsPIC33E/PIC24E CPU 寄存器映射

名称 Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3

W0 W0 (WREG)

W1 W1

W2 W2

W3 W3

W4 W4

W5 W5

W6 W6

W7 W7

W8 W8

W9 W9

W10 W10

W11 W11

W12 W12

W13 W13

W14 W14

W15 W15

SPLIM SPLIM

ACCAL ACCAL

ACCAH ACCAH

ACCAU ACCA<39> 的符号扩展 ACCAU

ACCBL ACCBL

ACCBH ACCBH

ACCBU ACCB<39> 的符号扩展 ACCBU

PCL PCL

PCH — — — — — — — — — PCH

DSRPAG — — — — — — DSRPAG

DSWPAG — — — — — — — DSWPAG

RCOUNT RCOUNT

DCOUNT DCOUNT

DOSTARTL DOSTARTL

DOSTARTH — — — — — — — — — DOSTARTH

DOENDL DOENDL

图注: x = 复位时的未知值, — = 未实现,读为 0。复位值以十六进制显示。注: 关于具体的内核寄存器映射详细信息,请参见器件数据手册。

Page 43: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

© 2011

Microchip T

echnology Inc.D

S70359B

_CN第

2-43页

第2章

CP

U

2

DO 0000 0000 00xx xxxx

SR V Z C 0000 0000 0000 0000

CO FA RND IF 0000 0000 0010 0000

MO WM<3:0> 0000 0000 0000 0000

XM 0 xxxx xxxx xxxx xxx0

XM 1 xxxx xxxx xxxx xxx1

YM 0 xxxx xxxx xxxx xxx0

YM 1 xxxx xxxx xxxx xxx1

XB xxxx xxxx xxxx xxxx

DI 0000 0000 0000 0000

TB 0000 0000 0000 0000

MS 0000 0000 0000 0000

it 2 Bit 1 Bit 0 复位时的状态

图注

CPU

ENDH — — — — — — — — — DOENDH

OA OB SA SB OAB SAB DA DC IPL2 IPL1 IPL0 RA N O

RCON — — US<1:0> EDT DL<2:0> SATA SATB SATDW ACCSAT IPL3 S

DCON XMODEN YMODEN — — BWM<3:0> YWM<3:0> X

ODSRT XMODSRT<15:0>

ODEND XMODEND<15:0>

ODSRT YMODSRT<15:0>

ODEND YMODEND<15:0>

REV BREN XBREV<14:0>

SICNT — — DISICNT<13:0>

LPAG — — — — — — — — TBLPAG<7:0>

TRPR MSTRPR<15:0>

2-8: dsPIC33E/PIC24E CPU 寄存器映射 (续)

名称 Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 B

注: x = 复位时的未知值, — = 未实现,读为 0。复位值以十六进制显示。: 关于具体的内核寄存器映射详细信息,请参见器件数据手册。

Page 44: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

2.13 相关应用笔记

本节列出了与手册本章内容相关的应用笔记。这些应用笔记可能并不是专为 dsPIC33E/PIC24E产品系列而编写的,但其概念是相近的,通过适当修改并受到一定限制即可使用。当前与dsPIC33E/PIC24E CPU 相关的应用笔记有:

标题 应用笔记编号

目前没有相关的应用笔记。

注: 如需获取更多dsPIC33E/PIC24E系列器件的应用笔记和代码示例,请访问Microchip网站(www.microchip.com)。

DS70359B_CN 第 2-44 页 © 2011 Microchip Technology Inc.

Page 45: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

第 2 章 CPUC

PU

2

2.14 版本历史

版本 A (2008 年 11 月)

这是本文档的初始版本。

版本 B (2010 年 5 月)

该版本包括以下更改:

• 更新了文档以包含对 PIC24E 器件的引用

• 更新了以下章节的标题以指示内容仅适用于 dsPIC33E 器件:

- 第 2.1.5 节 “DSP 引擎和指令 (仅限 dsPIC33E 器件)”

- 第 2.6.1 节 “数据累加器(仅限 dsPIC33E 器件)”

- 第 2.6.2.1 节“DSP 乘法指令(仅限 dsPIC33E 器件)”

- 第 2.6.4 节 “舍入逻辑(仅限 dsPIC33E 器件)”

- 第 2.6.5 节 “桶形移位寄存器(仅限 dsPIC33E 器件)”

- 第 2.6.6 节 “DSP 引擎模式选择 (仅限 dsPIC33E 器件)”

- 第 2.6.7 节 “DSP 引擎陷阱事件 (仅限 dsPIC33E 器件)”

- 第 2.9.2 节 “DO 循环结构(仅限 dsPIC33E 器件)”

• 在表 2-1 的编程模型寄存器说明中增加了 “注 1”

• 更新了图 2-2 中的编程模型

• 在第 2.3.3 节 “堆栈指针上溢”的第一条阴影注释中,新增了关于堆栈错误陷阱其他原因的一句话

• 在 CPU 状态寄存器中增加了新的 “注 1”和 “注 2”(见寄存器 2-1);原有的 “注 1”和“注 2”重新编号为 “注 3”和“注 4”

• 在内核控制寄存器中增加了新的“注 2”(见寄存器 2-2);原有的“注 2”重新编号为“注 3”

• 删除了“注 2”,并在“使用乘法器的 MCU 指令”中增加了 3 行(见表 2-4)

• 更新了图 2-13 中的第二条 MOV.D指令

• 更新了图 2-15 中的第三条指令

• 更新了图 2-16 中的第四条指令

• 更新了图 2-18 中的第二条和第三条指令

• 更新了图 2-19 中的第二条和第三条指令

• 更新了第 2.9.1.1 节“REPEAT 操作”中的第二条阴影注释

• 更新了第 2.9.2 节 “DO 循环结构(仅限 dsPIC33E 器件)”中第一段的 后一句

• 更新了图 2-21 中的 MOV指令

• 更新了第 2.10.2.4 节 “指令停顿和程序空间可视性(PSV)”中第一段的第一句

• 更新了第 2.10.2.4 节 “指令停顿和程序空间可视性(PSV)”的 后一段

• 在 CPU 寄存器映射中,更改了 DOSTARTH、 DOENDH 和 MSTRPR SFR 中可用位的范围(见表 2-8)

• 对整篇文档进行了其他少量格式更新

© 2011 Microchip Technology Inc. DS70359B_CN 第 2-45 页

Page 46: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

dsPIC33E/PIC24E 系列参考手册

注:

DS70359B_CN 第 2-46 页 © 2011 Microchip Technology Inc.

Page 47: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

请注意以下有关 Microchip 器件代码保护功能的要点:

• Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。

• Microchip 确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中 安全的产品之一。

• 目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的

操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。

• Microchip 愿与那些注重代码完整性的客户合作。

• Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。

代码保护功能处于持续发展中。Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视

为违反了《数字器件千年版权法案(Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的

软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。

提供本文档的中文版本仅为了便于理解。请勿忽视文档中包含

的英文部分,因为其中提供了有关 Microchip 产品性能和使用

情况的有用信息。Microchip Technology Inc. 及其分公司和相

关公司、各级主管与员工及事务代理机构对译文中可能存在的任何差错不承担任何责任。建议参考 Microchip TechnologyInc. 的英文原版文档。

本出版物中所述的器件应用信息及其他类似内容仅为您提供便

利,它们可能由更新之信息所替代。确保应用符合技术规范,是您自身应负的责任。Microchip 对这些信息不作任何明示或

暗示、书面或口头、法定或其他形式的声明或担保,包括但不

限于针对其使用情况、质量、性能、适销性或特定用途的适用性的声明或担保。 Microchip 对因这些信息及使用这些信息而

引起的后果不承担任何责任。如果将 Microchip 器件用于生命

维持和 / 或生命安全应用,一切风险由买方自负。买方同意在

由此引发任何一切伤害、索赔、诉讼或费用时,会维护和保障Microchip 免于承担法律责任,并加以赔偿。在 Microchip 知识

产权保护下,不得暗中或以其他方式转让任何许可证。

2011 Microchip Technology Inc.

商标

Microchip 的名称和徽标组合、 Microchip 徽标、 dsPIC、

KEELOQ、 KEELOQ 徽标、 MPLAB、 PIC、 PICmicro、PICSTART、 PIC32 徽标、 rfPIC 和 UNI/O 均为 Microchip Technology Inc. 在美国和其他国家或地区的注册商标。

FilterLab、 Hampshire、 HI-TECH C、 Linear Active Thermistor、MXDEV、MXLAB、SEEVAL 和 The Embedded Control Solutions Company 均为 Microchip Technology Inc.在美国的注册商标。

Analog-for-the-Digital Age、 Application Maestro、 chipKIT、chipKIT 徽标、 CodeGuard、 dsPICDEM、 dsPICDEM.net、dsPICworks、 dsSPEAK、 ECAN、 ECONOMONITOR、

FanSense、 HI-TIDE、 In-Circuit Serial Programming、ICSP、 Mindi、 MiWi、 MPASM、 MPLAB Certified 徽标、

MPLIB、MPLINK、mTouch、Omniscient Code Generation、PICC、 PICC-18、 PICDEM、 PICDEM.net、 PICkit、PICtail、 REAL ICE、 rfLAB、 Select Mode、 Total Endurance、 TSHARC、 UniWinDriver、 WiperLock 和ZENA 均为 Microchip Technology Inc. 在美国和其他国家或地

区的商标。

SQTP 是 Microchip Technology Inc. 在美国的服务标记。

在此提及的所有其他商标均为各持有公司所有。

2011, Microchip Technology Inc. 版权所有。

ISBN:978-1-61341-493-4

DS70359B_CN 第 2-47 页

Microchip 位于美国亚利桑那州 Chandler 和 Tempe 与位于俄勒冈州Gresham 的全球总部、设计和晶圆生产厂及位于美国加利福尼亚州和印度的设计中心均通过了 ISO/TS-16949:2009 认证。 Microchip 的PIC® MCU 与 dsPIC® DSC、KEELOQ® 跳码器件、串行 EEPROM、单片机外设、非易失性存储器和模拟产品严格遵守公司的质量体系流程。此外, Microchip 在开发系统的设计和生产方面的质量体系也已通过了ISO 9001:2000 认证。

Page 48: 2 CPU - ww1.microchip.comww1.microchip.com/downloads/cn/DeviceDoc/70359B_CN.pdf · w15/ 堆栈指针 splim 堆栈指针限制寄存器 w0/wreg div 和mul 结果寄存器 图注 嵌套do

DS70359B_CN 第 2-48 页 2011 Microchip Technology Inc.

美洲公司总部 Corporate Office2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 1-480-792-7200 Fax: 1-480-792-7277技术支持:http://www.microchip.com/support网址:www.microchip.com

亚特兰大 AtlantaDuluth, GA Tel: 1-678-957-9614 Fax: 1-678-957-1455

波士顿 BostonWestborough, MA Tel: 1-774-760-0087 Fax: 1-774-760-0088

芝加哥 ChicagoItasca, IL Tel: 1-630-285-0071 Fax: 1-630-285-0075

克里夫兰 ClevelandIndependence, OH Tel: 1-216-447-0464

Fax: 1-216-447-0643

达拉斯 DallasAddison, TX Tel: 1-972-818-7423 Fax: 1-972-818-2924

底特律 DetroitFarmington Hills, MI Tel: 1-248-538-2250Fax: 1-248-538-2260

印第安纳波利斯IndianapolisNoblesville, IN Tel: 1-317-773-8323Fax: 1-317-773-5453

洛杉矶 Los AngelesMission Viejo, CA Tel: 1-949-462-9523 Fax: 1-949-462-9608

圣克拉拉 Santa ClaraSanta Clara, CA Tel: 1-408-961-6444Fax: 1-408-961-6445

加拿大多伦多 TorontoMississauga, Ontario, CanadaTel: 1-905-673-0699 Fax: 1-905-673-6509

亚太地区

亚太总部 Asia Pacific OfficeSuites 3707-14, 37th FloorTower 6, The GatewayHarbour City, KowloonHong KongTel: 852-2401-1200Fax: 852-2401-3431

中国 - 北京Tel: 86-10-8569-7000Fax: 86-10-8528-2104

中国 - 成都Tel: 86-28-8665-5511Fax: 86-28-8665-7889

中国 - 重庆Tel: 86-23-8980-9588Fax: 86-23-8980-9500

中国 - 杭州Tel: 86-571-2819-3187Fax: 86-571-2819-3189

中国 - 香港特别行政区Tel: 852-2401-1200 Fax: 852-2401-3431

中国 - 南京Tel: 86-25-8473-2460Fax: 86-25-8473-2470

中国 - 青岛Tel: 86-532-8502-7355 Fax: 86-532-8502-7205

中国 - 上海Tel: 86-21-5407-5533 Fax: 86-21-5407-5066

中国 - 沈阳Tel: 86-24-2334-2829 Fax: 86-24-2334-2393

中国 - 深圳Tel: 86-755-8203-2660 Fax: 86-755-8203-1760

中国 - 武汉Tel: 86-27-5980-5300 Fax: 86-27-5980-5118

中国 - 西安Tel: 86-29-8833-7252

Fax: 86-29-8833-7256

中国 - 厦门Tel: 86-592-238-8138

Fax: 86-592-238-8130

中国 - 珠海Tel: 86-756-321-0040 Fax: 86-756-321-0049

亚太地区

台湾地区 - 高雄Tel: 886-7-536-4818

Fax: 886-7-330-9305

台湾地区 - 台北Tel: 886-2-2500-6610Fax: 886-2-2508-0102

台湾地区 - 新竹Tel: 886-3-5778-366Fax: 886-3-5770-955

澳大利亚 Australia - SydneyTel: 61-2-9868-6733 Fax: 61-2-9868-6755

印度 India - BangaloreTel: 91-80-3090-4444 Fax: 91-80-3090-4123

印度 India - New DelhiTel: 91-11-4160-8631Fax: 91-11-4160-8632

印度 India - PuneTel: 91-20-2566-1512Fax: 91-20-2566-1513

日本 Japan - YokohamaTel: 81-45-471- 6166 Fax: 81-45-471-6122

韩国 Korea - DaeguTel: 82-53-744-4301Fax: 82-53-744-4302

韩国 Korea - SeoulTel: 82-2-554-7200 Fax: 82-2-558-5932 或82-2-558-5934

马来西亚 Malaysia - KualaLumpurTel: 60-3-6201-9857Fax: 60-3-6201-9859

马来西亚 Malaysia - PenangTel: 60-4-227-8870Fax: 60-4-227-4068

菲律宾 Philippines - ManilaTel: 63-2-634-9065Fax: 63-2-634-9069

新加坡 SingaporeTel: 65-6334-8870 Fax: 65-6334-8850

泰国 Thailand - BangkokTel: 66-2-694-1351Fax: 66-2-694-1350

欧洲奥地利 Austria - WelsTel: 43-7242-2244-39Fax: 43-7242-2244-393

丹麦 Denmark-CopenhagenTel: 45-4450-2828 Fax: 45-4485-2829

法国 France - ParisTel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79

德国 Germany - MunichTel: 49-89-627-144-0 Fax: 49-89-627-144-44

意大利 Italy - Milan Tel: 39-0331-742611 Fax: 39-0331-466781

荷兰 Netherlands - DrunenTel: 31-416-690399 Fax: 31-416-690340

西班牙 Spain - MadridTel: 34-91-708-08-90Fax: 34-91-708-08-91

英国 UK - WokinghamTel: 44-118-921-5869Fax: 44-118-921-5820

全球销售及服务网点

08/02/11