作为CPU的基本组成部分,寄存器的主要作用如下:
①暂存算术运算或逻辑运算的操作数,如被加数、被减数或乘数等。
②暂存指令执行的结果,如和、差或乘积等。
⑤专用功能或特殊功能,如指令执行的状态位(溢出、进位等)指示、CPU中断控制以及DSP模式控制等。
表3-1列出了C28x DSP的CPU寄存器及其复位后的值。
表3-1 C28x DSP的CPU寄存器
(续)
下面分别详细介绍一些主要寄存器的功能。
(1)累加器(ACC、AH、AL)
累加器(ACC)是CPU的主要工作寄存器。除了那些对存储器和寄存器的直接操作外,所有的ALU操作结果最终都要送入ACC。ACC支持单周期的数据传送操作、加法运算、减法运算以及来自数据存储器的宽度为32位的比较运算,它也可以接受32位乘法操作的运算结果。ACC有一个非常重要的特点就是它既可以被作为一个32位的寄存器使用,也可以被拆解成两个16位的寄存器AH(高16位)和AL(低16位),它们可以被单独访问,甚至AH和AL的高8位和低8位也可以通过专用字节传送指令进行独立访问,这使得有效字节捆绑和解捆绑操作成为可能。ACC可以单独存取的结构如图3-3所示。
图3-3 累加器可以单独存取的结构
累加器还影响以下一些相关状态位:
①溢出模式位(OVM)。
②符号扩展模式位(SXM)。
③测试/控制标志位(TC)。
④进位标志位(C)。
⑤零标志位(Z)。
⑥负标志位(N)。
⑦溢出标志位(V)。
⑧溢出计数位(OVC)。
下面是使用累加器ACC指令的例子:
ABS ACC ;对累加器内容求绝对值,ACC为32位寄存器
ADD AH,loc16 ;把16位的数与AH内容相加,loc16表示一个16位的存储单元
(2)乘数寄存器(XT、T、TL)和乘积寄存器(P、PH、PL)
C28x CPU的硬件乘法器可以进行一个16位×16位或者32位×32位的定点乘法运算。在进行32位×32位乘法操作之前,XT寄存器存放32位乘数。XT可被分为两个独立的16位寄存器T和TL,如图3-4所示,在进行一个16位×16位的乘法运算时,T寄存器存放16位的乘数。TL寄存器可以被装载一个16位的有符号数,这个数会被自动进行符号扩展以填充32位的XT寄存器。
图3-4 乘数寄存器XT的分半单独存取结构
32位的乘积寄存器P(Product)主要用来存放乘法运算的结果。它也可以直接被装入一个16位常数,或者从一个16位/32位的数据存储器、16位/32位的可寻址CPU寄存器以及32位累加器中读取数据。P寄存器可被分解成两个独立的16位寄存器PH(高16位)和PL(低16位)来使用,如图3-5所示。
图3-5 P寄存器的分半单独存取结构
下面给出了使用乘数寄存器和乘积寄存器指令的例子:
MPYP,T,loc16 ;把存放在寄存器T中的16位有符号数乘以loc16地址
存放的16位有符号数,32位的结果存放在P寄存器中
IMPYL P,XT,loc32;把存放在XT中的32位数乘以loc32地址内存放的32位有符号数,
乘积移位模式(PM)的值决定64位结果的低32位的哪一部分被
保存在P寄存器中
(3)数据页指针寄存器(DP)
与其他通用处理器一样,C28x也设置了指令操作数的直接寻址方式。在直接寻址方式中,操作数的地址由两部分组成:一个页地址(Data Page)和一个页内的偏移量(Offset)。C28x的数据存储器每64个字构成一个数据页,这样,4MW的数据存储器共有65536个数据页,用0~65535进行标号,如图3-6所示。在直接寻址方式下,当前的页地址存放于16位的数据页指针寄存器(DP)中,可以通过给DP赋新值可改变数据页号。当CPU工作在C2xLP(C24x DSP的CPU内核)源兼容模式时,使用一个7位的偏移量,并忽略DP寄存器的最低位。
图3-6 数据存储器的数据页
下面的指令实现了装载页指针DP的操作:
MOV DP,#10 bit ;把10位的立即数赋给DP,DP的高6位保持不变
MOVW DP,#16 bit;把16位的立即数赋给DP
(4)堆栈指针(SP)
堆栈指针(SP)允许在数据存储器中使用软件堆栈。堆栈指针为16位,可以对数据空间的低64KW(数据存储器0000H~FFFFH)进行寻址。
堆栈操作说明如下:
●堆栈从低地址向高地址增长。
●SP总是指向堆栈中的下一个空单元。
●复位时,SP被初始化指向地址0400H。
●将32位数值存入堆栈时,先存入低16位,然后将高16位存入下一个高地址中。
●当读写32位的数值时,C28x CPU期望存储器或外设接口逻辑把读写排成偶数地址。例如,如果SP包含一个奇数地址0083H,那么进行一个32位的读操作时,将从地址0082H和0083H中读取数值。
●如果增加SP的值,使它超过FFFFH,或者减少SP的值,使它低于0000H,则表明SP已经溢出。如果增加SP的值使它超过了FFFFH,它就会从0000H开始计数。例如,如果SP=FFFEH而一个指令又使得SP加2,则结果就是0000H。当SP的值使它到达0000H再减少,它就会重新从FFFFH计数。例如,如果SP=0002H,而一个指令又使SP减4,则结果就是FFFEH。
●当数值存入堆栈时,SP并不要求排成奇数或偶数地址,排列由存储器或外设接口逻辑完成。(www.daowen.com)
下面的指令说明了如何利用堆栈对寄存器内容进行保护:
PUSH ACC ;将累加器ACC的32位的内容压入堆栈,堆栈指针SP内容加2
POP ACC ;将SP的内容减2,然后将其指向的堆栈的内容弹入累加器ACC
(5)辅助寄存器(XAR0~XAR7、AR0~AR7)
CPU提供8个32位的辅助寄存器:XAR0、XARl、XAR2、XAR3、XAR4、XAR5、XAR6和XAR7(XARn,n=0~7)。在间接寻址方式中,它们存放指向数据存储器的指令操作数的地址指针,XAR0~XAR7也可以作为通用目的寄存器来使用。许多指令可以访问XAR0~XAR7的低16位,XAR0~XAR7的低16位就是辅助寄存器AR0~AR7,如图3-7所示,它们被用作循环控制或16位的通用目的寄存器。
图3-7 XAR0~XAR7寄存器
当访问AR0~AR7时,寄存器的高16位(AR0H~AR7H)可能改变或不改变,这主要取决于所应用的指令。AR0H~AR7H只能作为XAR0~XAR7的一部分来读取,不能单独进行访问。为了进行累加器操作,所有的32位都是有效的(@XAR)。为了进行16位操作,可以运用低16位,而高16位则不能使用(@ARn)。也可以根据指令使XAR0~XAR7指向程序存储器的任何值。
(6)程序计数器(PC)
C28x的程序计数器(PC)是一个22位的寄存器,存放当前CPU正在操作指令的地址。对于C28x的流水线结构,在流水线满的时候,PC指向的当前正在操作的指令即刚刚到达流水线的第二阶段即译码阶段的指令。一旦指令到达了流水线的这一阶段,它就不会再被中断或从流水线中清除掉,而是会一直执行完才会响应中断。
(7)返回PC指针寄存器(RPC)
C28x CPU有两对用于子程序长调用的指令:LC和LRET,LCR和LRETR。所谓长调用即调用指令直接使用22位的函数入口地址,即可以在0x00 0000~0x3F FFFF的程序空间内进行操作。这两对长调用指令中,LCR和LRETR比LC和LRET的执行效率更高,而LCR和LRETR指令将使用RPC寄存器,其他调用指令不使用RPC寄存器。当使用LCR指令执行一个长调用操作时,当前RPC的值会被压入堆栈(以16位方式分两次操作)。接下来,返回地址将被装载到RPC寄存器中,而22位的函数入口地址将被装载到PC,从而使流程转入函数体中运行。当调用结束通过LRETR指令返回时,存放在RPC寄存器内的返回地址会被装载到PC中,而以前压入堆栈中的RPC寄存器的值将从堆栈中装载到RPC寄存器内(以两个16位的操作)。
;子程序FuncA的RPC调用
LCR FuncA ;调用FuncA,返回地址存放在RPC寄存器内
…
FuncA: ;子程序FuncA
…
LRETR;执行RPC返回
(8)中断控制寄存器(IFR、IER、DBGIER)
C28x有3个寄存器用于中断控制:中断标志寄存器(IFR)、中断使能寄存器(IER)和调试中断使能寄存器(DBGIER)。IFR的每个位代表一个中断源的中断请求,当该位被置位时,将向CPU申请中断,而IER的各位则用于屏蔽或使能对应的中断请求,DBGI⁃ER与IER功能类似,但它只在DSP工作于实时仿真模式时被使用。如果用户正在通过仿真器对应用程序进行调试并且CPU被暂停,此时那些在DBGIER中被使能的中断请求仍然能够被CPU响应,这些在DBGIER中被使能的中断称为时间敏感(TimeCritical)中断。在使用DBGIER使能时间敏感中断时,IER内对应的位也必须同时使能。如果在实时仿真模式下,CPU处于运行状态,则标准的中断响应和处理机制被使用,而DBGIER的内容被忽略。
(9)状态寄存器(ST0、STl)
C28x CPU有两个重要的状态寄存器:ST0和ST1,其中包含着不同的标志位和控制位。ST0包含指令操作所使用或影响的控制或标志位,如溢出、进位、符号扩展等。ST1则主要包含一些特殊的控制位,如处理器的兼容模式选择、寻址模式配置等。ST0和ST1的内容可以保存到数据存储器中,或者从数据存储器中装载,从而实现CPU状态的保存和恢复。
1)状态寄存器ST0。图3-8给出了CPU的状态寄存器ST0的格式。
图3-8 CPU状态寄存器ST0的格式
●OVC/OVCU:溢出计数器(Overflow Counter)。在有符号数的操作中,溢出计数器是一个6位的有符号计数器OVC,它的值是-32~+31,用以保存累加器ACC的溢出信息(取决于溢出模式OVM的不同设置);在无符号数操作中,该位为OVCU,当执行ADD加法操作产生一个进位时,OVCU递增,当执行SUB减法操作产生一个借位时,OVCU递减。
●PM:乘积移位模式位。这三位的值决定了任何从乘积寄存器P的输出操作的移位模式。
●V:溢出标志。如果指令操作结果引起保存结果的寄存器产生溢出时,V置位或锁定;如果没有溢出发生,则V不改变。
●N:负标志位。在某些操作中,若操作结果为负则N被置位;若操作结果为正则N被清零。
●Z:零标志。若操作结果为零则Z被置位;若操作结果非零则被清零。
●C:进位位。该位置位表明一个加法或者增量操作产生了进位,或者一个减法、比较或减量操作未产生借位。
●TC:测试/控制标志。该位表示位测试指令(TBIT指令)完成测试的结果,或者指令NORM执行的结果。
●OVM:溢出模式位。当ACC接收加减结果,若结果产生溢出,则OVM=0或1决定CPU如何处理溢出。
●SXM:符号扩展模式位。在32位累加器中进行16位操作时,SXM会影响MOV、ADD以及SUB指令。
2)状态寄存器ST1。与ST0寄存器不同,ST1寄存器内部包含着一些影响处理器运行模式、寻址模式以及调试和中断控制位等,无论是采用汇编语言编程或者C语言编程,ST1寄存器都是重要的CPU寄存器,在程序初始化的阶段,用户必须对ST1进行合适的配置。图3-9给出了CPU的状态寄存器ST1的格式。
图3-9 CPU状态寄存器ST1的格式
●ARP:辅助寄存器指针(Auxiliary Register Pointer)。这三位用于选择8个32位的辅助寄存器XAR0~XAR7中的一个作为当前辅助寄存器。
●XF:XF状态位。该位用于控制输出引脚XF的状态,它与C2x LP CPU兼容。对于该位的控制一般通过两条汇编语言来实现:SETC XF指令进行置位;CLRC XF指令进行清0。如果在C语言环境下,一般也是通过asm编译器命令在C代码中嵌入这两条汇编语言,如asm(“SETC XF”)或者asm(“CLRC XF”)。
●M0M1MAP:存储器M0和M1映射模式位。在C28x目标模式下,M0M1MAP应该一直保持为1,这也是复位后的默认值。当CPU操作于C27x兼容模式下,该位可以被置为0;但是对于C28x,该位应该总是被置为1,M0M1MAP=0的情况仅供TI在测试时使用。
●Reserved:保留。
●OBJMODE:目标兼容模式位。用来在C27x目标模式(OBJMODE=0)和C28x目标模式(OBJMODE=1)之间进行选择。所谓目标兼容模式是指C28x DSP可以兼容以前的C27x器件的寻址方式和指令代码,当然这种兼容性通过OBJMODE和AMODE两个标志位进行选择。如果选择C28x模式(OBJMODE=1,AMOD=0),则所有C28x的特性包括寻址方式和指令都能被使用。需要注意的是,在上电复位后,OBJMODE=0,表示器件处于C27x目标模式,需要用户通过编程配置其进入C28x模式。汇编指令C28OBJ或SETC OBJMODE用于将OBJMODE置1,C27OBJ或CLRC OBJMODE指令用于将OBJMODE清零。
●AMODE:寻址模式位。该位允许用户在C28x/C2xLP指令寻址模式(AMODE=0)和C2xLP指令寻址模式(AMODE=1)之间进行选择。复位默认C28x寻址模式方式。
●IDLESTAT:空闲状态位。该位是只读位,当执行IDLE指令时,该位会被置位,随后CPU进入低功耗模式;而下列任一情况均可使其复位:①中断发生后;②中断没有发生但CPU退出IDLE状态;③一个无效指令进入指令寄存器;④某一个外设产生复位。当CPU响应中断时,当前IDLESTAT的值被存储到堆栈中(随ST1寄存器被保存),然后IDLESTAT位被自动清零。当中断服务程序结束并返回时,IDLESTAT不从堆栈中恢复。
●EALLOW:仿真允许访问使能位。C28x的仿真寄存器和其他受保护的外设寄存器,当用户要对其进行访问时需要将EALLOW位置1。两条汇编指令被用于对EALLOW位进行置位和清零操作:EALLOW指令用于置位,EDIS指令用于清零。通常这两条汇编语言的引用语句被定义成两条同名的宏命令:EALLOW宏和EDIS宏。故在C语言编程时,可以直接使用宏来使能或禁止EALLOW保护的寄存器的读写操作,例如:
EALLOW; //EALLOW宏,使能EALIOW位,允许对保护寄存器的访问
//#defineEALLOW asm(“EALLOW”)
PLLCR=0x0000; //对受EALLOW保护的PLLCR寄存器进行赋值操作
EDIS; //EDIS宏,清零EALLOW位,禁止对保护寄存器的访问
//#defineEDIS asm(“EDIS”)
当CPU响应中断时,当前EALLOW的值被存储到堆栈中(随ST1寄存器被保存),然后EALLOW位被自动清零,因此在中断服务程序的开始,访问EALLOW保护的寄存器是被禁止的,如果用户需要对这些寄存器进行访问,那么必须将EALLOW重新置位。当中断服务程序结束并返回时,存储在堆栈中的EALLOW值会被恢复。
●LOOP:循环指令状态位。当循环指令LOOPNZ或LOOPZ在被CPU执行时,该位被置位;当特定条件满足循环结束时,LOOP位清零。该位为只读位,除了循环指令不受其他指令的影响。当CPU服务于某中断,LOOP位被保存到堆栈(随ST1被保存),然后LOOP位被硬件清零。中断返回时,LOOP不从堆栈中恢复。
●SPA:堆栈指针定位(Stack Pointer Alignment)位。SPA表明CPU是否已通过ASP指令预先把堆栈指针定位到偶数地址上。执行ASP指令时,若堆栈指针SP指向一个奇数地址,则SP加1以使它指向偶数地址,同时SPA被置位;若SP已经指向一个偶数地址,则SP不改变。
●VMAP:向量映像(Vector Map)位。VMAP决定CPU的中断向量表(包括复位向量)被映像到程序存储器的最低地址还是最高地址。如果VMAP=0,则CPU的中断向量表被映像到存储器的最低地址:0x00 0000~0x00 003F;如果VMAP=1,则CPU中断向量表被映像到高端地址:0x3F FFC0~0x3F FFFF。复位时,VMAP被置位,即CPU中断向量表位于地址高端。
●PAGE0:寻址模式设置位。PAGE0在两个独立的寻址模式之间进行选择:PAGE0直接寻址模式(PAGE0=1)和PAGE1堆栈寻址模式(PAGE0=0)。
●DBGM:调试使能屏蔽位。当DBGM置位时,调试功能被禁止,仿真器将不能实时访问存储器和寄存器,调试器窗口也停止更新,CPU忽略调试暂停或硬件断点请求直到DBGM被清0。当CPU执行一个中断服务程序之前,DBGM的当前值会被保存到堆栈,然后DBGM被置位,关闭调试功能,当中断返回时,DBGM的值将恢复。如果用户希望在中断服务程序中设置断点或者单步运行程序,则必须在中断服务程序开始的地方添加清零DBGM的语句。DBGM的置位和清零采用汇编语言:SETC DBGM(调试事件被禁止),CLRC DBGM(调试事件被使能)。设置DBGM控制的主要作用是使用户能够在时间敏感的代码内阻止调试功能,保证代码的实时运行不受调试器的影响而出错。
●INTM:中断全局屏蔽位。该位可以全局使能和禁止所有的CPU的可屏蔽中断,即为可屏蔽中断的“总开关”。INTM=0,可屏蔽中断被使能;INTM=1,可屏蔽中断被禁止。INTM对于不可屏蔽中断,包括硬件复位和硬件中断没有影响。另外,当CPU在实时仿真模式下被暂停时,即使INTM设置为屏蔽,但由IER和DBGIER使能的中断仍将得到CPU的响应。当CPU服务一个中断时,当前INTM的值随ST1被存储到堆栈中,然后INTM被置位。当中断返回时,INTM将从堆栈中恢复。对INTM的置位或清零分别通过两条汇编语句实现:SETC INTM和CLRC INTM。INTM的值不会引起中断标志寄存器(IFR)、中断使能寄存器(IER)以及调试中断使能寄存器(DBGIER)内容的修改。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。