4480|0

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

28335硬件教程-时钟系统 [复制链接]

28335的最大工作频率是250M,其时钟有两种产生途径,第一是直接使用外部时钟(通过XCLKIN接入),第二种方法是在X1和X2引脚外接外部晶振或共振器。系统时钟框图如下:

上述过程产生CLKIN,直接供给CPU,CPU同时向外供给SYSCLKOUT给各个外设。SYSCLKOUT=SYSCLKIN.SYSCLK经过HISPCP LOSPCP的分频后可以送给各个外设,注意,HSPCLK和LSPCLK是独立设定的,也不一定存在。下面是一段初始化程序。
  1. void InitPll(Uint16 val, Uint16 divsel)  
  2. {  
  3.   
  4.    // Make sure the PLL is not running in limp mode  
  5.     //若为1,检测时钟错误,未发现时钟  
  6.    if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)      
  7.    {  
  8.       // Missing external clock has been detected  
  9.       // Replace this line with a call to an appropriate  
  10.       // SystemShutdown(); function.  
  11.       asm("        ESTOP0");  
  12.    }  
  13.   
  14.    // DIVSEL MUST be 0 before PLLCR can be changed from  
  15.    // 0x0000. It is set to 0 by an external reset XRSn  
  16.    // This puts us in 1/4  
  17.    //将分频设置为4,即CLKIN=1/4OSCCLK  
  18.    if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)        //判断,此位应为0,才能继续设置  
  19.    {  
  20.        EALLOW;  
  21.        SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;  
  22.        EDIS;  
  23.    }  
  24.   
  25.    // Change the PLLCR  
  26.    //结合上述设置 CLKIN=(OSCCLK * 10)/4  
  27.     if (SysCtrlRegs.PLLCR.bit.DIV != val)  
  28.        {  
  29.   
  30.         EALLOW;  
  31.           // Before setting PLLCR turn off missing clock detect logic  
  32.           SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;        //关闭时钟错误检测  
  33.           SysCtrlRegs.PLLCR.bit.DIV = val;            //设置PLL的乘因子  
  34.           EDIS;  
  35.   
  36.           // Optional: Wait for PLL to lock.  
  37.           // During this time the CPU will switch to OSCCLK/2 until  
  38.           // the PLL is stable.  Once the PLL is stable the CPU will  
  39.           // switch to the new PLL value.  
  40.           //  
  41.           // This time-to-lock is monitored by a PLL lock counter.  
  42.           //  
  43.           // Code is not required to sit and wait for the PLL to lock.  
  44.           // However, if the code does anything that is timing critical,  
  45.           // and requires the correct clock be locked, then it is best to  
  46.           // wait until this switching has completed.  
  47.   
  48.           // Wait for the PLL lock bit to be set.  
  49.   
  50.           // The watchdog should be disabled before this loop, or fed within  
  51.           // the loop via ServiceDog().  
  52.   
  53.           // Uncomment to disable the watchdog  
  54.           DisableDog();  
  55.         //等待PLL稳定  
  56.           while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)  
  57.           {  
  58.             // Uncomment to service the watchdog  
  59.               // ServiceDog();  
  60.           }  
  61.           EALLOW;  
  62.           SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;            //使能时钟错误检测  
  63.           EDIS;  
  64.     }  
  65.   
  66.     // If switching to 1/2  
  67.     //传入参数为2,结合上述设置 CLKIN=(OSCCLK * 10)/2  
  68.     if((divsel == 1)||(divsel == 2))        //1为/4,2为/2  
  69.     {  
  70.         EALLOW;  
  71.         SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;  
  72.         EDIS;  
  73.     }  
  74.   
  75.     // If switching to 1/1  
  76.     // * First go to 1/2 and let the power settle  
  77.     //   The time required will depend on the system, this is only an example  
  78.     // * Then switch to 1/1  
  79.     if(divsel == 3)        //只有直通方式或外部晶振方式才可设置此参数3  
  80.     {  
  81.         EALLOW;  
  82.         SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;  
  83.         DSP28x_usDelay(1500);  
  84.         SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;  
  85.         EDIS;  
  86.     }  
  87. }  
复制代码
看门狗电路模块如下

关门狗电路设置一般如下:
  1. void DisableDog(void)  
  2. {  
  3.     EALLOW;  
  4.     SysCtrlRegs.WDCR= 0x0068;  
  5.     EDIS;  
  6. }  
复制代码

下面探讨一下如何配置外围系统的时钟

外设的时钟的总体框架为:



总体配置LOSPSP和HISPSP的代码如下
  1. SysCtrlRegs.HISPCP.all = 0x0000;        //         High speed clock = SYSCLKOUT/1  
  2. SysCtrlRegs.LOSPCP.all = 0x0004;        //         Low speed clock= SYSCLKOUT/8  
复制代码
对于xintf:

配置代码如下:
  1. XintfRegs.XINTCNF2.bit.XTIMCLK = 0;  //XTIMCLK = SYSCLKOUT/1  
  2. XintfRegs.XINTCNF2.bit.CLKMODE = 0;  //XCLKOUT is equal to XTIMCLK  
  3. XintfRegs.XINTCNF2.bit.CLKOFF = 0;    //XCLKOUT is enabled. (default)  
复制代码
配置ADC的代码如下:
  1. //The ADC module is clocked by the high-speed clock (HSPCLK)  
  2.     SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC  
复制代码
同理,对其他外设时钟的配置如下:
  1. SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0;   // I2C  
  2. SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A  
  3. SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 0;   // SCI-B  
  4. SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 0;   // SCI-C  
  5. SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A  
  6. SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A  
  7. SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B  
  8. SysCtrlRegs.PCLKCR0.bit.ECANAENCLK = 0;    // eCAN-A  
  9. SysCtrlRegs.PCLKCR0.bit.ECANBENCLK = 0;    // eCAN-B  
  10.   
  11. SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWM  
  12. SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1  
  13. SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2  
  14. SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0;  // ePWM3  
  15. SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 0;  // ePWM4  
  16. SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM5  
  17. SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6  
  18. SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWM  
  19.   
  20. SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0;  // eCAP3  
  21. SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0;  // eCAP4  
  22. SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 0;  // eCAP5  
  23. SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 0;  // eCAP6  
  24. SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0;  // eCAP1  
  25. SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0;  // eCAP2  
  26. SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 0;  // eQEP1  
  27. SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 0;  // eQEP2  
  28.   
  29. SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0  
  30. SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1  
  31. SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2  
  32.   
  33. SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;       // DMA Clock  
  34. SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK  
  35. SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock
复制代码
完整设置代码如下:
  1. void InitPeripheralClocks(void)  
  2. {  
  3.     EALLOW;  
  4.   
  5.     // HISPCP/LOSPCP prescale register settings, normally it will be set to default values           ???  
  6.     SysCtrlRegs.HISPCP.all = 0x0000;        //分频值为此值乘2,0为1,分频值为2. ADC   60M,         High speed clock = SYSCLKOUT/1  
  7.     SysCtrlRegs.LOSPCP.all = 0x0004;        //分频值为此值乘2,0为1.SCI,SPI,McBsp    15M100        Low speed clock= SYSCLKOUT/8  
  8.   
  9. // XCLKOUT to SYSCLKOUT ratio.  By default XCLKOUT = 1/4 SYSCLKOUT  
  10.    // XTIMCLK = SYSCLKOUT/2  
  11.    XintfRegs.XINTCNF2.bit.XTIMCLK = 0;  //XTIMCLK = SYSCLKOUT/1  
  12.    // XCLKOUT = XTIMCLK/2  
  13.    XintfRegs.XINTCNF2.bit.CLKMODE = 0;  //XCLKOUT is equal to XTIMCLK  
  14.    // Enable XCLKOUT  
  15.    XintfRegs.XINTCNF2.bit.CLKOFF = 0;    //XCLKOUT is enabled. (default)  
  16.   
  17. // Peripheral clock enables set for the selected peripherals.  
  18. // If you are not using a peripheral leave the clock off  
  19. // to save on power.  
  20. //  
  21. // Note: not all peripherals are available on all 2833x derivates.  
  22. // Refer to the datasheet for your particular device.  
  23. //  
  24. // This function is not written to be an example of efficient code.  
  25.     //The ADC module is clocked by the high-speed clock (HSPCLK)  
  26.     SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC  
  27.   
  28.    // *IMPORTANT*  
  29.    // The ADC_cal function, which  copies the ADC calibration values from TI reserved  
  30.    // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the  
  31.    // Boot ROM. If the boot ROM code is bypassed during the debug process, the  
  32.    // following function MUST be called for the ADC to function according  
  33.    // to specification. The clocks to the ADC MUST be enabled before calling this  
  34.    // function.  
  35.    // See the device data manual and/or the ADC Reference  
  36.    // Manual for more information.  
  37.   
  38.     ADC_cal();  
  39.   
  40.   
  41.     SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0;   // I2C  
  42.     SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A  
  43.     SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 0;   // SCI-B  
  44.     SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 0;   // SCI-C  
  45.     SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A  
  46.     SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A  
  47.     SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B  
  48.     SysCtrlRegs.PCLKCR0.bit.ECANAENCLK = 0;    // eCAN-A  
  49.     SysCtrlRegs.PCLKCR0.bit.ECANBENCLK = 0;    // eCAN-B  
  50.   
  51.     SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWM  
  52.     SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1  
  53.     SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2  
  54.     SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0;  // ePWM3  
  55.     SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 0;  // ePWM4  
  56.     SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM5  
  57.     SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6  
  58.     SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWM  
  59.   
  60.     SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0;  // eCAP3  
  61.     SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0;  // eCAP4  
  62.     SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 0;  // eCAP5  
  63.     SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 0;  // eCAP6  
  64.     SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0;  // eCAP1  
  65.     SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0;  // eCAP2  
  66.     SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 0;  // eQEP1  
  67.     SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 0;  // eQEP2  
  68.   
  69.     SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0  
  70.     SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1  
  71.     SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2  
  72.   
  73.     SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;       // DMA Clock  
  74.     SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK  
  75.     SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock  
  76.   
  77.     EDIS;  
  78. }  
复制代码



 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表