您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页dsPIC30F系列

dsPIC30F系列

来源:百家汽车网


dsPIC30F系列数字信号控制器(DSC)

1

dsPIC30F系列DSC采用程序存储器和数据存储器完全分离的哈佛体系结构:

1、CPU结构

概述: dsPIC30F的CPU拥有24位指令字。程序计数器PC为24位宽,最低有效位总是0,除一些特殊指令外,在程序的正常执行中总是忽略其最高有效位,因此程序计数器PC可以寻址4M×24位的用户程序存储器空间。

工作寄存器阵列由16个16位的寄存器构成。每个工作寄存器都可以充当数据、地址或地址偏移寄存器。第16个工作寄存器(W15)作为软件堆栈的指针工作,用于中断服务程序和子程序的调用。

dsPIC30F指令集有两类指令:MCU类指令和DSP类指令。这两类指令无缝地集成到架构中并从同一个执行单元执行。指令集包括很多寻址模式。

CPU支持固有(无操作数)寻址、相对寻址、立即数寻址、存储器直接寻址、寄存器直接寻址和寄存器间接寻址模式。每条指令最多支持6种寻址模式。

2

CPU中包含一个DSP引擎,如图2-2所示,它具备一个高速17位×17位乘法器、一个40位ALU、两个40位饱和累加器和一个40位双向桶形移位寄存器。该桶形移位寄存器在单个周期内至多可将一个40位的值右移15位或左移16位。DSP指令可以无缝地与所有其他指令一起操作,其设计可实现最佳的实时性能。MAC指令和其他相关指令可以同时从存储器中取出两个数据操作数并将两个W寄存器相乘。这要求数据空间对于这些指令拆分为两块,但对所有其他指令保持线性。这是通过为每个地址空间指定某些工作寄存器,以透明和灵活的方式实现的。

3

CPU不支持多级指令流水线,而是利用单级指令预取机制,它在指令执行的前一个周期存取并解码部分指令,以便使可利用的执行时间达到最长。单周期指令预取机制用来帮助维持吞吐量并提供可预测的执行。除了改变程序流的指令、双字移动(MOV.D)指令和表指令以外,所有指令都在单个周期内执行。使用DO和REPEAT 指令支持无开销的程序循环结构,这两个指令在任何时候都可被中断。

dsPIC30F具有中断向量异常(Exception)机制,带有多达8个不可屏蔽陷阱源和54个中断源。可以为每个中断源分配7个优先级之一。陷阱的优先级是8—15。

编程模型:编程模型如图2-1所示

4

编程模型由16个16位工作寄存器(W0至W15)、2个40位累加器(AccA和AccB)、状态寄存器(SR)、数据表页寄存器(TBLPAG)、程序空间可视性页寄存器(PSVPAG)、DO和REPEAT寄存器(DOSTART、DOEND、DCOUNT和RCOUNT)以及程序计数器PC组

5

成。工作寄存器可作为数据、地址或偏移量寄存器。编程模型中全部寄存器都是存储器映射的,并且可以由指令直接控制。

在编程模型中出现了影子寄存器的概念,编程模式中的许多寄存器都有相关的影子寄存器。影子寄存器都不能直接访问。有两种类型的影子寄存器:一类被PUSH.S和POP.S指令使用,另一类被DO指令使用,如上图2-1所示。影子寄存器用作暂存寄存器,它能通过发生的一些事件和它的主寄存器互传内容。下面介绍寄存器和它的影子寄存器如何将数据传入和传出。

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

在执行函数调用或中断服务程序(Interrupt Service Routine, ISR)时,PUSH.S和POP.S指令可用于快速现场保护/恢复。PUSH.S指令会将下列寄存器的值传输到它们各自的影子寄存器W0~W3、SR(仅N、OV、Z、C和DC位),POP.S指令会将值从影子寄存器恢复到这些寄存器单元。

PUSH.S指令可以改写先前保存在影子寄存器中的内容。由于影子寄存器深度只有一级,所以如果多个软件任务使用影子寄存器,应加以注意。用户必须确保任何使用影子寄存器的任务均不会被同样使用该影子寄存器且具有更高优先级的任务中断。如果允许较高优先级的任务中断较低优先级的任务,则较低优先级任务保存在影子寄存器中的内容将被较高优先级任务改写。

⑵ DO循环影子寄存器

当执行DO指令时,寄存器DOSTART、DOEND和DCOUNT的内容将自动保存在影子

6

寄存器中。DO影子寄存器的深度也是一级,允许两个循环自动嵌套。

软件堆栈:下图为软件堆栈示例图:

dsPIC30F器件包括一个软件堆栈,W15专用于软件堆栈指针SP,用于异常处理、子程序调用和返回。为了防止堆栈存取未对准的情况发生,W15<0>总是为0值。

由图我们可以看到,所有复位均将W15初始化为0x0800。此地址确保在所有dsPIC30F器件中,堆栈指针(SP)将指向有效的RAM,并允许在SP被用户软件初始化前发生的不可屏蔽异常陷阱使用堆栈。 在初始化期间,用户可以将SP重新编程以指向数据空间内的任何单元。堆栈指针总是指向第一个可用的空字并从低地址到高地址填充软件堆栈。堆栈出栈(读)时,堆栈指针先减;堆栈进栈(写)时,堆栈指针后加。

7

当PC压入堆栈时,PC<15:0>(PCL)被压入第一个可用的堆栈字,然后PC<22:16>(PCH)被压入第二个可用的堆栈单元。由于PCH只包含一个字节的内容,可以将其与CPU状态寄存器SR的低8位(SRL)相连,这样就使SRL的内容在中断处理期间能被自动保存。在对于任何CALL指令执行期间的PC进栈,进栈前PC的MSB是以零扩展的,此时它压栈的形式如图2-3所示

W14软件堆栈指针:帧是堆栈中用户定义的存储器段,供单个子程序使用。W14是特殊工作寄存器,因为通过使用LNK(Link,链接)和ULNK(Unlink,不链接)指令可以把它用作堆栈帧指针。当不用作帧指针时,指令可以将W14当作普通的工作寄存器使用。

堆栈指针上溢:有一个与堆栈指针相关的堆栈极限寄存器SPLIM,复位时为0x0000。SPLIM是一个16位寄存器,但是SPLIM<0>固定为0,因为所有的堆栈操作必须字对齐。直到一个字写入SPLIM后才使能堆栈上溢检查,在此之后,只能通过器件复位禁止堆栈上溢检查。所有将W15用作源或目标寄存器而产生的有效地址将与SPLIM中的值作比较。如果堆栈指针W15的内容比SPLIM寄存器的内容大2,并且执行了进栈操作,将不会产生堆栈错误陷阱。堆栈错误陷阱将在随后的进栈操作时产生。例如:如果想要在堆栈指针递增超过RAM中的地址0x2000时,引起堆栈错误陷阱,可将SPLIM初始化为0x1FFE。如果使

8

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

堆栈指针下溢:发生复位时,堆栈的初始值为ox0800。如果堆栈指针地址小于其初始值,堆栈错误陷阱也将产生。

2、 程序存储器

程序空间存储器映射示例如下图所示:

dsPIC30F器件有4M×24位程序存储器地址空间。程序存储器映射空间被划分为用户程序空间和用户配置空间。用户程序空间包含复位向量、中断向量表、程序存储器和数据

9

EEPROM存储器。用户配置空间包含用于设置器件选项的非易失性配置位和器件ID单元。访问程序空间有三种方法可用:

1. 通过24位PC。

2. 通过读表(TBLRD)和写表(TBLWT)指令。

3. 通过把程序存储器的32KB段映射到数据存储器的高地址空间。

⑴通过程序计数器PC访问程序空间

PC以2为增量且LSb置为“0”以使之与数据空间寻址相兼容。用PC<22:1>在4M程序存储器空间中对连续指令字寻址。每个指令字为24位宽。程序存储器地址的LSb(PC<0>)保留为字节选择位,用于从使用程序空间可视性或表指令的数据空间访问程序存储器。对于通过PC取指的情况,不需要该字节选择位。所以,此时PC<0>总是置为“0”。

注意PC<22:1> 加1相当于PC<22:0>加2。

10

⑵用表读表写指令访问放在程序空间中的数据

指令总是按一定顺序排列在24位宽的程序存储器中。然而,当程序存储器结构修改成哈佛结构后,在程序空间中也可以存放数据。

可以使用两种方法在程序存储器和数据存储器空间之间传送数据,即:通过特殊的表指令(表读表写指令)或通过把16K字或32KB程序空间页重新映射到数据空间的上半部分。表指令用于将字节或字大小的数据在程序空间和数据空间之间传送。读表指令用于把数据从程序存储器空间读入数据存储器空间。写表指令可以把数据从数据存储器空间写入程序存储器空间。表指令共有以下四条:

• TBLRDL:读表的低位字

• TBLWTL:写表的低位字

11

• TBLRDH:读表的高位字

• TBLWTH:写表的高位字

对于表指令,程序存储器可以视作并排放置的两个16位字宽的地址空间,每个地址空间都有相同的地址范围。这样使程序空间可作为由字节或对齐的字寻址的16位宽、KB的页被访问(与数据空间相同)。TBLRDL和TBLWTL访问程序存储器的LS数据字,而TBLRDH和TBLWTH访问高位字。由于程序存储器只有24位宽,所以后一个字空间的高字节不存在(虽然它是可寻址的)。因此称之为“虚拟”字节。TBLRDL和TBLWTL指令提供了读或写程序空间内任何地址的LSWord的直接方法(无需通过数据空间)。TBLRDH和TBLWTH指令是可以把一个程序字的高8位作为数据存取的惟一方法。

对于所有表指令,W寄存器地址值与8位数据表页寄存器TBLPAG相连,形成一个23位有效的程序空间地址加上一个字节选择位。由于W寄存器提供了15位的程序空间地址,所以程序存储器中的数据表页的大小为32K字。

12

13

对于大多数应用,高字节(P<23:16>)将不会用于存储数据,使程序存储器有16位宽供数据存储。TBLRDH和TBLWTH指令主要用于阵列编程/校验和那些要求压缩数据存储的应用。

⑶用程序空间的可视性访问程序存储器中的数据

可选择将dsPIC30F数据存储器地址空间的高32KB映射到任何16K字程序空间页,这种操作模式被称为程序空间可视性(PSV),它提供对存储在X数据空间的常数数据的透明访问,而无需使用特殊指令(即, TBLRD 和TBLWT指令)。

通过将PSV位(CORCON<2>)置1使能程序空间可视性。当PSV使能时,在数据存储器映射空间上半部分的每个数据空间地址将直接映射到一个程序地址(参见图4-7)。PSV视窗允许访问该24位程序字的低16位。程序存储器数据的高8位应该编程,以强制对其的访问为非法指令或NOP,从而维持器件的鲁棒性(Robutness)。请注意表指令是读每个程序存储器字的高8 位的惟一方法。

14

15

图4-8 显示了如何生成PSV地址。PSV地址的15个LSb由包含有效地址的W寄存器提供。W寄存器的MSb不用于形成该地址,而是用于指定是从程序空间执行PSV访问还是从数据存储器空间执行正常的访问。如果使用的W寄存器有效地址大于或等于0x8000,使能PSV时,数据访问会从程序存储器空间进行。当W寄存器的有效地址小于0x8000时,所有访问将从数据存储器空间进行。

余下的地址位由PSVPAG寄存器(PSVPAG<7:0>)提供,如图4-8 所示。PSVPAG位与W寄存器中保存有效地址的15个LSb相连形成一个23位的程序存储器地址。PSV只能用来访问程序存储器空间中的值。必须用表指令来访问用户配置空间中的值。W寄存器值的LSb用作字节选择位,该位允许使用PSV的指令以字节或字模式运行。

3、 数据存储器

下图为数据空间存储器映射示例图。

16

dsPIC30F的数据宽度为16位,所有内部寄存器和数据空间存储器都是以16位宽度组织的。dsPIC30F具有两个数据空间,可以单独访问这两个数据空间(对于某些DSP指令)或将它作为一个KB线性地址范围一起访问(对于MCU指令)。使用两个地址发生单元(Address Generation Units,AGU)和的地址路径访问数据空间。

数据存储器0x0000到0x07FF之间的地址空间保留用于器件的特殊功能寄存器(SFR)。SFR包含CPU和器件上的外设的控制和状态位。

RAM从地址0x0800开始,分成两个区块,分别为X和Y数据空间。对于数据写操作,总是将X和Y数据空间作为一个线性数据空间访问。对于数据读操作,可以分别单独访问X和Y存储器空间或将它们作为一个线性空间访问。用MCU类指令进行的数据读操作总是将X和Y数据空间作为一个组合的数据空间访问。具有两个源操作数的DSP指令(如MAC指令)分别单独访问X和Y数据空间以支持同时对这两个源操作数进行读操作。MCU指令可以使用

17

任何W寄存器作为地址指针进行数据读写操作。

在数据读过程中,DSP类指令将Y地址空间与整个数据空间隔开。W10和W11作为从Y数据空间读取数据的地址指针。剩下的数据空间被称为X空间。W8和W9作为使用DSP类指令对X数据空间读取数据的地址指针。

上图3-2所示为使用MCU类和DSP类指令时,数据存储器空间是如何映射的。注意W寄存器数和指令类型将决定在进行数据读操作时如何访问地址空间。尤其需要注意的是,MCU指令将X和Y存储器作为一个组合的数据空间访问。MCU指令可以使用任何W寄存器作为地址指针进行读写操作。DSP指令可以同时预取指两个数据操作数,它将数据存储器

18

分割为两个空间。在这种情况下必须使用指定的W寄存器作为读操作的地址指针。

对于DSP类指令,所有存储器读操作时,W8和W9均应指向实现的X存储器空间。如果W8或W9指向Y存储器空间,将返回为零。如果W8或W9指向未用的存储器地址,会产生一个地址错误陷阱。

对于DSP类指令,所有存储器读操作时,W10和W11均应指向实现的Y存储器空间。如果W10或W11指向实现的X存储器空间,将返回为全零。如果W10或W11指向未用的存储器地址,会产生一个地址错误陷阱。

Near数据存储器:在数据存储空间的0x0000到0x1FFF之间保留了一个8KB的地址空间(称为Near数据存储器)。可通过所有文件寄存器指令中的13位绝对地址字段直接对Near数据存储器寻址。Near数据区域中所包含的存储器区域由各个不同的dsPIC30F器件所实现的数据存储器数量决定。Near数据存储区域至少将包含所有SFR和某些X数据存储器。对于具备较小数据存储空间的器件,Near数据区域可能包括所有X存储空间和部分或全部的Y存储空间。

从地址0x8000到0xFFFF这部分空间可以被映射到程序存储器中,也可以不映射。

4、 中断

概述: 针对传感器应用领域而设计的dsPIC30F系列芯片有高达41个故障处理源和4个处理器异常(陷阱)事件,它们必须按照优先级机制来进行仲裁。

CPU负责读取中断向量表(IVT),并把中断向量中的地址传送给程序计数器。中断向

19

量从程序数据总线向程序计数器的传送,是经由程序计数器输入侧24位宽的多路复用器来进行的。

中断向量表(IVT)和备用中断向量表(AIVT)的位置靠近程序存储器的开始(0x000004)。IVT和AIVT如图6-1所示。

在中断和处理器异常提交给处理器内核之前,中断控制器负责它们的预处理。使用下列集中式的特殊功能寄存器,对外设中断和陷阱进行允许、优先级分配和控制:

20

• IFS0<15:0>、IFS1<15:0> 和IFS2<15:0>

这三个寄存器中保存所有的中断请求标志。中断请求标志由其对应的外设或外部信号置1,标志的清除则通过软件完成。

• IEC0<15:0>、IEC1<15:0> 和IEC2<15:0>

这三个寄存器保存所有的中断使能控制位。这些控制位用来单独允许来自外设或外部信号的中断事件。

• IPC0<15:0>... IPC10<10:0>

用户可设置的与41个中断源中每个相关联的优先级在这11个寄存器中集中处理。

• IPL<3:0>

当前CPU优先级保存在IPL位中。IPL<3>在CORCON寄存器中,而IPL<2:0>则在处理器内核的状态寄存器(SR)中。

• INTCON1<15:0> 和INTCON2<15:0>

全局中断控制功能由这两个寄存器提供。INTCON1包含处理器异常事件的控制和状态标志位。INTCON2寄存器控制外部中断请求信号的操作以及备用中断向量表的使用。

注意:一旦产生中断条件,就将中断标志位置1,无论其对应的中断使能位和全局中断使能位状态为何。在允许一个中断之前,用户软件应确保相应的中断标志位被清零。

21

用户可以通过IPCx寄存器,为所有中断源分配7个优先级中的一个,优先级从1到7。 每个中断源都与一个中断向量关联,如表5-1所示。优先级7和1分别代表最高和最低的可屏蔽优先级。

22

23

如果NSTDIS位(INTCON1<15>)置1,则禁止中断嵌套。因此,当正在处理一个中断时,禁止处理新的中断,即使新中断的优先级比当前正在处理的中断优先级高。

对于某些指令,在其执行期间如果DISI位(INTCON2<14>)保持置1的话,那么DISI指令可以禁止优先级为6或更低的中断的处理。

当正在处理一个中断时,程序计数器PC装载一个地址,这个地址存在与中断相对应的程序存储器空间的中断向量区域中。在中断向量表中有63个不同的向量。这些向量放在程序存储器从0x000004到0x0000FE的区域中。这个区域包括24位地址;以特定的顺序保存,在通常的程序执行过程中,如果PC试图提取这个区域中的任何字,则会发生一个地址错误陷阱。

中断优先级:对于每个中断源,用户可分配的中断优先级位(IP<2:0>),位于IPCx寄存器中每个半字节的最低3位中。每个半字节的bit 3未使用,读为0。这些位定义了用户分配给特定中断的优先级。

自然顺序优先级由中断在向量表中的位置决定;只是在同时有多个中断,而且它们都具有相同的用户分配优先级等待处理时,自然顺序优先级才会影响到中断操作。

用户能够为每个中断分配七个优先级之一,这就意味着,对于一个具有低自然顺序优先级的中断,用户能够分配一个非常高的总优先级。例如,可以将PLVD(低压检测)的优先级分配为7。INT0(外部中断0)可以分配为优先级1,这样,它的有效优先级将非常低。

复位过程:复位不是真正的异常,因为复位过程中并不涉及中断控制器。在响应强制清零PC的复位时,器件初始化其寄存器。然后,处理器开始在0x000000地址处执行程序。

24

一条GOTO指令存放在第一个程序存储单元中,紧跟着的是GOTO指令的地址目标。处理器执行GOTO,跳转到指定地址,然后开始指定目标(起始)地址处的操作。

⑴复位的来源

除了外部复位和上电复位(POR)之外,还有6个错误条件会导致处理器复位。

• 看门狗定时器超时:

看门狗定时器已经超时,表明处理器不再执行正确的代码流。

• 未初始化的W寄存器陷阱:

试图把未初始化的W 寄存器用作地址指针将导致复位。

• 非法指令陷阱:

试图执行任何未使用的操作码,将产生非法指令陷阱。注意,如果由于指令流改变而在非法指令执行之前就被从流水线中舍弃的话,取非法指令并不产生非法指令陷阱。

• 欠压复位(BOR):

检测到可能导致器件故障的电源电压短暂降低。

• 陷阱锁定:

25

多个并发的陷阱条件将导致复位。

• 软件复位指令

陷阱:可以将陷阱看作不可屏蔽中断,表明出现软件或硬件错误,陷阱遵循预定义的优先级,如表5-1所示。陷阱旨在为用户提供一种方法,改正在调试和在应用中工作时的错误操作。

注意:很多陷阱条件只有在发生的时候才能检测到。 因此,在陷阱异常处理之前允许有问题的指令完成执行。如果用户选择从错误中恢复,可能不得不改正导致陷阱的错误操作的结果。

陷阱有8个固定的优先级:优先级8到优先级15,这意味着在陷阱处理期间,IPL3始终置1。如果用户目前不在执行陷阱处理,而将IPL<3:0> 设置为0111(优先级7),这样就禁止了所有中断,但仍然能够处理陷阱。

⑴陷阱的来源

下列陷阱的优先级依次递增。然而,由于所有陷阱都可以嵌套,优先级的作用很小:

①数学错误陷阱:

②地址错误陷阱:

③堆栈错误陷阱:

26

④振荡器故障陷阱:

中断过程:在每个指令周期的开始, IFSx寄存器都会采样全部的中断事件标志。IFSx寄存器中标志位等于1,表明有等待处理的中断请求(IRQ)。如果中断允许(IECx)寄存器中相应的位置1,IRQ将会导致中断产生。在IRQ采样后余下的指令周期中,将评估所有待处理中断请求的优先级。

如果有待处理的IRQ,它的优先级比IPL位中当前处理器优先级高,则处理器将被中断。随即,处理器将把当前程序计数器和处理器状态寄存器(SRL)的低字节压入堆栈,状态寄存器低字节包含中断周期开始之前的处理器优先级。然后,处理器把中断的优先级装入状态寄存器。这将禁止所有低优先级的中断,直到中断服务程序完成为止。

备用向量表:在程序存储器中,中断向量表(IVT)之后是备用中断向量表(AIVT)。INTCON2寄存器中的ALTIVT位控制对AIVT的访问。如果ALTIVT位置1,所有的中断和异常处理都将使用备用向量,而不是缺省向量。备用向量与缺省向量的组织方式是相同的。AIVT提供了一种在应用和支持环境之间切换的方法,从而支持仿真和调试功能,而不需要对中断向量进行再编程。这个特性也支持运行时在不同应用之间切换,以便评估各种软件算法。

如果不需要AIVT,分配给AIVT的程序存储空间可以作其他用途。AIVT 不是受保护的区域,用户可以对其自由编程。

外部中断请求:中断控制器支持多达五个外部中断请求信号, INT0-INT4。这些输入是边沿敏感的;它们需要从低至高或从高至低的跳变来产生中断请求。INTCON2寄存器的五个位, INT0EP-INT4EP,用来选择边沿检测电路的极性。

27

5、 定时器Timer1模块

Timer1模块是16位通用定时器,可以用作实时时钟定时器,或者用作一个自由计时的内部定时器/。16位定时器有下列模式:

• 16位定时器

• 16位同步计数器

• 16位异步计数器

而且,定时器支持下列操作特征:

• 定时器门控操作方式

• 可选择的预分频比设置

• CPU空闲和休眠模式下的定时器操作方式

• 在16位周期寄存器匹配时产生中断,或者在外部门控信号下降沿产生中断

通过设定16位SFR和T1CON中的相应位来决定这些工作模式。图9-1 所示为16 位Timer1 模块的框图。

28

16位定时器模式:在16位定时器模式下,定时器将在每个指令周期递增,直到等于周期寄存器PR1中预先装入的值,然后复位至0,继续计数。当CPU进入空闲模式时,定时器将停止增加计数,除非TSIDL(T1CON<13>)位为0。如果TSIDL = 1,则定时器模块逻辑将在CPU 空闲模式结束后重新增加计数。

16位同步计数器模式:在16位同步计数器模式下,定时器将在施加的外部时钟信号的上升沿递增,外部时钟与内部时钟同步。定时器计数,直到等于周期寄存器PR1中预先装入的值,然后复位至0,继续计数。当CPU进入空闲模式时,定时器将停止增加计数,除非对应的TSIDL 位为0。如果TSIDL=1,则定时器模块逻辑将在CPU空闲模式结束后重新增加计数。

16位异步计数器模式:在16位异步计数器模式下,定时器将在每个内部时钟信号的上升沿递增。定时器计数,直到等于周期寄存器PR1中预先装入的值,然后复位至0,继续计数。当定时器配置为异步工作模式时,且CPU进入空闲模式时,如果TSIDL=1,则定时器

29

将停止递增。

定时器门控操作: 16位定时器可以置为门控时间累加计数模式(Gated Time Accumulation mode)。该模式使得当门控输入信号(T1CK 引脚)为高电平时,内部TCY能够递增相应的定时器。要使能该模式,必须把控制位TGATE 置1(T1CON<6>)。必须使能定时器(TON = 1),并设置(TCS = 0)定时器为内部时钟源。当CPU进入空闲模式时,定时器将停止递增,除非TSIDL = 0。如果TSIDL = 1,则定时器将在CPU空闲模式终止后重新增加计时。

定时器预分频器:16位定时器的输入时钟(FOSC/4或外部时钟)有一个预定标选择因子,通过控制T1CKPS<1:0>(T1CON<5:4>),可以选择的预定标值有1:1、1:8、1:或1:256。当出现下列事件之一时,预定标值将清零:

• 写TMR1寄存器

• 写T1CON寄存器

• 器件复位,如POR和BOR

但是,如果定时器被禁止(TON = 0),那么定时器的预定标值将不能被复位。当写入T1CON时,TMR1不会被清零。当写入TMR1寄存器时, TMR1将被清零。

休眠模式下的定时器操作:在CPU休眠模式期间,定时器将继续工作,如果同时满足下面3个条件:

• 使能定时器模式(TON = 1),

30

• 定时器时钟源选用外部时钟(TCS = 1),

• TSYNC位(T1CON<2>)为逻辑“0”,这将外部时钟源定义为异步方式工作。

如果所有这三个条件都得到满足,定时器将继续计数,直到等于周期寄存器PR1中的值,然后复位至0x0000。当定时器与周期寄存器之间匹配时,如果相应的定时器中断允许位置1的话,将产生中断。

定时器中断: 16 位定时器具有在周期匹配时产生中断的能力。当定时器计数与周期寄存器相匹配时,T1IF位将置1,如果允许中断的话将产生中断。T1IF位必须用软件清除。定时器中断标志T1IF位于中断控制器的IFS0控制寄存器中。

当使能了门控时间累加计数模式时,还将在门控信号的下降沿(累加周期的末尾)产生中断。通过相应的定时器中断允许位T1IE来允许定时器中断。定时器中断允许位位于中断控制器的IEC0控制寄存器中。

实时时钟:当Timer1工作在实时时钟(RTC)模式下时,提供日期和事件定时采样能力。RTC工作特性如下:

• 使用32kHz LP振荡器工作

• 8位预分频器

• 低功耗

• 实时时钟中断

31

这些工作模式,由T1CON控制寄存器中的相应位决定。

RTC振荡器:当TON = 1、TCS = 1且TGATE = 0时,定时器在32kHz LP 振荡器输出信号的上升沿增加计数,直到周期寄存器中指定的值,然后复位至0。为确保正确工作,TSYNC位必须置为逻辑0(异步模式)。

使能LPOSCEN(OSCCON<1>)将禁止通用定时器模式,并且还可以使能定时器溢出唤醒事件功能,重新转载周期寄存器并继续计数,周期寄存器允许自动重装载初值。

当CPU 进入休眠模式时,如果32 kHz外部晶体振荡器处于工作状态、且控制位没有改变的话,RTC将继续工作。要使RTC 在空闲模式下继续工作,TSIDL位应当置为0。

RTC中断:当中断事件发生时,相应的中断标志T1IF将置1,如果允许中断的话就将产生中断。T1IF位必须用软件清零。相应的定时器中断标志T1IF位于中断控制器的IFS0状态寄存器中。

32

通过定时器中断允许位T1IE来允许中断。定时器中断允许位位于中断控制器的IEC0控制寄存器中。

6、 SPI模块

串行外设接口(Serial Peripheral Interface,SPI)模块是一个同步串行接口,可用于与其他外设或者单片机进行通信。这些外设可以是串行EEPROM、移位寄存器、显示驱动器和A/D 转换器等。

dsPIC30F系列器件在单个器件上提供一个或两个SPI模块,具体取决于具体不同的器件。6014A中有两个SPI模块,SPI1和SPI2 功能相同。

SPI 串口包含下列特殊功能寄存器(SFR):

• SPIxBUF:地址位于SFR空间,用于缓冲待发送数据和已接收数据。此地址由SPIxTXB和SPIxRXB寄存器共享。

• SPIxCON:配置模块各种操作模式的控制寄存器。

• SPIxSTAT:显示各种状态条件的状态寄存器。

此外,还有一个16位移位寄存器SPIxSR,此寄存器不映射到存储器空间。该寄存器可用于将数据移入和移出SPI 端口。

存储器映射的SFR(SPIxBUF)是SPI数据接收/发送寄存器。在内部, SPIxBUF 寄存器实际上由两个的寄存器(SPIxTXB 和SPIxRXB)组成。接收缓冲寄存器SPIxRXB和

33

发送缓冲寄存器SPIxTXB是两个单向16位寄存器。这两个寄存器共享名为SPIxBUF的SFR地址单元。如果用户将需要发送的数据写入了SPIxBUF地址单元,该数据会在内部写入SPIxTXB寄存器。与此类似,当用户从SPIxBUF读取已接收到的数据时,该数据在内部是从SPIxRXB寄存器读取的。这种接收和发送操作的双缓冲可以使数据在后台连续传输。发送和接收可同时进行。

SPI 串行接口由以下四个引脚组成:

• SDIx:串行数据输入

• SDOx:串行数据输出

• SCKx:移位时钟输入或输出

• SSx:低电平有效从动选择或者帧同步I/O脉冲

34

工作模式

SPI模块拥有灵活的工作模式:

• 8位和16位数据发送/接收

• 主控模式和从动模式

• 帧SPI模式

35

1、8 位与16 位工作模式:

控制位MODE16(SPIxCON<10>)允许模块在8位或16位模式下通信。除了接收和发送的位数外,两种模式的功能是相同的。此外,在阅读本文时还应注意以下各项:

• 当MODE16 (SPIxCON<10>)位的值变化时,模块会复位。因此,在正常工作过程中不应该改变该位。

• 8位工作模式下数据是从SPIxSR的bit 7发送的,而在16位工作模式下,则是从SPIxSR的bit 15发送的。在两种模式下,数据都会移入SPIxSR的bit 0。

• 在8位模式下移入/移出数据需要SCKx引脚上出现8个时钟脉冲,而在16位模式下则需要16个时钟脉冲。

2、主控模式和从动模式

36

主控模式:

遵循以下步骤将SPI模块设置为工作在主控模式:

1. 如果使用中断:

• 清零相应IFSn寄存器中的SPIxIF位。

• 置位相应IECn寄存器中的SPIxIE位。

• 向相应的IPCn寄存器设置SPIxIP位。

37

2. 将所需设置写入SPIxCON寄存器,同时MSTEN(SPIxCON<5>)= 1。

3. 将SPIROV位(SPIxSTAT<6>)清零。

4. 通过将SPIEN位(SPIxSTAT<15>)置位使能SPI工作。

5. 将待发送数据写入SPIxBUF寄存器。数据一写入SPIxBUF寄存器,发送(以及接收)就会立即开始。

在主控模式下,系统时钟被预分频,然后作为串行时钟使用。预分频基于PPRE<1:0>(SPIxCON<1:0>)和SPRE<1:0>(SPIxCON<4:2>)位的设置。串行时钟通过SCKx引脚输出到从动器件。仅当有待发送数据时才会产生时钟脉冲。CKP 和CKE位确定在哪个时钟沿发送数据。待发送数据和已接收数据都分别向SPIxBUF寄存器写入和从该寄存器读取。

以下内容描述了主控模式下SPI 模块的工作原理。

1. 一旦模块被设置为主控工作模式并使能,待发送数据就会写入SPIxBUF寄存器。SPITBF(SPIxSTAT<1>)位置位。

2. SPIxTXB的内容移到移位寄存器SPIxSR,并且模块将SPITBF位清零。

3. 一组8/16个时钟脉冲将8/16位发送数据从SPIxSR移出到SDOx引脚,同时将SDIx引脚的数据移入SPIxSR。

4. 当传输结束后,会发生以下事件:

38

• 中断标志位SPIxIF置位。通过将中断使能位SPIxIE置位可以允许SPI中断。SPIxIF标志不会被硬件自动清零。

• 另外,当正在进行的发送和接收操作结束后, SPIxSR的内容会移到SPIxRXB寄存器。

• SPIRBF(SPIxSTAT<0>)位由模块置位,表明接收缓冲器满。一旦用户代码读SPIxBUF寄存器,硬件就会将SPIRBF位清零。

5. 当SPI模块需要从SPIxSR传输数据到SPIxRXB时,如果SPIRBF位置位(接收缓冲器满),模块会将SPIROV (SPIxSTAT<6>)位置位,表明产生了溢出条件。

6. 只要SPITBF(SPIxSTAT<1>)清零,用户软件就可以在任何时候将待发送数据写入SPIxBUF。写入可以与SPIxSR 移出前面写入的数据同时发生,因此可以允许连续发送。

从动模式:

遵循以下步骤将SPI模块设置为从动工作模式:

1. 将SPIxBUF 寄存器清零。

2. 如果使用中断:

• 清零相应IFSn寄存器中的SPIxIF位。

• 置位相应IECn寄存器中的SPIxIE位。

39

• 向相应的IPCn寄存器设置SPIxIP位。

3. 将所需设置写入SPIxCON寄存器,同时使MSTEN(SPIxCON<5>)= 0。

4. 将SMP位清零。

5. 如果CKE位置位,则SSEN位必须置位,从而使能SSx引脚。

6. 将SPIROV位(SPIxSTAT<6>)清零,并且

7. 通过将SPIEN 位(SPIxSTAT<15>)置位使能SPI 工作。

在从动模式下,在外部时钟脉冲出现在SCKx引脚时发送和接收数据。CKP(SPIxCON<6>)和CKE(SPIxCON<8>)位决定数据发送发生在哪个时钟沿。待发送数据和已接收数据分别向SPIxBUF寄存器写入和从该寄存器读取。模块在该模式下的其余工作与在主控模式下相同。

3、帧SPI模式

当工作在主控模式或从动模式时,模块支持一个非常基本的帧SPI 协议。在SPI 模块中提供了以下功能来支持帧SPI 模式:

• 控制位FRMEN(SPIxCON<14>)可使能帧SPI 模式并使SSx引脚作为帧同步脉冲输入或输出引脚使用。SSEN (SPIxCON<7>)的状态会被忽略。

• 控制位SPIFSD(SPIxCON<13>)决定SSx引脚的输入/输出方向(即模块是接收还

40

是产生帧同步脉冲)。

• 帧同步脉冲在一个SPI 时钟周期内为高电平有效脉冲。

SPI 模块支持以下两种帧SPI模式:

• 帧主控模式:SPI模块产生帧同步脉冲并在SSx引脚为其他器件提供此脉冲。

• 帧从动模式:SPI模块使用在SSx引脚接收到的帧同步脉冲。

主控模式和从动模式都支持帧SPI模式。因此,用户可以使用以下四种帧SPI配置:

• SPI主控模式和帧主控模式

• SPI主控模式和帧从动模式

• SPI从动模式和帧主控模式

• SPI从动模式和帧从动模式

这四种模式决定SPIx模块是否产生串行时钟和帧同步脉冲。

41

7、 输入捕捉模块

输入捕捉模块用于在输入引脚上有事件发生时,捕捉来自两个可选时基之一的定时器值。 输入捕捉功能在需要进行频率(时间周期)和脉冲测量的应用中是相当有用的。

输入捕捉模块有多种工作模式,可通过ICxCON寄存器选择。 这些工作模式包括:

• 在ICx引脚输入电平的下降沿捕捉定时器值

• 在ICx引脚输入电平的上升沿捕捉定时器值

42

• 在ICx引脚输入电平的第4个上升沿捕捉定时器值

• 在ICx引脚输入电平的第16个上升沿捕捉定时器值

• 在ICx引脚输入电平的每个上升沿和下降沿捕捉定时器值

输入捕捉模块有4级FIFO缓冲器。 用户可以选择产生CPU中断所需要的捕捉事件数量。

dsPIC30F 器件中的每个捕捉通道都有以下寄存器,寄存器名称中的“x”代表捕捉通道的编号:

• ICxCON:输入捕捉控制寄存器

43

• ICxBUF:输入捕捉缓冲寄存器

输入捕捉事件模式:

当ICx 引脚上有事件发生时,输入捕捉模块捕捉所选的时基寄存器的16 位值。可以被捕捉的事件分为下列3类:

1. 简单捕捉事件模式

• 在ICx引脚输入电平的下降沿捕捉定时器值

• 在ICx引脚输入电平的上升沿捕捉定时器值

2. 每个边沿(上升和下降)都捕捉定时器值

3. 预分频捕捉事件模式

• 在ICx引脚输入电平的第4个上升沿捕捉定时器值

• 在ICx引脚输入电平的第16个上升沿捕捉定时器值

通过设置相应的输入捕捉模式位 ICM<2:0> (ICxCON<2:0>)可以配置上述输入捕捉模式。

44

输入捕捉中断

输入捕捉模块能根据选定的捕捉事件的次数来产生中断。 捕捉事件定义为将时基值写入捕获缓冲器中。这种设置通过控制位ICI<1:0> (ICxCON<6:5>)来配置。除非在ICI<1:0> = 00 的情况下,否则在缓冲器溢出条件清除前将不产生任何中断。 当捕捉缓冲器通过复位条件或读操作被清空时,中断计数将会复位。 这使中断计数得以与FIFO 入口状态重新同步。

45

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务