2024年1月8日发(作者:)
第2章 CPU目录本章包括下列主题:2.12.22.32.42.52.62.72.82.92.102.112.122.132.14简介 ...............................................................................................................................2-2编程模型 ........................................................................................................................2-4软件堆栈指针 ................................................................................................................2-7CPU寄存器说明 .........................................................................................................2-10算术逻辑单元(ALU) ................................................................................................2-13乘法和除法支持 ...........................................................................................................2-14编译器友好架构 ...........................................................................................................2-17多位移位支持 ..............................................................................................................2-17指令流类型 ..................................................................................................................2-18程序流循环控制 ...........................................................................................................2-20地址寄存器相依性 .......................................................................................................2-22寄存器映射 ..................................................................................................................2-25相关应用笔记 ..............................................................................................................2-26版本历史 ......................................................................................................................2-272CPU© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-1页
PIC24F系列参考手册2.1 简介PIC24F CPU模块采用16位(数据)改良的哈佛架构,并带有增强型指令集。CPU具有24位指令字,指令字带有长度可变的操作码字段。程序计数器(Program Counter,PC)为24位宽,可以寻址高达4M x 24位的用户程序存储空间。单周期指令预取机制用来帮助维持吞吐量并提供可预测的指令执行过程。除了改变程序流的指令、双字移动(MOV.D)指令和表指令以外,所有指令都在单个周期内执行。模块使用REPEAT指令支持无开销的程序循环结构,该指令在任何时候都可被中断。PIC24F器件在编程模型中有16个16位工作寄存器。每个工作寄存器都可以充当数据、地址或地址偏移寄存器。第16个工作寄存器(W15)作为软件堆栈指针工作,用于中断和调用。第15个工作寄存器(W14)可用作堆栈帧指针,与LNK和UNLK指令配合使用。可以选择将数据空间存储器映射的高32 KB映射到由8位程序空间可视性页(Program SpaceVisibility Page,PSVPAG)寄存器定义的任何16K字程序边界内的程序空间内。数据空间到程序空间的映射功能让任何指令都能像访问数据空间一样访问程序空间。关于程序空间可视性的更多信息,请参见第4.4节“来自数据空间的程序空间可视性”。
指令集架构(Instruction Set Architecture,ISA)在PIC18F指令集架构的基础上有显著增强,但仍在可接受程度上保持了向后兼容性。所有PIC18F指令和寻址模式都能直接得到支持或通过简单的宏得到支持。许多ISA增强功能都是为了提高编译器效率而做出的。内核支持固有(无操作数)、相对、立即数和存储器直接寻址模式,以及3组寻址模式(MODE1、MODE2和MODE3)。所有模式都支持寄存器直接和各种寄存器间接寻址模式。每组都提供最多7种寻址模式。指令根据其功能要求,与预定义的寻址模式相关联。还有一种“有符号10位偏移寄存器间接”寻址模式,专用于两条特殊移动指令LDWLO和STWLO。更多详细信息,请参见第32章“指令集”。对于大多数指令,内核能在每个指令周期内执行一次数据(或程序数据)存储器读操作、一次工作寄存器(数据)读操作、一次数据存储器写操作和一次程序(指令)存储器读操作。因此可以支持3个参数的指令,使A + B = C操作能在单个周期内执行。
该模块具备一个高速17位X17位乘法器,显著提高了内核算术能力和吞吐量。乘法器支持有符号、无符号和混合模式的16位X16位或8位X8位整数相乘。所有乘法指令都在单个周期内执行。支持迭代不恢复(Non-restoring)除法算法的整数除法支持硬件增强16位ALU。它与REPEAT指令循环机制和一些迭代除法指令配合使用,支持32位(或16位)除以16位整数的有符号和无符号除法。所有除法操作都需要19个周期来完成,但可以在任何周期边界上中断。PIC24F具有向量异常(Exception)机制,带有最多8个不可屏蔽陷阱源和中断源。可以为每个中断源分配7个优先级之一。图2-1给出了CPU的框图。DS39703A_CN 第2-2页超前信息© 2007 Microchip Technology Inc.
第2章 CPU图2-1:PIC24F CPU内核框图地址总线数据总线
16中断控制器232323PSV和表数据访问控制模块
16数据锁存器816数据RAM地址锁存器16PCUPCH PCL程序计数器堆栈循环控制控制逻辑逻辑RAGUWAGU 16 162CPU地址锁存器程序存储器数据锁存器16ROM锁存器
EA MUX 16IR立即数数据 162416 x 16W寄存器阵列指令译码与控制控制信号输入到不同模块OSC1/CLKI时序发生
上电延时定时器振荡器起振定时器POR/BOR复位MCLR看门狗定时器
16位ALU16乘法和除法支持16外设I/O端口© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-3页
PIC24F系列参考手册2.2 编程模型图2-2中所示为PIC24F的编程模型。编程模型中的所有寄存器都是存储器映射的,并且可以由指令直接控制。表2-1中提供了对每个寄存器的说明。表2-1:编程模型的寄存器说明寄存器名称W0到W15PCSRSPLIMTBLPAGPSVPAGRCOUNTCORCON工作寄存器阵列23位程序计数器ALU STATUS寄存器堆栈指针极限值寄存器表存储器页地址寄存器程序空间可视性页地址寄存器REPEAT 循环计数寄存器CPU控制寄存器说明与编程模型相关的所有寄存器都是存储器映射的,如表2-5中所示。图2-2:编程模型15 0W0(WREG)W1W2W3W4W5W6W7W8W9W10W11PUSH.S和POP.S影子寄存器W12W13 帧指针/W14堆栈指针/W150SPLIM22工作/地址寄存器000堆栈指针限制程序计数器7TBLPAG7PSVPAG15RCOUNTSRH————SRL 0数据表页地址0 0REPEAT 循环计数器程序空间可视性页地址———DCIPL<2:0>RANOVZCSTATUS寄存器15CORCON 0内核控制寄存器DS39703A_CN 第2-4页超前信息© 2007 Microchip Technology Inc.
第2章 CPU2.2.1工作寄存器阵列16个工作寄存器(W)可以作为数据、地址或地址偏移寄存器。W寄存器的功能由访问它的指令的寻址模式决定。
PIC24F指令集可被分成两种指令类型:寄存器和文件寄存器指令。寄存器指令可以把每个W寄存器用作数据值或地址偏移值。例如:例2-1:MOVMOVADD寄存器指令W0, W1W0, [W1]W0, [W4], W5; move contents of W0 to W1; move W0 to address contained in W1; add contents of W0 to contents pointed; to by W4. Place result in W5.22.2.1.1W0和文件寄存器指令W0是一个特殊的工作寄存器,因为它是可在文件寄存器指令中使用的惟一的工作寄存器。文件寄存器指令对在指令操作码和W0中包含的特定存储器地址进行操作。在文件寄存器指令中,W1到W15不可被指定为目标寄存器。文件寄存器指令对只有一个W寄存器的现有PIC®器件提供向后兼容性。在汇编器语法中使用标号“WREG”来表示文件寄存器指令中的W0。例如:例2-2:MOVADDCPU文件寄存器指令WREG, 0x01000x0100, WREG; move contents of W0 to address 0x0100; add W0 to address 0x0100, store in W0注:关于寻址模式和指令语法的完整说明,请参见“dsPIC30F Programmer’s ReferenceManual”(DS70030)。2.2.1.2W寄存器存储器映射由于W寄存器是存储器映射的,因此可在文件寄存器指令中访问W寄存器,示例如下:例2-3:MOV在文件寄存器指令中访问W寄存器0x0004, W10; equivalent to MOV W2, W10其中:0x0004是W2存储器中的地址此外,还可执行一条试图将W寄存器同时用作地址指针和操作数目标的指令。例如:例2-4:MOVW寄存器用作地址指针和操作数目标W1, [W2++]其中:W1 = 0x1234W2 = 0x0004;[W2] addresses W2在例2-4中,W2的内容是0x0004。由于W2被用作地址指针,它指向存储器中的0x0004单元。W2也映射到存储器中的该地址空间。虽然这是不太可能发生的事件,但不到运行时不可能检测到。PIC24F确保数据写操作将占据主导,使上面示例中W2的结果为0x1234。© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-5页
PIC24F系列参考手册2.2.1.3W寄存器和字节模式指令把W寄存器阵列当作目标寄存器的字节指令只影响目标寄存器的最低有效字节。因为工作寄存器是存储器映射的,所以可以通过对数据存储空间进行字节宽度的访问来控制工作寄存器的最低和最高有效字节。2.2.2影子寄存器如表2-5中所示,许多寄存器都有相关的影子寄存器。影子寄存器用作临时的保持寄存器,可在发生某些事件时,在它与其主寄存器之间传送内容。影子寄存器都不能直接访问。PUSH.S和POP.S影子规则应用于传送进出影子的寄存器。2.2.2.1PUSH.S和POP.S影子寄存器在执行函数调用或中断服务程序(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和POP.S指令; Save W registers, MCU status; load a literal value into W0; add W0 to contents of RAM100; is the result 0?; Yes, set a flag; Restore W regs, MCU status
MyFunction:PUSH.S
MOV#0x03, W0ADDRAM100BTSCSR, #ZBSETFlags, #NPUSH.S指令会改写先前保存在影子寄存器中的内容。影子寄存器深度只有一级,所以如果多个软件任务使用影子寄存器,必须小心。
用户必须确保使任何使用影子寄存器的任务均不会被同样使用该影子寄存器且具有更高优先级的任务中断。如果允许较高优先级的任务中断较低优先级的任务,较低优先级任务保存在影子寄存器中的内容将被较高优先级任务改写。2.2.3未初始化的W寄存器的复位W寄存器阵列(除W15之外)在发生所有复位时被清零,并且在被写入前视为未经初始化。试图把未初始化的寄存器用作地址指针将会复位器件。更多详细信息,请参见第7章“复位”(请访问Microchip网站查看是否提供)。必须执行字写操作来初始化W寄存器。字节写操作不会影响初始化检测逻辑。DS39703A_CN 第2-6页超前信息© 2007 Microchip Technology Inc.
第2章 CPU2.3 软件堆栈指针W15作为专用的软件堆栈指针并被异常处理、子程序调用和返回自动修改。但是,W15可以被任何指令以与所有其他W寄存器相同的方式引用。这样就简化了对堆栈指针的读、写和控制(如创建堆栈帧)。注:为了防止偏离的堆栈访问,W15<0>被硬件固定为0。所有复位均将W15初始化为0x0800。此地址确保在所有PIC24F器件中,堆栈指针(SP)将指向有效的RAM并允许不可屏蔽异常陷阱(在SP被用户软件初始化前可能发生)使用堆栈。在初始化期间,用户可以将SP重新编程以指向数据空间内的任何单元。堆栈指针总是指向第一个可用的空字并从低地址到高地址填充软件堆栈。堆栈出栈(读)时,堆栈指针先减;堆栈进栈(写)时,堆栈指针后加,如图2-3中所示。当PC压入堆栈时,PC<15:0>位被压入第一个可用的堆栈字,然后PC<22:16>位被压入第二个可用的堆栈单元。对于任何CALL指令执行期间的PC进栈,进栈前PC的MSB是以零扩展的,如图2-3中所示。异常处理期间,PC的MSB与CPU STATUS寄存器SR的低8位相连。这样就使SRL的内容在中断处理期间能被自动保存。图2-3:CALL指令的堆栈操作150CALL SUBR2CPU堆栈往高地址递增PC<15:0>B‘000000000’PC<22:16><空字>W15(CALL之前)W15(CALL之后)© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-7页
PIC24F系列参考手册2.3.1软件堆栈示例使用PUSH和POP指令可控制软件堆栈。PUSH和POP指令相当于将W15用作目标指针的MOV指令。例如,要把W0的内容压入堆栈,可通过:PUSHW0W0, [W15++]W0此语法相当于:MOVPOP要把栈顶(TOS)的内容返回W0,可通过:此语法相当于:MOV[--W15], W0图2-4到图2-7给出了如何使用软件堆栈的示例。图2-4所示为器件初始化时的软件堆栈。W15已经初始化为0x0800。此外,此示例假设0x5A5A和0x3636这两个值已被分别写入W0和W1。图2-5中堆栈第一次进栈,W0中包含的值被复制到堆栈中。W15自动更新以指向下一个可用的堆栈单元(0x0802)。在图2-6中,W1的内容被压入堆栈。在图2-7中,数据出栈并且栈顶值(先前从W1压入)被写入W3。
图2-4:器件复位时的堆栈指针
0x0000W150x08000xFFFEW15 = 0x0800W0 = 0x5A5AW1 = 0x3636图2-5:第一次执行PUSH指令后的堆栈指针
0x0000W150x5A5A0x08000x0802PUSH W00xFFFEW15 = 0x0802W0 = 0x5A5AW1 = 0x3636图2-6:第二次执行PUSH指令后的堆栈指针
0x00000x5A5A0x36360x08000x08020x08040xFFFEW15 = 0x0804W0 = 0x5A5AW1 = 0x3636PUSH W1W15DS39703A_CN 第2-8页超前信息© 2007 Microchip Technology Inc.
第2章 CPU图2-7:执行一条POP指令后的堆栈指针0x0000W150x05A5A0x036360x08000x0802POP W30xFFFEW15 = 0x08020x3636 → W322.3.2W14软件堆栈帧指针帧是堆栈中用户定义的存储器段,供单个子程序使用。W14是特殊工作寄存器,因为通过使用LNK(link,连接)和ULNK(unlink,不连接)指令可以把它用作堆栈帧指针。当不用作堆栈帧指针时,W14可被指令当作普通的工作寄存器使用。关于将W14用作堆栈帧指针的软件示例,请参见“dsPIC30F Programmer’s Reference Manual”(DS70030)。CPU2.3.3堆栈指针上溢有一个与堆栈指针相关的堆栈指针极限寄存器(SPLIM),复位时为0x0000。SPLIM是一个16位寄存器,但SPLIM<0>被固定为0,因为所有的堆栈操作都必须按字对齐。直到一个字写入SPLIM后才使能堆栈上溢检查,在此之后,只能通过器件复位禁止堆栈上溢检查。所有将W15用作源或目标寄存器而产生的有效地址将与SPLIM中的值作比较。如果堆栈指针(W15)的内容比SPLIM寄存器的内容大2,并且执行了进栈操作,将不会产生堆栈错误陷阱(Stack Error Trap)。堆栈错误陷阱将在随后的进栈操作时产生。所以,例如,如果想要在堆栈指针递增超出RAM中的地址0x2000时引起堆栈错误陷阱,可将SPLIM初始化为0x1FFE。注:任何使用W15寄存器的内容来产生有效地址(Effective Address,EA)的指令均有可能产生堆栈错误陷阱。因此,如果W15的内容比SPLIM寄存器的内容大2,并且执行了一条CALL指令或发生了中断,那么将产生堆栈错误陷阱。如果已经使能了堆栈上溢检查,则当W15有效地址计算越过了数据空间的末尾(0xFFFF)时,也将产生堆栈错误陷阱。注:对堆栈指针极限寄存器SPLIM的写操作后面不应紧跟一个使用W15的间接读操作。关于堆栈错误陷阱的更多信息,请参见第8章“中断”。2.3.4注:堆栈指针下溢通常,数据空间中0x0000和0x07FF之间的单元预留给内核和外设的特殊功能寄存器。发生复位时,堆栈初始化为0x0800。如果堆栈指针地址小于0x0800,将产生堆栈错误陷阱。© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-9页
PIC24F系列参考手册2.4 CPU寄存器说明2.4.1SR:CPU STATUS寄存器PIC24F的CPU有一个16位STATUS寄存器(SR),它的低字节称为低STATUS寄存器(LowerSTATUS Register,SRL)。SR的高字节称为SRH。寄存器2-1中给出了对SR的详细说明。SRL包含了所有的MCU ALU操作状态标志,以及CPU 中断优先级状态位IPL<2:0>和REPEAT循环有效状态位RA(SR<4>)。异常处理期间,SRL与PC的MSB相连形成一个完整的字值,然后将该字值压入堆栈。SRH只包含半进位位DC(SR<8>)。
SR位可读/写,但以下各位例外:位(SR<4>):RA是只读位。IPL<2:0>:寄存器被禁止(NSTDIS = 1)时,IPL<2:0>位变为只读位。注:“dsPIC30F Programmer’s Reference Manual”(DS70030)中提供了对受各条指令影响的SR位的说明。DS39703A_CN 第2-10页超前信息© 2007 Microchip Technology Inc.
第2章 CPU
寄存器2-1:U-0—bit 15R/W-0(2)bit 7图注:R = 可读位-n = POR值bit 15-9bit 8SR:CPU STATUS寄存器U-0—U-0—U-0—U-0—U-0—U-0—R/W-0DCbit 8R/W-0(2)IPL<2:0>R/W-0(2)R-0RAR/W-0NR/W-0OVR/W-0ZR/W-0Cbit 02W = 可写位U = 未实现,读为0x = 未知1 = 置1 0=清零未实现:读为0DC:MCU ALU半进位/借位位1 =结果的第4个低位(对于字节大小的数据)或第8个低位(对于字大小的数据)发生了向高位的进位0 =结果的第4个低位(对于字节大小的数据)或第8个低位(对于字大小的数据)未发生向高位的进位IPL<2:0>:CPU中断优先级状态位(1)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)RA:REPEAT循环有效位1 = 正在进行REPEAT循环0 = 不在进行REPEAT循环N:MCU ALU负标志位1 = 结果为负0 = 结果为非负(零或正)OV: MCU ALU溢出标志位此位用于有符号的算术运算(二进制补码)。它表明数量级的溢出而导致符号位改变状态。
1 = 有符号算术运算中发生溢出(本次运算)0 = 未发生溢出Z:MCU ALU零标志位1 = 上个操作结果为零0 = 上个操作结果不为零C:MCU ALU进位/借位位1 = 结果的最高有效位发生了进位0 = 结果的最高有效位未发生进位CPUbit 7-5bit 4bit 3bit 2bit 1bit 0注1:IPL<2:0>位与IPL3位(CORCON<3>)相连以形成CPU中断优先级。括号中的值表示IPL3 = 1时的IPL。当IPL3 = 1时,禁止用户中断。2:当NSTDIS = 1(INTCON1<15>)时,IPL<2:0>状态位为只读位。© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-11页
PIC24F系列参考手册寄存器2-2:U-0—bit 15U-0—bit 7图注:R = 可读位-n = POR值bit 15-4bit 3C = 可清零位W = 可写位U = 未实现,读为0x = 未知1 = 置1 0=清零未实现:读为0IPL3:CPU中断优先级状态位(1)1 = CPU中断优先级高于70 = CPU中断优先级等于或低于7PSV:数据空间中的程序空间可视性使能位1 = 程序空间在数据空间中可视0 = 程序空间在数据空间中不可视未实现:读为01:当IPL3 = 1时,禁止用户中断。U-0—U-0—U-0—R/C-0IPL3(1)R/W-0PSVU-0—U-0—bit 0CORCON:内核控制寄存器U-0—U-0—U-0—U-0—U-0—U-0—U-0—bit 8bit 2bit 1-0注DS39703A_CN 第2-12页超前信息© 2007 Microchip Technology Inc.
第2章 CPU2.4.22.4.2.1其他PIC24F CPU控制寄存器TBLPAG:表页地址指针以下所列的寄存器与PIC24F CPU内核相关,本手册的其他章节会对它们进行更详细的说明。TBLPAG寄存器用于在表读和表写操作过程中保存程序存储器地址的高8位。表指令用于在程序存储空间和数据存储空间之间传送数据。更多详细信息,请参见第4章“程序存储器” (请访问Microchip网站查看是否提供)。2.4.2.2PSVPAG:程序存储器可视性页地址指针程序空间可视性允许用户将程序存储空间的32 KB区域映射到数据地址空间的高32 KB。此特性允许通过在数据存储器上操作的PIC24F指令对常数数据进行透明访问。PSVPAG寄存器选择映射到数据地址空间的程序存储空间的32 KB区域。关于PSVPAG寄存器的更多信息,请参见第4章“程序存储器” (请访问Microchip网站查看是否提供)。22.4.2.3DISICNT:禁止中断计数寄存器CPUDISI指令使用DISICNT寄存器将优先级为1-6的中断在指定的几个周期内禁止。更多信息,请参见第8章“中断”。2.5 算术逻辑单元(ALU)PIC24F ALU为16位宽,能进行加、减、单位移位和逻辑运算。除非另外声明,算术运算一般是以二进制补码方式进行的。根据不同的操作,ALU可能会影响SR寄存器中的进位/借位(C)、零(Z)、负(N)、溢出(OV)和半进位/借位(DC)状态位的值。在减法操作中,C和DC状态位分别作为借位和半借位位。根据所使用的指令模式,ALU可以执行8位或16位操作。根据指令的寻址模式,ALU操作的数据可以来自W寄存器阵列或数据存储器。同样,ALU的输出数据可以被写入W寄存器阵列或数据存储单元。关于受到指令、寻址模式和8位/16位指令模式影响的SR位的信息,请参见“dsPIC30FProgrammer’s Reference Manual”(DS70030)。注1:字节操作使用16位ALU,并可以产生再加8位的结果。但是,如果要保持和PIC器件的向后兼容性,所有字节操作的ALU结果必须被写回为一个字节(即,不修改MSB),并且只根据结果LSB的状态更新CPU STATUS寄存器SR。2:字节模式中执行的所有寄存器指令只会影响W寄存器的LSB。可以使用访问W寄存器的存储器映射内容的文件寄存器指令修改任何W寄存器的MSB。
© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-13页
PIC24F系列参考手册2.6 乘法和除法支持2.6.1概述PIC24F内核包含一个17位x17位的乘法器,可以用以下乘法模式进行无符号、有符号或混合符号运算:1.2.3.4.5.6.7.1.2.3.4.16位x16位有符号16位x16位无符号16位有符号x5位(立即数)无符号16位无符号x16位无符号16位无符号x5位(立即数)无符号16位无符号x16位有符号8位无符号x8位无符号32位有符号/16位有符号除法32位无符号/16位无符号除法16位有符号/16位有符号除法16位无符号/16位无符号除法除法模块能够支持以下数据大小的32位/16位和16位/16位有符号和无符号整数除法运算:2.6.2乘法器图2-8给出了乘法器的框图。它用于支持包含16位有符号、无符号和混合符号整数乘法的乘法指令,包括PIC18F无符号乘法MULWF(MUL.w和MUL.b)。所有乘法指令都只支持结果的寄存器直接寻址模式。32位结果(来自MULWF以外的乘法)被写入任何两个对齐的连续W寄存器对,但W15:W14因不允许写入而除外。MULWF指令可选择使用字节或字大小的操作数。目标总是W阵列中的W3:W2寄存器对。字节被乘数会把16位结果置于W2(W3不变),字被乘数会把32位结果置于W3:W2。注:乘法指令的目标寄存器对必须是“对齐”的(即奇:偶),其中“奇”包含结果字的最高有效位,“偶”包含结果字的最低有效位。例如,W3:W2是可接受的,而W4:W3则不行。所有乘法指令(除了MULWF这个特例之外)的被乘数都来自W阵列(第1个字)和数据空间(第2个字)。MULWF的被乘数使用零扩展的13位绝对地址,来自W2(第1个字或字节)和数据空间(第2个字或字节)。提供了其他数据路径以使这些指令可将结果写回到W阵列和数据总线(通过W阵列)中,如图2-8中所示。DS39703A_CN 第2-14页超前信息© 2007 Microchip Technology Inc.
第2章 CPU2.6.2.1单一和混合模式整数简单数据预处理逻辑将所有操作数零扩展或符号扩展至17位,因此无符号、有符号或混合符号乘法都可作为有符号值执行。所有无符号操作数总是零扩展到乘法器输入值的第17位。所有有符号操作数总是零扩展到乘法器输入值的第17位。对于16位无符号乘法,乘法器产生32位无符号结果。对于16位有符号乘法,乘法器产生30位数据和2位符号。对于16位混合模式(有符号/无符号)乘法,乘法器产生31位数据和1位符号。图2-8:乘法器框图结果16:310:15
2CPU17 x 17位乘法器172IR171616混合模式选择161616 x 16W阵列© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-15页
PIC24F系列参考手册2.6.3除法器PIC24F同时具有32位/16位和16位/16位有符号和无符号整数除法运算功能,这是通过单一指令迭代除法实现的。所有除法指令的商都放在W0中,余数放在W1中。16位有符号和无符号DIV指令可为16位除数指定任何W寄存器(Wn),也可为32位被除数指定任何(对齐的)W寄存器对(W(m + 1):Wm)。除法算法需要用一个周期处理除数的每一位,因此32位/16位和16位/16位指令执行所需的周期数是相同的。除法指令必须在一个REPEAT循环内执行完。任何其他执行方式(例如一系列不连续的除法指令)都无法正确运行,因为指令流功能取决于RCOUNT。除法流不会自动设置REPEAT,因此后者必须用正确的操作数值明确执行,如表2-2中所示(REPEAT将执行目标指令{操作数值+ 1}次)。表2-2:指令除法执行时间说明有符号除法:W(m + 1):Wm/Wn → W0; Rem → W1有符号除法:Wm/Wn → W0; Rem → W1无符号除法:W(m + 1):Wm/Wn → W0; Rem → W1无符号除法:Wm/Wn → W0; Rem → W1迭代18181818REPEAT操作数值17171717总执行时间(包括REPEAT)19191919每次迭代后,所有中间数据都保存在W1:W0中。N、C和Z状态标志用于在迭代之间传递控制信息。因此,尽管除法指令列为19个周期的操作,但除法迭代过程是可以中断的,这与任何其他REPEAT循环相同。被零除会产生算术错误陷阱。在除法指令的第一个周期内取出除数,因此第一个周期在陷阱的异常处理开始前就执行了。更多详细信息,请参见第8章“中断”。DS39703A_CN 第2-16页超前信息© 2007 Microchip Technology Inc.
第2章 CPU2.7 编译器友好架构内核架构的设计可生成高效(代码长度和速度)的C编译器。
•对于大多数指令,内核能在每个指令周期内执行一次数据(或程序数据)存储器读操作、一次工作寄存器(数据)读操作、一次数据存储器写操作和一次程序(指令)存储器读操作。因此可以支持3个参数的指令,使A + B = C操作能在单个周期内执行。
•指令寻址模式很灵活,非常符合编译器的需求。•有16个16 x 16位的工作寄存器阵列,每个都可以充当数据、地址或地址偏移寄存器。1个工作寄存器(W15)作为软件堆栈工作,用于中断和调用。•支持整个数据空间的线性间接访问,加上存储器直接寻址范围扩展到了8 KB,还有16位直接地址装入和存储指令。•通过新的表读和表写指令使用任何工作寄存器,支持线性间接访问程序空间(用户空间和测试空间)内的32K 字(64 KB)。•部分数据空间可映射到程序空间内,访问常数数据时就像它在使用PSV模式的数据空间中一样。2CPU2.8 多位移位支持PIC24F内核支持使用移位器模块进行单周期、多位算术和逻辑移位。它还支持通过ALU进行单位移位。多位移位器能够在单个周期内执行最多15位的算术右移或最多15位的左移。下表2-3中提供了使用移位操作的指令的完整汇总。表2-3:指令ASRSLLSR将源寄存器算术右移1位或多位。将源寄存器左移1位或多位。将源寄存器逻辑右移1位或多位。使用单位和多位移位操作的指令说明所有多位移位指令都只支持操作数源和结果目标的寄存器直接寻址模式。© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-17页
PIC24F系列参考手册2.9 指令流类型PIC24F架构中的大多数指令占用程序存储器的一个字并在单个周期内执行。指令预取机制方便了单周期(1 TCY)执行。但是,某些指令的执行需要2或3个指令周期。因此,PIC24F架构中有6种不同类型的指令流。下面对它们进行了说明:1.例2-6:1个指令字,1个指令周期:执行这些指令需要一个指令周期,如例2-6中所示。
单字单周期指令流TCY0TCY1执行1取指2执行2取指3执行3TCY2TCY3TCY4TCY51. MOV#350, W02. INCW0, W23. INC[W0++], W2取指12.1个指令字,2个指令周期:这些指令包括相对转移、相对调用、跳过和返回指令。当指令改变PC(除了递增以外)时,流水线执行的预取指数据必须被丢弃。这使指令执行需要两个有效周期,如例2-7中所示。例2-7:单字双周期指令流TCY0TCY1执行1取指2执行2执行跳过取指3强制NOP取指4执行4取指5强制NOP取指SUB_1执行SUB_1TCY2TCY3TCY4TCY5TCY61. MOV#55, W0取指12. , #33. ADD.b,PORTB4. BRA5. ADD.b| | |6. Instruction @ address SUB_1SUB_1W0, [W1], [W2]3.1个指令字,2个指令周期(双操作):这一类型的指令只有LDDW和STDW指令(装入和存储双字)。因为数据访问必须是顺序的,完成这些指令需要两个周期,如例2-8中所示。例2-8:单字双周期指令流
TCY0TCY1执行1取指2执行2R/W周期1取指3执行2R/W周期2不取指执行3取指4执行4TCY2TCY3TCY4TCY51. MOV.w2. MOV.D3. MOV.w#1234, W2[W2++], W40x0AA, W0取指14. MOV.b,PORTADS39703A_CN 第2-18页超前信息© 2007 Microchip Technology Inc.
第2章 CPU4.1个指令字,2个指令周期表操作:这些指令将暂停取指令,向程序存储器中插入读或写周期。执行表操作时取得的指令将被保存一个周期,在紧接该表操作的下一个周期执行,如例2-9中所示。例2-9:指令流——表操作
TCY0TCY1执行1取指2执行2取指3PM数据读周期总线读执行3取指4执行4TCY2TCY3TCY4TCY51. MOV3. MOV#0x1234, W0#0x00AA, W1取指12. TBLRDL.w[W0++], W124. MOV#0x00CC, W05.2个指令字,2个指令周期(GOTO和CALL):
在这些指令中,指令后的取指包含数据。如例2-10中所示,这会产生一个双周期指令。如果CPU只取了双字指令的第2个字而未取第1个字,则第2个字将被编码以作为NOP执行。这在双字指令被跳过指令跳过时尤其重要(见例2-13)。CPU例2-10:双字双周期指令流
TCY0TCY1执行1取指2L更新PC取指2H强制NOP取指3执行3取指4执行4TCY2TCY3TCY4TCY51. MOV2. GOTO#0xAA55, W0LABEL取指13. LABEL:MOV W0, W24. BSETPORTA, #36.地址寄存器相依性:由于数据空间的读写操作之间存在数据地址的相依性,这些指令会遭遇停顿(stall)。为了解决这种资源冲突,插入了一个额外的周期(见第2.11节“地址寄存器相依性”中的说明)。例2-11:单字单周期(带指令停顿)指令流TCY0TCY1执行1取指2执行1停顿执行2取指3执行3TCY2TCY3TCY4TCY51. MOVW0, W12. MOV[W1], [W4]3. MOVW2, W1取指1© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-19页
PIC24F系列参考手册2.10 程序流循环控制PIC24F支持REPEAT指令结构,以提供无条件自动程序循环控制。REPEAT指令用于实现单指令程序循环。该指令使用CPU STATUS寄存器SR中的控制位来临时修改CPU 操作。
2.10.1REPEAT循环REPEAT指令会使紧随其后的一条指令重复一定次数。可以使用指令中的立即数值或某个W寄存器中的值来指定REPEAT计数值。使用W寄存器的值时可使循环计数为软件变量。REPEAT 循环中的指令至少执行一次。REPEAT循环的迭代次数是14位立即数值+ 1或Wn + 1。下面列出了两种REPEAT指令的语法形式:例2-12:REPEAT#lit14(有效目标指令)REPEAT指令语法; RCOUNT <-- lit14或REPEATWn(有效目标指令); RCOUNT <-- Wn2.10.1.1REPEAT操作
REPEAT操作的循环计数保存在14位RCOUNT寄存器中,该寄存器是存储器映射的。RCOUNT由REPEAT指令初始化。如果RCOUNT为非零值,REPEAT指令将REPEAT有效状态位RA(SR<4>)置为1。
RA是只读位,不能用软件修改。REPEAT循环计数值大于0时,PC不会递增。PC递增被禁止直到RCOUNT=0。REPEAT循环的指令流示例请参见例2-13。对于等于0的循环计数值,REPEAT的作用相当于NOP,并且RA(SR<4>)位不置1。REPEAT循环在开始前实际上是被禁止的,这样可以在预取后续指令时(即在正常的执行流程中)让目标指令只执行一次。注:紧随REPEAT指令之后的指令(即目标指令)总是至少执行一次。此指令的执行次数总是会比14位立即数或W寄存器操作数的指定值多一次。例2-13:REPEAT指令流水线流程TCY0TCY1执行1取指2执行2不取指执行2不取指执行2取指3PCx0PC + 221PC + 211PC + 200PC + 400执行3PC + #0x2[W0++], [W1++]取指RTA, #3PC(指令结束时)RCOUNT(指令结束时)RA(指令结束时)DS39703A_CN 第2-20页超前信息© 2007 Microchip Technology Inc.
第2章 CPU2.10.1.2中断REPEAT循环REPEAT指令循环可在任何时候被中断。
在异常处理期间,RA状态保留在堆栈中以便让用户在任何数量的中断嵌套中进一步执行REPEAT循环。SRL存入堆栈后,RA状态位被清零以便从ISR内部恢复正常执行流程。
注:如果REPEAT循环被中断且正在处理ISR,则用户在ISR内部执行另一条REPEAT指令前,必须先将RCOUNT(REPEAT循环计数器)寄存器存入堆栈。如果在ISR内部使用REPEAT,用户在执行RETFIE前必须先将RCOUNT的值出栈。 注:使用RETFIE从ISR返回REPEAT循环不需要任何特殊处理。中断会在RETFIE的第3个周期预取要重复的指令。当SRL寄存器被弹出堆栈时,堆栈的RA位将会恢复。此时如果它置1,那么中断的REPEAT循环将会恢复。
注:如果重复的指令(REPEAT循环中的目标指令)要使用程序空间可视性(PSV)访问程序空间(PS)中的数据,从异常处理程序中返回后第一次执行该指令将需要两个指令周期。类似于循环中的第一次迭代,时序限制将不允许第一条指令在单个指令周期内访问驻留在PS中的数据。2CPU2.10.1.2.1REPEAT循环的提前终止通过用软件将RCOUNT寄存器清零,可以在ISR中比正常情况提前终止中断的REPEAT循环。指令的限制除了以下指令外,其他指令均可紧随REPEAT之后:程序流控制指令(任何转移、比较和跳过、子程序调用或返回等指令)。另一条REPEAT 指令。DISI、ULNK、LNK、PWRSAV或RESET指令。MOV.D指令。© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-21页
PIC24F系列参考手册2.11 地址寄存器相依性PIC24F架构支持大多数指令的数据空间读取(源)和数据空间写入(目标)操作。地址生成单元(Address Generator Unit,AGU)进行的有效地址(EA)计算和后续数据空间读或写,每个都需要一个指令周期来完成。如图2-9中所示,此时序导致每条指令的数据空间读和写操作部分重叠。由于这一重叠,“先写后读”(Read-After-Write,RAW)数据相依性可能会在指令边界处发生。RAW数据相依性在运行时由PIC24F CPU检测并处理。图2-9:数据空间访问时序ADD
W0, [W7], [W10]MOV [W8], [W9]++1个指令周期(TCY)TCY0指令寄存器内容读AGU[W7][W10]TCY1TCY2ADD[W8]MOV写AGU[W9]++地址W7W10W8W92.11.1先写后读相依性规则如果工作寄存器Wn在当前指令中被用作写操作目标,并且预取指令读取的也是同一个工作寄存器Wn,则适用以下规则:1.2.如果对目标的写入(当前指令)不修改Wn的内容,则不发生停顿;或如果对源的读取(预取指令)不使用Wn计算EA,也不会发生停顿。在每个指令周期中,PIC24F硬件会自动检查以确定是否将发生RAW数据相依性。如果不满足上述条件,CPU会在执行预取指令前自动增加一个指令周期的延时。指令停顿使目标W寄存器有足够的时间先执行写入,再让下一条(预取的)指令使用写入的数据。DS39703A_CN 第2-22页超前信息© 2007 Microchip Technology Inc.
第2章 CPU表2-4:先写后读相依性汇总使用Wn的源寻址模式直接寻址间接寻址带有修改的 间接寻址直接寻址间接寻址带有修改的间接寻址直接寻址间接寻址状态允许停顿停顿允许允许允许允许停顿示例(Wn = W2)ADD.w W0, W1, W2MOV.w W2, W3ADD.w W0, W1, W2MOV.w [W2], W3ADD.w W0, W1, W2MOV.w [W2++], W3ADD.w W0, W1, [W2]MOV.w W2, W3ADD.w W0, W1, [W2]MOV.w [W2], W3ADD.w W0, W1, [W2]MOV.w [W2++], W3ADD.w W0, W1, [W2++]MOV.w W2, W3ADD.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], W3ADD.w W0, W1, [W2++]MOV.w [W2++], W3使用Wn的目标寻址模式直接寻址直接寻址直接寻址间接寻址间接寻址间接寻址带有修改的间接寻址间接寻址2CPU间接寻址带有修改的间接寻址停顿带有修改的间接寻址带有修改的间接寻址间接寻址带有修改的间接寻址停顿停顿2.11.2指令停顿周期指令停顿实际上是附加在指令读阶段前的一个指令周期的等待时间,以便让前面的写操作先完成再发生下一个读操作。为了达到中断延时的目的,应该注意停顿周期与检测到它的指令后的那条指令是相关的(即停顿周期总是在指令执行周期之前)。如果检测到了RAW数据相依性,PIC24F将开始指令停顿周期。在指令停顿期间,会发生以下事件:1.2.3.4.正在进行的(上一条指令的)写操作可以正常完成。在指令停顿周期结束前不会寻址数据空间。在指令停顿周期结束前禁止PC递增。在指令停顿周期结束前禁止再次取指。2.11.2.11.指令停顿周期和中断当会造成指令停顿的两个相邻指令与中断事件同时发生时,可能会产生以下两个结果之一:中断可能会在第一条指令执行时发生。在这种情况下,允许第一条指令完成,而第二条指令则将在ISR完成后执行。这样,由于异常过程为第一条指令提供了完成写阶段的时间,停顿周期将在第二条指令中被消除。中断可能会在第二条指令执行时发生。在这种情况下,允许第二条指令和附加的停顿周期在ISR前执行。这样,与第二条指令关联的停顿周期会正常执行。但是,停顿周期实际上会被嵌入到异常过程时序内。如果一个正常的双周期指令被中断,异常过程将会继续。2.© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-23页
PIC24F系列参考手册2.11.2.2指令停顿周期和流程更改指令CALL和RCALL指令使用W15写入堆栈,并且如果下一条指令读取的源使用W15,可能会因此在下一条指令前强制执行指令停顿。RETFIE和RETURN指令永远不能在下一条指令前强制执行指令停顿,因为这些指令都只能执行读操作。但是,用户应该注意RETLW指令能强制执行停顿,因为它会在最后一个周期写入W寄存器。由于GOTO和转移指令不执行写操作,因此永远不能强制执行指令停顿。
2.11.2.3指令停顿和REPEAT循环除了增加指令停顿周期外,RAW数据相依性不会影响REPEAT循环的操作。
REPEAT循环中预取的指令在循环完成或发生异常前不会改变。虽然寄存器相依性检查会跨指令边界进行,在REPEAT循环中PIC24F实际上会比较同一条指令的源和目标地址。2.11.2.4指令停顿和程序空间可视性(PSV)程序空间可视性(PSV)使能并且有效地址(EA)处于可视的PSV窗口中时,读或写周期会被重新定向到程序空间中的地址。从程序空间访问数据最多需要3个指令周期。PSV地址空间的指令操作与任何其他指令一样,会受到指令停顿的影响。虽然指令停顿和PSV周期都在指令开始时发生,但它们不可能组合起来。如果停顿和PSV周期碰巧同时发生,停顿周期将被强制占先,然后是PSV周期,最后是指令周期。看以下代码段:ADDMOVW0, [W1], [W2++][W2], [W3]; PSV = 1,W1=0x8000,PSVPAG=0xAA此指令序列将需要5个指令周期来执行。增加的2个指令周期用于通过W1执行PSV访问。此外,为了解决W2造成的RAW数据相依性,插入了一个指令停顿周期。指令停顿期间,ROM锁存值在第一个周期的Q1上升沿被传送到IR,读取的闪存数据在指令第二个周期的Q3上升沿被传送到ROM锁存器,如图2-9中所示。
DS39703A_CN 第2-24页超前信息© 2007 Microchip Technology Inc.
© 2007 Microchip Technology Inc.2.12 寄存器映射表2-5中提供了与PIC24F CPU内核相关的寄存器汇总。表2-5:内核SFR存储器映射(用户模式)名称Bit 15Bit 14Bit 13Bit 12Bit 11Bit 10Bit 9Bit 8Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0所有复位时W0工作寄存器00000W1工作寄存器10000W2工作寄存器20000W3工作寄存器30000W4工作寄存器40000W5工作寄存器50000W6工作寄存器60000W7工作寄存器70000W8工作寄存器80000W9工作寄存器90000W10工作寄存器100000W11工作寄存器110000W12工作寄存器120000超前信息W13工作寄存器130000W14工作寄存器140000W15工作寄存器150800SPLIM堆栈指针限制xxxxPCL程序计数器,低字节0000PCH————————程序计数器,高字节0000TBLPAG————————表页地址指针0000PSVPAG————————程序存储器可视性页地址指针0000RCOUNTRepeat 循环计数器xxxxSR———————DCIPL2IPL1IPL0RANOVZC0000CORCON————————————IPL3PSV——0000DISICNT——禁止中断计数器xxxx图注:x = 复位时的未知值,— = 未实现,读为0。所示复位值为十六进制。注1:关于特定内核寄存器映射的详细信息,请参见器件数据手册。DS39703A_CN
第2-25页UPC2第2章 CPU
PIC24F系列参考手册2.13 相关应用笔记本节列出了与手册的本章内容相关的应用笔记。这些应用笔记可能并不是专为PIC24F器件系列而编写的,但是概念是相关的,通过适当修改即可使用,但在使用中可能会受到一定限制。当前与CPU相关的应用笔记有:标题目前没有相关的应用笔记。应用笔记编号注:如需获取更多PIC24F系列器件的应用笔记和代码示例,请访问Microchip网站()。DS39703A_CN 第2-26页超前信息© 2007 Microchip Technology Inc.
第2章 CPU2.14 版本历史版本A(2006年4月)这是本文档的初始发行版。2CPU© 2007 Microchip Technology Inc.超前信息DS39703A_CN 第2-27页
PIC24F系列参考手册注:DS39703A_CN 第2-28页超前信息© 2007 Microchip Technology Inc.


发布评论