carloscn / blog

My blog
Apache License 2.0
119 stars 34 forks source link

DSP-F2812的时钟和系统控制 #158

Open carloscn opened 1 year ago

carloscn commented 1 year ago

DSP-F2812的时钟和系统控制

1振荡器OSC和锁相环PLL

DSP里面肯定有时钟,没有时钟DSP怎么工作?这个我从时钟怎么产生的开始解释,咱们了解了解是有好处的。首先两个概念,振荡器和锁相环。(振荡器:(oscillator):是一种能量转换装置——将直流电能转换为具有一定频率的交流电能。其构成的电路叫振荡电路.晶振),(锁相环:(phase Locked Loop):是一种信号处理设备-------简单的说就是能将信号同步,相位统一达到同步的效果!) 其实,原理就是,由振荡器产生信号,但是产生的信号不同步,所以用了个锁相环把信号的相位弄一致,这样频率一样,幅度一样,相位也一样就形成了同步的时钟信号。

看一看F2812里面是怎么设计的呢?

image-20221202204419421

左边是振荡器,邮编是PLL,两个联合成为时钟的生成装置。看一看,未处理的时钟信号从振荡器出来,分成三个路线,第一个路线直接出去,第二个是PLLBypass,PLL旁路,第三个叫PLL。然后我们来研究一下这几个有啥作用。最后的CLKIN和从振荡器出来的XCLKIN有啥关系呢。我们通过XF_PLLDIS(下图)

image-20221202204449160

第101引脚,看到了吧。设置时钟的关系,XF_PLLDIS引脚。如果这个引脚禁止,就是使能PLL模块,直接用的就是振荡器出来的时钟信号,也就是XF_PLLDIS = 0;。如果XF_PLLDIS为高电平,PLL被使能,则表示振荡器产生的时钟要经过PLL模块。但是上图1-1明明PLL引出了两个引脚是不?那么到底选哪个?是PLL旁路还是直接PLL。当然啦,肯定有方法,PLL的控制不光是这个一个,这个仅仅是个使能位置,而已。我们需要进一步的设置一个寄存器,PLLCR,控制寄存器来有效的改变是选用哪个方式。(下面是原版英文)

The on-chip oscillator circuit enables a crystal to be attached to the F281x and C281x devices using the X1/XCLKIN and X2 pins. If a crystal is not used, then an external oscillator can be directly connected to the X1/XCLKIN pin and the X2 pin is left unconnected. The logic-high level in this case should not exceed VDD. The PLLCR bits [3:0] set the clocking ratio.

The PLLCR bits[3:0] set the clocking ratio.通过PLLCR 的0:3位来设置比率。下面咱么就说说怎么设置。

引入PLLCR寄存器:

image-20221202204533386

举个比较简单的例子,SysCtrlRegs.PLLCR.all = 0x0001; 就是XCLKIN/2,从振荡器出来的信号,进行2比分,而且还是PLL模式,也就是如果晶振是30MHz的话,那么输出的时钟就是15Mhz。当写入0001的时候才是PLL旁路模式。

书中的话:实际使用的时候,通常使用第3种模式,即PLL使能。通常使用30MHz的晶振为F2812提供时基,因为当PLL控制寄存器PLLCR取最大值10的时候,送至CPU的时钟可以达到150MHz,也就是F2812所能支持的最高的时钟。(因此,**F2812的最大时钟频率是150Mhz)**

2. X2812**中的各种时钟信号的产生**

image-20221202204554678

刚才咱们说的是时钟信号的产生,现在说说时钟信号怎么分发下去的。看着上面的图PLL和OSC的模块通过CLKIN引脚给F2812 CPU,然后通过F2812的CPU进行时钟分配,分配出来的就是SYSCLKOUT。出来之后,有个系统控制寄存器和外设寄存器来使能时钟,然后有的需要外设寄存器,有的需要低速预定标器,有的需要告诉预定标器进行相应的设置。(SCI,SPI,McBSP需要的是低速预定标器)EVA,EVB,ADC需要高速预定标器,(预定标器:DSP中一般需要把CPU的时钟频率降下来给外设用,就需要用到时钟预定标,将CPU的频率除以你自己所设的预定标系数,得到的就是你想要的时钟频率) 。也就是说,一个模块的时钟配置,通常需要设置三个部位,1. 系统控制寄存器 2. 外设寄存器 3. 预定标器

外设时钟控制寄存器PCLKCR,高低速预定标器寄存器HISPCP,LOSPCP。

举个例子:开启EVA,EVB和ADC的时钟

    SysCtrlRegs.RCLKCR.bit.EVAENCLK = 1;  // 使能EVA模块的时钟
    SysCtrlRegs.PCLKCR.bit.EVBENCLK = 1;  // …
    SysCtrlRegs.PCLKCR.bit.ADCENCLK = 1;  //…

高速预定标器和低速预定标器相应给值,然后如果这个模块应用到高速或者低速时钟,它就自动的进行了。要弄清楚,SCI,SPI,McBSP是低速时钟,EVA,EVB,ADC是高速时钟。如果算的话,不按照时钟SYSCLKOUT算,按照高低速时钟进行算术。

3.**看门狗电路**

WatchDog是个神奇的东西,我学C51的时候就学过,如今DSP里面有,ARM里面也有。咱们就彻彻底底的明白,这个狗到底是干啥的。

image-20221202204636795

image-20221202204641860

上面是来自百度百科的资料。现在我们需要用大白话说明下啥是看门狗。看门狗就是个看家的狗,你要不喂它,它就咬你,让你复位。看门狗模块一个输入端一个输出端,模块的输入端接一个DSP的I/O,模块的输出端接DSP的复位。如果你的电路正常运行,就应该是隔一段时间进行一次“喂狗”,就是I/O进行输入个数,进一个数就给看门狗清零,如果要是你的程序遇到不测了,I/O口不再喂狗,那么当看门狗积累了一定的数,满足条件,触发了它的输出,就对DSP进行了置位。就是这个原理。

好了,弄清大体的原理了,我们就开始看看,F2812的看门狗怎么设计。还有没有什么先进的功能呢?

过多了也不再说了,说多了也没用。寄存器到时候查就行了。涉及这块的寄存器下面我给写出来:

  1. 外设时钟控制寄存器 PCKKCR
  2. 系统控制与状态寄存器 SCSR
  3. 高速外设时钟预定标寄存器 HISPCP
  4. 低速外设时钟预定标寄存器 LOSPCP
  5. PLL控制寄存器 PLLCR
  6. 低功耗模式控制寄存器0 LPMCR0
  7. 低功耗模式控制寄存器1 LPMCR1
  8. 看门狗计数寄存器 WDCNTR
  9. 看门狗复位密钥寄存器 WDKEY
  10. 看门狗寄存器 WDCR

4. 例程序

/*
 * name: DSP28_SysCtrl.c
 * func: Initial system control register.
 * data: 2014-4-23
 * */

#include <DSP28_Device.h>

void InitSysCtrl(void){
    Uint16 i;
    EALLOW;
    SysCtrlRegs.WDCR = 0x0068; // Forbiden Watch dog function.
    SysCtrlRegs.PLLCR = 0xA;  // if external oscillator is 30Mhz,the SYSCLKOUT = 30*10/2
    for(i = 0; i < 500; i++){}  // 锁相环需要时间,后面给出时序,看出为啥。
    SysCtrlRegs.LOSPCP.all = 0x0002;   // 75Mhz
    SysCtrlRegs.HISPCP.all = 0x0001;   // 37.5Mhz
    SysCtrlRegs.PCLKCR.bit.EVAENCLK = 1;
    SysCtrlRegs.PCLKCR.bit.EVBENCLK = 1;
    SysCtrlRegs.PCLKCR.bit.ADCENCLK = 1;
    EDIS;
}

关于初始化PLL的时候为什么需要延时,我们在PDF中找到了答案:

image-20221202204741331

最上面的时序图上面,Device Status看到E,F阶段了吗?PLL LOCK是需要时间的。中间过程乱七八糟各种状态,但是你看后面经过PLL锁的时间和什么唤醒时间之后XCLKOUT就开始趋于平稳了,正常工作了,所以我们不管中间过程什么状态,直接延时,延时,延时,就OK了,等他完成了,XCLKOUT平稳了输出了,咱们就开始进行正常运行。