DSP原理及应用:TMS320F28335架构、功能模块及程序设计
上QQ阅读APP看书,第一时间看更新

2.2 CPU结构

2.2.1 CPU内核

F28335属于C28x+FPU(Floating Point Unit,浮点运算单元)的C28x系列增强型DSP控制器(Digital Signal Controllers,DSC),不仅具有32位定点CPU的架构,而且还包含一个单精度32位浮点运算单元(FPU),浮点数格式遵循IEEE 754标准。IEEE 754是32位浮点数格式,最高位(D31)是符号位,D30D23是8位阶码(即2的幂指数部分,当0<8位阶码<255时,实际阶码=8位阶码-127),D22D0为23位尾数。

F28335具有非常高效的C/C++编译器,能使编程者使用C/C++高级语言开发系统控制软件和数字算法。数学算法任务与系统控制任务的处理效率同样高效,这就节省了很多系统中常常需要第二个微处理器来完成数学算法任务。

F28335的32×32位乘法器、乘累加器(Multiply and Accumulate,MAC)的64位处理能力能提高数字信号处理的分辨率,减少数字处理误差。

F28335具有增强型快速中断响应机制和重要控制寄存器自动写保护机制,并能够以最小的延迟中断处理多个异步事件。

F28335具有8级受保护的流水线和流水线存储器存取机制,保证在不使用昂贵的高速存储器下能高速执行。

F28335具有专门的转移超前硬件,使条件不连续延迟最小化。专门的条件操作存储机制进一步提升了快速性能。

2.2.2 乘法器

F28335内嵌16×16位和32×32位乘法器以及乘累加硬核(MAC),能在一个指令周期内完成32×32位乘法并进行累加运算(MAC运算),使处理数字信号处理算法中常见的MAC运算速度大大提高。还有MOVAD等专用指令,不仅可以一条指令完成累加运算,还可以同时完成移位。

2.2.3 移位器

F28335内置32位桶形移位器,可以对32位累加器和乘法器的运算结果进行左移或右移,完成定点数的重定标等操作,使数字信号处理算法的运算速度比普通微控制器高出一个数量级以上。

2.2.4 总线结构

F28335内存总线结构属于C28x内存总线架构,是一种哈佛总线架构,即在内存和外设之间采用多总线结构。C28x内存总线架构包含一条程序读总线、一条数据读总线和一条数据写总线。程序读总线由22根地址线和32根数据线路组成。数据读写总线由32根地址线和32根数据线组成。32位宽数据总线可实现单周期32位操作。

哈佛总线架构使C28x能够在一个单周期内存取一条指令、读取一个数据和写入一个数据。为连接在内存总线上的所有外设和内存,设定存取内存的优先级。对内存总线存取的优先级概括如下。

最高级:数据写入(内存总线上不能同时进行数据和程序写入),依次是程序写入(不能在内存总线上同时进行数据和程序写入)、数据读、程序读(不能在内存总线上同时进行程序读和取指令)。

最低级:取指令(不能在内存总线上同时进行程序读和取指令)。

1.内存总线

F28335的程序存储器和数据存储器分别独立设置地址总线和数据总线。程序地址总线为22位,程序数据总线为32位,用于对片上ROM和Flash存储器只读存取。数据地址总线为32位,分为数据读地址总线和数据写地址总线。数据总线为32位,分为数据读数据总线和数据写数据总线。C28x+FPU总线结构如图2-2所示。

图2-2 C28x+FPU总线结构框图

2.外设总线

为了实现不同德州仪器DSC系列器件之间的外设迁移,2833x/2823x器件采用一个针对外设互联的外设总线标准。外设总线桥复用了多种总线,此总线将处理器内存总线组装进一个由16条地址线和16条或32条数据线和相关控制信号组成的单总线中。F2833x支持3个版本的外设总线。第1版本只支持16位数据的存取(被称为外设帧2)。第2版本支持16位和32位存取(被称为外设帧1)。第3版本支持DMA存取以及16位和32位数据的存取访问(被称为外设帧3)。

2.2.5 CPU寄存器

F28335有两组CPU寄存器,第一组为标准C28x寄存器组,第二组为FPU寄存器组。C28x寄存器组包括累加器寄存器ACC、乘积寄存器P、乘数寄数器(XT)、辅助寄存器XAR0~XAR7、程序控制寄存器、状态寄存器和中断控制寄存器,如表2-1所示。FPU寄存器组包括浮点结果寄存器R0H~R7H、浮点状态寄存器STF、重复块寄存器RB,如表2-2所示。

表2-1 标准C28x寄存器组

表2-2 FPU寄存器组

由于F28335的软件开发模板全部采用C/C++语言编程,需要C/C++编程可操作的寄存器只有标准C28x寄存器组中的状态寄存器和中断控制寄存器,其他寄存器包括FPU寄存器组对用户而言都是透明的,不需要用户C/C++语言编程操作,故只需要介绍CPU状态寄存器与中断控制寄存器的功能。F2833x有两个CPU状态寄存器,分别是ST0和ST1,这两个寄存器均是16位字长寄存器,其中需要用户C语言编程操作的状态寄存器只有ST1中的4个位域变量,分别是EALLOW,VMAP,INTM,DBGM。CPU中断控制寄存器包括中断使能寄存器(IER)、中断标志寄存器(IFR)和调试中断使能寄存器(DBGIER),这3个寄存器均是16位字长的寄存器。对于大多数用户来说,需要C/C++语言编程操作的中断控制寄存器是IER和IFR。在仿真器调试期间,DBGIER赋予CPU一种当仿真器暂停CPU时,能继续执行时间严格中断服务程序的能力。时间严格中断是指被IER和DBGIER同时使能的可屏蔽中断。

2.2.6 状态寄存器ST0/ST1

ST0的位域定义数据格式如图2-3所示。ST1的位域定义格式如图2-4所示。

图2-3 ST0位域定义数据格式

图2-4 ST1位域定义数据格式

当采用C语言编写F28335的应用程序时,需要C操作的状态寄存器只有ST1中的4个位域变量,即EALLOW、VMAP、INTM、DBGM,其他位域变量对用户而言是透明的,不需要编程访问。因此,下面只介绍这4个位域变量的功能。

1.EALLOW(仿真访问使能位、解锁写保护位)

位域变量EALLOW为仿真访问使能位,系统复位默认值为0,表示禁止对片上外设模块写保护寄存器(包括受EALLOW写保护的片上外设帧和PIE中断向量表)进行写访问。禁止对F2833x的写保护寄存器和仿真空间的写访问,可确保在强电磁干扰环境下F2833x的写保护寄存器不会被误写。因此,F2833x的抗干扰性能优于一般微控制器。

EALLOW是可读写位,若要对写保护寄存器进行写操作时,必须执行汇编指令EALLOW,对EALLOW置1。片上外设模块写保护寄存器包括器件仿真寄存器、Flash模块相关寄存器、CSM模块相关寄存器、PIE中断向量表、系统控制模块相关寄存器(如PLLSTS等)、ePWM模块相关寄存器(如TZSEL等)、GPIO模块相关寄存器(如GPACTRL、GPIOXINT1SEL等)、XINTF接口相关寄存器、DMA模块相关寄存器和eCAN模块相关寄存器。

在F28335的头文件模板DSP2833x_Device.h中,定义了两条EALLOW被置1和清0的宏定义C语句代码,如下:

其中,EALLOW位被置1的2833x汇编指令语法格式为:

     EALLO W;

EALLOW位被清0的2833x汇编指令语法格式为:

     EDIS;

宏语句EALLOW指令允许对2833x写保护寄存器和仿真空间进行写访问。

宏语句EDIS是宏语句EALLOW逆操作,禁止对2833x写保护寄存器和仿真空间进行写访问。

当CPU响应中断进入中断服务程序时,位域变量EALLOW当前值被自动压栈保存(即随ST1一起压栈保存),然后EALLOW被自动清0。可见,CPU执行中断服务程序时,由于EALLOW为0,禁止对所有写保护寄存器进行写操作。所以,要在中断服务程序中对写保护寄存器进行写操作,就必须先执行EALLOW宏语句。在中断服务程序结束时,中断返回指令IRET使位域变量EALLOW出栈恢复原来值(对C中断函数而言,IRET是C编译器自动执行的)。

2.VMAP(中断向量映射位)

位域变量VMAP是中断向量映射位,系统复位默认值为1,表示将CPU中断向量表映射到F2833x片上程序存储器空间高端,地址范围为0x3FFFC0~0x3FFFFF,即CPU的复位向量位于0x3FFFC0。

VMAP是可读写位,可用汇编“CLRC VMAP”指令将VAMP清0,这时,CPU中断向量表映射到F28335片上程序存储器空间的低端,地址范围为0x000000~0x00003F,即CPU的复位向量位于0x000000。VMAP清0是为了兼容C281x的需要而设置的。对于F2833x而言,复位向量位于0x3FFFC0,不必将VMAP清0。

3.INTM(中断全局屏蔽位)

位域变量INTM是中断全局屏蔽位,系统复位默认值为1,表示禁止F28335所有可屏蔽中断请求信号送到CPU内核,相当于可屏蔽中断总开关被断开。即使外设级、PIE级、CPU级的中断使能寄存器均被置1,CPU内核也不会响应中断请求。F2833x的C头文件模板DSP2833x_Device.h中两条INTM置1和清0的C宏定义语句如下:

通常在F2833x主函数的初始化程序开始处,编写一条DINT宏语句,禁止所有可屏蔽中断,即用软件将INTM置1,尽管上电复位后INTM被自动置1。在初始化程序结束处,再编写一条EINT宏语句,开放所有可屏蔽中断。F28335主函数的初始化程序模板有以下格式:

注意:

(1)当CPU在实时仿真模式下被暂停(即Halt),即使在INTM=1禁止所有可屏蔽中断情况下,由IER寄存器和DBGIER寄存器相同位域变量同时使能的中断请求仍然被CPU响应服务。

(2)当CPU响应中断请求时,INTM当前值(即INTM=0值)被压入堆栈保存(当ST1压栈保存时),然后INTM被自动置1。当CPU中断返回时,出栈恢复INTM原来值,即INTM被自动清0。

4.DBGM(调试使能屏蔽位)

位域变量DBGM是调试使能屏蔽位,系统复位默认值为1,表示禁止仿真器(Emulator)实时访问存储器和寄存器内容,CCS调试器(Debugger)不能更新观察窗口信息。在实时仿真模式下,如果DBGM=1,CPU忽略Halt(暂停)请求及硬件断点,直到DBGM被清0。位域变量DBGM不能阻止CPU在软件断点处暂停,这是实时仿真模式中常用的软件调试方法。如果在实时仿真模式下用单步执行一条指令,并且这条指令对DBGM置1,则CPU继续执行后续指令,直到DBGM被清0。

如果用户执行TI调试器(即CCS仿真器)的实时调试命令,则进入实时仿真模式,DBGM被强制清0。只要DBGM=0,就允许调试与测试直接存储器存取(Debug and Test Direct Memory Accesses,DT-DMAs),存储器单元和寄存器的值能更新调试窗口。

CPU在执行中断服务程序(Interrupt Service Routine,ISR)之前,硬件自动将DBGM置1,中止来自主机的请求,并忽略硬件断点。如果用户想单步执行指令或在非时序要求严格的ISR中设置断点,就必须在ISR开头添加一条DBGM清0指令:

     asm("CLRC DBGM");

DBGM位主要用在实时仿真过程中,对一部分时序要求严格的程序代码阻止调试事件发生。

当CPU执行中断服务程序时,DBGM的值被保护到堆栈中(随ST1寄存器压栈保护),然后DBGM被自动置1。中断返回时,DBGM恢复出栈值。

在F28335的C工程模板头文件DSP2833x_Device.h中,定义了两条分别对DBGM置1和清0的宏定义C语句,代码如下:

     # define ERTMasm("CLRC DBGM");
     # define DRTMasm("SETC DBGM");

例如,在DSP仿真器调试F28335的SCI通信时,为了实时观察到SCI串口的接收数据或发送数据,通常在调试程序的初始化程序中添加一条ERTM语句。

2.2.7 CPU中断控制寄存器

CPU中断控制寄存器包括中断使能寄存器(IER)、中断标志寄存器(IFR)、调试中断使能寄存器(DBGIER)。

IER功能是使能(置1)或屏蔽(清0)CPU级16个可屏蔽中断请求信号。

IFR功能是对CPU级16个可屏蔽中断有效请求信号进行登记,某位为1,表示有中断请求信号登记,某位为0,表示无中断请求信号登记。

DBGIER功能是当CPU处于实时仿真模式下被暂停时,由DBGIER对应位使能的可屏蔽中断请求是时间严格中断(time-critical interrupt)。时间严格中断是指在实时仿真模式下,当CPU被后台程序(background code)暂停时,CPU能继续执行同时被IER使能的时间严格中断服务程序(也称为foreground code,前台程序)。

IER、IFR、DBGIER的16个位域变量定义格式完全相同,如图2-5所示。

图2-5 IER、IFR、DBGIER位域变量定义

IER的16个位域变量对应16个CPU可屏蔽中断的使能位,为“1”对应可屏蔽中断被使能,为“0”对应可屏蔽中断被禁止,系统复位后,IER所有位均被清0,表示禁止所有16个可屏蔽中断的请求。软件可对IER的位域变量置1或清0。

IFR的16个位域变量反映16个CPU可屏蔽中断请求是否发生的状态,某位域变量为1,则表示对应可屏蔽中断请求已发生,等待CPU响应和中断处理,为0表示对应可屏蔽中断请求没有发生。系统复位后,IFR所有位均被清0。软件可对IFR的位域变量置1或清0。

DBGIER的16个位域变量对应16个CPU可屏蔽中断服务程序的调试使能位,为1对应可屏蔽中断服务程序被调试使能,为0对应可屏蔽中断服务程序被调试禁止。系统复位时,DBGIER所有位均被清0,表示禁止所有16个时间严格中断服务程序的调试。软件可对DBGIER的位域变量置1或清0。

对于IER而言,RTOSINT(Real-Time Operating System INTerrupt enable bit)表示实时操作系统中断使能位,对于IFR而言,RTOSINT(Real-Time Operating System INTerrupt flag bit)表示实时操作系统中断标志位,对于DBGIER而言,RTOSINT(Real-Time Operating System INTerrupt debug enable bit)表示实时操作系统中断调试使能位。

对于IFR而言,DLOGINT(Data LOG INTerrupt enable bit)表示数据记录中断使能位。对于IFR而言,DLOGINT(Data LOG INTerrupt flag bit)表示数据记录中断标志位。对于DBGIER而言,DLOGINT(Data LOG INTerrupt debug enable bit)表示数据记录中断调试使能位。

IER、DBGIER、INTM三者之间的关系是:CPU可屏蔽中断信号的使能在IER、DBGIER、INTM中选择两个使能位置1即可,具体要求取决于所使用的中断处理过程,如表2-3所示。对于标准中断处理过程,即大多数中断处理场合,不使用DBGIER来使能可屏蔽中断请求(即DBGIER被忽略),只要INTM=0并且IER某位被置1,CPU就能响应对应的可屏蔽中断请求并执行中断服务程序(Interrupt Service Routine,ISR)。当CPU处于实时仿真模式下,并且CPU被暂停运行,即处于一种特殊的中断处理场合,不需要INTM来使能全局中断请求(即INTM被忽略),只要IER某位=1并且DBGIER相同位被置1,CPU就能继续执行对应的可屏蔽中断服务程序。

表2-3 使能一个可屏蔽中断的基本要求

C28x支持两种代码执行的调试模式,即停止模式(stop mode)和实时模式(real-time mode)。停止模式是大多数用户采用的调试方式,一旦CPU在断点停止运行,所有CPU中断请求均被禁止。实时模式允许CPU在其他代码处停止运行后,时间严格中断服务程序(即DBGIER使能的CPU中断请求)能被继续执行。实时模式提供一种与不可屏蔽中断交互的代码调试手段。