随着大规模集成电路、数字计算机等技术的飞速发展,DSP系统逐渐流行起来,而我由于课程原因也接触到了DSP系统,因此在这里记录了DSPF2812的理论知识,为后续的编程打下基础。

DSP芯片的特点

  • 哈佛结构:不同于传统的冯诺依曼结构,将程序和数据存储在不同的存储空间当中,因此取指和执行能完全重叠运行。
  • 流水线操作:可以并行处理多条指令,减少了指令执行的时间。
  • 专用的硬件乘法器:大大提高运算速度。
  • 特殊的DSPs指令:可以执行许多复杂功能。
  • 快速的指令周期:满足高实时性场合的需求。

这里DSPF2812的各引脚功能不再阐述,有兴趣的读者可参考TI公司的中文数据手册。
至于DSP应如何学习,我的老师把DSP的知识点抽象为建筑物的结构,我觉得很形象,大家可以参考一下。

CPU的内部结构和时钟

CPU

这里,我们首先要对CPU 有一个整体上的认识,见下图:

然后我们对CPU进行拆解,对CPU内部的结构有一个总览:

对于CPU,我觉得了解了以上知识就足够了,以后在编程中如果需要用到的话,再回来查找即可。

时钟综述

接着,我们需要学习微机中最重要的部分——时钟系统,而F2812需要处理大量的复杂运算,因此对定时的要求更加严格。而配置相应的时钟是通过修改对应的寄存器来完成的,主要有:

  • 外设时钟控制寄存器(PCLKCR),控制片上各种时钟的工作状态,使能或禁止相关外设时钟。
  • 系统控制和状态寄存器(SCSR),包含看门狗溢出位和看门狗中断使能/屏蔽位,和看门狗的控制有关。
  • 高低速外设时钟设置寄存器(HISPCP/LOSPCP) ,用于设置不同速度的外设。

晶体振荡器和锁相环

F2812片上有基于PLL的时钟模块,为器件及各种外设提供时钟信号。
其中,系统的时钟源由外部XPLLDIS引脚确定,当该引脚为低电平时,系统直接采用晶振作为系统时钟;当该引脚为高电平时,外部时钟经过PLL倍频后,为系统提供时钟。
若要改变锁相环的工作模式及倍频的系数,可以通过锁相环控制寄存器来修改。

CPU定时器

F2812共有3个32位CPU定时器(TIMER0/1/2),其中后两个预留给实时操作系统使用,用户只可以使用定时器0。其中三个定时器的中断信号分别为TINT0, TINT1, TINT2,分别对应于中断向量INT1,INT13,INT14。
接下来将CPU定时器的具体原理,请读者仔细阅读。
简单来说,定时器就像闹钟,定时器工作前一般要经历以下几个步骤:

  • 首先给周期寄存器PRDH:PRD赋值(这里是用2个16位寄存器来表示一个32位寄存器),当启动定时器开始计数时,周期寄存器的值装载进定时器计数寄存器TIMH:TIM中。
  • 好比闹钟每隔1s走动一下一样,计数器寄存器里面的值每隔一个TIMCLK就减1,直到计数到0,定时器完成一个周期的计数,这时将产生一个中断信号。
  • TIMCLK的值又从何而来呢,它由定时器分频器TDDRH:TDDR和定时器预定标器PSCH:PSC来控制。先给定时器分频器赋值,然后装载入定时器预定标器,这样每隔一个SYSCLKOUT脉冲,预定标器中的值就减1.直到减为0时,就输出一个TIMCLK。

经过以上的分析,我们容易得出定时器周期的计算公式。

看门狗电路

在由MCU构成的微型计算机系统中,由于单片机的工作常常会受到外界电磁场的干扰,造成程序跑飞而陷入死循环,会造成整个系统陷入停滞状态,因此有了看门狗电路的产生。
我们可以这样来理解F2812的看门狗电路原理F2812的看门狗电路有一个8位看门狗加法计数器WDCNTR,无论什么时候,如果该计算器达到最大值,看门狗模块就会产生一个输出脉冲使系统复位。为了防止WDCNTR溢出,通常采用2种方法。

  • 禁止看门狗。
  • 定期“喂狗”,即通过软件向负责复位看门狗计数器的看门狗密钥寄存器周期性地写入0x55+0xAA。

(这里需要注意的是逻辑校验位是看门狗的另一个安全机制,所有访问看门狗控制寄存器WDCR的写操作中,相应的校验位必须是101,否则将会拒绝访问并立即触发系统复位。)

存储器与通用I/O口

F2812存储器的映射见下图:

其中,相信大家对各种片内存储器的优点都有了解,在这里我们仅对外部扩展接口进行介绍。

外部扩展接口XINTF

F2812的外部接口XINTF映射到5个独立的区域,见下图:

当访问相应的存储区域时,会产生一个片选信号。此外,从图上可以看出,有的区域共用一个片选信号。
这一部分我觉得跟后续的编程不太相关,所以我的学习方法是大概浏览几遍,用到再去查。

GPIO多路复用器

在F2812处理器当中,相当一部分引脚是外设和数字I/O引脚公用的。它们通过 GPxMUX 寄存器来配置选择具体的引脚功能(作为外设或数字 I/O 引脚)。当引脚作为数字I/O时,可以通过方向控制寄存器GPxDIR控制I/O的方向,是作为输入还是输出,并可以通过量化寄存器GPxQUAL量化输入信号,消除外部噪声信号。
同上边一样,我不会深入设计具体寄存器每一位的功能,因为这些是不用记的,知道如何操作就行。

中断管理

这里讲下中断的作用,通过软件或硬件激发的中断请求信号,可以使CPU暂停目前执行的主程序,转而去执行中断服务程序,以便CPU实现数据的传送或接收。
F2812的中断主要有两种方式触发:一种是在软件中写指令;另一种是硬件方式触发。无论是软件中断还是硬件中断,都可归结为可屏蔽中断和不可屏蔽中断。 以下我们将重点讨论可屏蔽中断和PIE中断,暂时不考虑不可屏蔽中断。

中断向量和优先级

F2812一共可以支持32个CPU中断,其中每一个中断都是一个32位的中断向量,但里面存储的是22位的中断服务程序的入口地址,CPU将优先处理优先级高的中断 。

可屏蔽中断

可屏蔽中断有3个专用寄存器的支持,中断标志寄存器IFR,中断使能寄存器IER和调试中断使能寄存器DBGIER。IFR中包含的相应标志位表面对应中断在等待CPU的响应,IER和DBGIER则控制使能或屏蔽某一可屏蔽中断,其中后一寄存器用于实时仿真。
可屏蔽中断的响应过程是:首先当某个可屏蔽中断提出请求时,IFR中的中断标志位自动置位。接着CPU将检查IER中相应位的值和是否使能了全局中断。若以上都没有问题,则CPU将会响应该中断,暂停主程序并转向执行相应的中断服务子程序。

外设中断扩展模块PIE

PIE是为了使F2812CPU能够管理更多的中断而设计的,PIE中多个中断源复用一个CPU中断,这些中断被分为12组,每个组有8个中断,每个组都被反馈到CPU内核的12条中断信号线的一条上,因此PIE共可支持96个中断,具体管理的中断源见下图:

对于PIE中断,内部具体是如何复用的,硬件电路是如何连接的,我们不必关心,最重要的是看懂外设中断在PIE中是如何分布的:

这里同组内,排在前边的中断优先级比排在后面中断优先级的高,而不同组之间,排在前面组的任何一个中断优先级要比排在后面组内的任何一个中断的优先级高。
可屏蔽CPU中断可以通过中断使能寄存器和中断标志寄存器来进行编程控制,同样,PIE的每个组都有3个相关的寄存器,分别是PIE中断使能寄存器PIEIERx,PIE中断标志寄存器PIEIFRx和PIE中断应答寄存器PIEACKx,其中x代表组号。

中断的编程

这里我们以中断为例,介绍实际编程中的步骤。

  • 首先在外设初始化函数中使能外设中断。
  • 主函数里初始化外设、使能PIE和CPU中断等。
  • 在DSP28_DefaultIsr.c里编写你的中断处理函数,这里需要注意应该手动清除外设中断的标志位和复位PIE应答寄存器PIEACK相关的位,使得CPU能够响应PIE控制器同组内的其它中断。

本文结束,感谢阅读~😁

Time waits for no one!