HELLO六:2812的时钟系统

来源:互联网 发布:如何开通企业邮箱域名 编辑:程序博客网 时间:2024/06/05 21:51

这个系列为响应HELLODSP的2812学习活动的个人笔记HELLODSP版权所有。转载请注明 

                                                                                                         ---By eys417

 

1. 振荡器OSC和锁相环PLL


2812基于PLL的时钟模块可以采用两种模式,一种是PLL未被禁止的情况下(旁路或使能),使用外部晶振给2812提供时钟信号,使用X1/CLKIN引脚和X2引脚另外一种PLL被禁止的情况下,旁路片内振荡器,由外部时钟源提供时钟信号,即将外部振荡器的信号输入到X1/XCLKN引脚,X2引脚不使用。通常情况下,采用第一种方式,由外部晶振通过片内OSC来产生时钟信号。

平常使用的是第3种方式,即PLL使能

晶振为30M,PLLCR的DIV位被设置成1010时的时钟频率

CLKIN=(OSCLKIN*10)/2=(XCLKIN*10)/2=(30M*10)/2=150M Hz

 

2.2812芯片中各种时钟信号的产生情况

和时钟使能相关的寄存器是外设时钟控制寄存器PCLKCR。使能外设时钟
SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;

SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;

SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;

低速时钟外设 ---- SCIA、SCIB、SPI、McBSP

LSPCLK计算公式
LOSPCP=0,LSPCLK=SYSCLKOUT

LOSPCP=1—7,LSPCLK=SYSCLKOUT/(2*LOSPCP)

注:LOSPCP表示的是LOSPCP寄存器中位2-0的值

高速时钟外设 ---- EVA、EVB和ADC

HSPCLK计算公式
HISPCP=0,HSPCLK=SYSCLKOUT

HISPCP=1—7,HSPCLK=SYSCLKOUT/(2*HISPCP)

注:HISPCP表示的是HISPCP寄存器中位2-0的值

SYSOUTCLK组:CPU定时器,eCAN总线
OSCCLK组:看门狗电路

3.看门狗(Watch Dog)

看门狗,又叫watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗(kicking the dog or service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗端,给WDT 清零,如果超过规定的时间不喂狗,(一般在程序跑飞时),WDT 定时超过,就回给出一个复位信号到MCU,是MCU复位. 防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞

2812的看门狗电路有一个8位的看门狗加法计数器WDCNTR,无论什么时候,如果WDCNTR计数到最大值时,看门狗模块就会产生一个输出脉冲,脉冲宽度为512个振荡器时钟宽度。为了防止看门狗加法计数器WDCNTR溢出,我们通常可以采用两种方法:一种是禁止看门狗,即使得计数器WDCNTR无效;另一种就是定期的“喂狗”,通过软件向负责复位看门狗计数器的看门狗密钥寄存器(8位的WDKEY)周期性的写入0x55+0xAA,紧跟着0x55写入0xAA能够清除WDCNTR。写任何其他的值都会使看门狗立即复位

4.系统初始化函数

系统初始化函数DSP281x_SysCtrl.c文件。

void InitSysCtrl(void)
{

/*  EALLOW;

//固定格式,在TMX采样时,为了能够使得片内RAM模块M0/M1/L0/L1LH0能够获得最好的性能,控制寄存器的位必须使能,这些位在设备硬件仿真寄存器内
   DevEmuRegs.M0RAMDFT = 0x0300;
   DevEmuRegs.M1RAMDFT = 0x0300;
   DevEmuRegs.L0RAMDFT = 0x0300;
   DevEmuRegs.L1RAMDFT = 0x0300;
   DevEmuRegs.H0RAMDFT = 0x0300;

   EDIS;
*/
   DisableDog();                   // Disable the watchdog

   InitPll(0xA);                      // Initialize the PLLCR to 0xA---30M*10/2

   InitPeripheralClocks();     // Initialize the peripheral clocks
}

//禁止看门狗

void DisableDog(void)
{
    EALLOW;
    SysCtrlRegs.WDCR= 0x0068;
    EDIS;
}

//喂狗函数

void KickDog(void)
{
    EALLOW;
    SysCtrlRegs.WDKEY = 0x0055;
    SysCtrlRegs.WDKEY = 0x00AA;
    EDIS;
}

//PLL初始化,30M*val/2

void InitPll(Uint16 val)
{
   volatile Uint16 iVol;

   if (SysCtrlRegs.PLLCR.bit.DIV != val)
   {

      EALLOW;
      SysCtrlRegs.PLLCR.bit.DIV = val;
      EDIS;

      DisableDog();

      for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++)
      {

      }
   }
}

//初始化个外设时钟--时能OR禁止

void InitPeripheralClocks(void)
{
   EALLOW;

// HISPCP/LOSPCP 高低速时钟设置
   SysCtrlRegs.HISPCP.all  = 0x0001;
   SysCtrlRegs.LOSPCP.all = 0x0002;

//初始化个外设时钟--使能OR禁止
   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
   SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;
   SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;
   SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;

   EDIS;
}

 

http://blog.21ic.com/user1/6012/archives/2009/63593.html