TMS320F28335之系統時鐘

TMS320F28335時鐘(1)
PLL作用就是對外部時鐘進行倍頻,降低產生高頻時鐘信號的成本。但是倍頻配置的時候,需要在特定的條件下更改,因此需要檢測PLL工作的各種狀態信號,因此PLL有兩個配置相關寄存器,PLL狀態寄存器PLLSTS和PLL控制寄存器PLLCR。通過對狀態寄存器PLLSTS的判斷,可以判斷PLL的工作狀態,在特定的工作狀態下,對PLL控制寄存器PLLCR進行配置,最後產生合適的時鐘信號CLKIN輸入給CPU,完成整個過程的倍頻。本文詳細介紹了PLL模塊,並對初始化過程和初始化代碼進行了分析。

1.OSC和PLL模塊
OSC和PLL模塊方框圖如圖1所示。
這裏寫圖片描述

基於 PLL 的時鐘模塊提供兩種操作模式:
• 晶振操作模式:允許使用一個外部晶振/諧振器來提供到器件的時基。
• 外部時鐘源操作模式:允許旁通內部振盪器被,時鐘由一個 X1 或者 XCLKIN 引腳上的外部時鐘源輸入生成。

三種輸入時鐘配置如圖2、圖3、圖4所示
這裏寫圖片描述
30MHz 外部石英晶振的典型技術規範如下:
• 基本模式、 並聯諧振
• CL( 負載電容) =12pF
• CL1=CL2=24pF
• C並聯=6pF
• ESR 範圍 = 25 至 40Ω

2.基於 PLL 的時鐘模塊

TMS320F23885上有一個片載、基於PLL倍頻器的時鐘模塊,它提供所有的時鐘信號以及實現對低功耗模式的控制。

PLL作爲DSP的時鐘重要組成部分,它除了提高系統內部SYSCLKOUT的頻率之外,還有一個重要的用途就是監視外部時鐘是不是很好的爲DSP內部提供系統時鐘。
如果PLL處於使能狀態,需要監視PPLSTS寄存器中的MCLKSTS位的狀態。如果MCLKSTS被置位,則軟件要採集恰當的措施保證系統不出現事故,該措施包括使系統停機、復位等。

與PLL配置相關的寄存器有兩個:PLL狀態寄存器PLLSTS和PLL控制寄存器PLLCR,兩個寄存器具體的講解參見第3節。

兩個寄存器中最關鍵的位域分別爲 2位的PLLSTS[DIVSEL]和4位的PLLCR[DIV]。
PLLSTS[DIVSEL]選擇CPU時鐘的分頻係數(/4,/2,/1),PLLCR[DIV] 選擇CPU時鐘的倍頻係數(*1,*2,……,*10)。

比如TMS320F23885最大工作時鐘爲150MHz,通常外部晶振頻率爲30MHz,先將30MHz進行10倍頻變成300MHz,再對300MHz進行2分頻得到150MHz的時鐘。(官方例程裏產生150MHz的方式)

PLL的設置如表1所示。
這裏寫圖片描述
分頻係數的選擇如表2所示。
這裏寫圖片描述
PLL可能的配置模式如表3所示。
這裏寫圖片描述
注:
(1)默認情況下,分頻係數爲4
(2)在改變PLLCR[DIV]倍頻係數前,必須滿足兩個條件:
•PLLSTS[DIVSEL]必須爲0,而PLLSTS[DIVSEL]改變時,PLL必須完成鎖定狀態,即PLLSTS[PLLOCKS]必須爲1
•DSP不能工作在limp mode下,即PLLSTS[MCLKSTS]必須爲0

(3)一旦PLL穩定之後,會鎖定在新的頻率下工作,PLLSTS[PLLLOCKS] = 1,可以改變PLLSTS[DIVSEL]。
(4)在寫入 PLLCR 寄存器之前, 安全裝置模塊(看門狗)應該被禁用。
(5)在 PLL 模塊穩定後,重新啓用安全裝置模塊(看門狗),重啓的時間爲 131072 個 OSCCLK 週期。
(6)在 PLL (VCOCLK) 的輸出頻率不超過300MHz 時候,選擇輸入時鐘和 PLLCR[DIV] 位。
(7)當PLL激活時,即PLL不是旁路(PLLCR[DIV]!=0),必須需要分頻器,即分頻係數不能爲1(PLLSTS[DIVSEL]!=3),這是因爲確保反饋給內核的時鐘具有正確的佔空比。
(8)只有外部復位信號RST和安全裝置(看門狗)產生復位信號時,PLLCR和PLLSTS纔會復位到默認值,而調試器和Missing clock detect logic產生的復位信號不會使兩者復位到默認值。
(9)PLLCR和PLLSTS是受ELLOW保護的。
特別注意:倍頻時一定要分頻,不倍頻時才允許不分頻。

3.PLL配置相關的寄存器

PLL控制寄存器PLLCR如表4所示。
這裏寫圖片描述
PLL狀態寄存器PLLSTS如表5所示。
這裏寫圖片描述
PLLSTS各位的描述如表6所示
這裏寫圖片描述
注:跛行模式(limp mode)系統出現問題的時候,控制邏輯能夠根據對應的條件進行判斷,安排另外的一套控制電平,使得必須控制的負載按照既定的邏輯運行。

4.PLL的初始化
PLL初始化流程圖如圖2所示。
這裏寫圖片描述
根據流程圖,大致可以描述PLL的初始化過程爲:
(1)確保存在OSCCLK,系統能正常工作,即判斷PLLSTS[MCLKSTS]==1?
(2)改變PLLCR[DIV]前,確保PLLSTS[DIVSEL]==0
(3)改變PLLCR[DIV]前,禁用主振盪器故障檢測邏輯模塊,即PLLCR[MCLKOFF]=1
(4)根據需要,改變PLLCR[DIV]
(5)判斷PLL是否穩定鎖定,即PLLSTS[PLLLOCKS]==1?
(6)使能主振盪器故障檢測邏輯模塊,即PLLCR[MCLKOFF]=0
(7)根據需要,改變PLLSTS[DIVSEL]

PLL初始化的代碼如下(來自官方例程,主要對其註釋分析和講解)。

/*
 * 函數名稱:InitPll
 * 函數輸入:倍頻參數val,分頻參數divsel
 *            val取值爲0到10,表示倍頻數;divsel取值0到4,0和1表示4分頻,2表示2分頻,3表示不分頻
 * 函數輸出:無
 * 函數調用:InitPll(10,2);
 * 先將外部時鐘倍頻10倍,在分頻1/2,最後產生的時鐘CLKIN輸入CPU28x
 */
void InitPll(unsigned short div, unsigned short divsel)
{

   // 確保PLL不是工作在limp mode下,即有外部時鐘進入PLL
   if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)
   {
      //檢測到無外部時鐘,軟件要採集恰當的措施保證系統不出現事故,該措施包括
      //使系統停機、復位等
      //用適合的函數替換下面一行
      // SystemShutdown(); function.
      asm("        ESTOP0");
   }

   // PLLCR從0x0000改變前,PLLSTS[DIVSEL]必須爲0
   // 外部RST復位信號會使PLLSTS[DIVSEL]復位
   // 此時分頻爲1/4
   if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)
   {
       EALLOW;
       SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
       EDIS;
   }

   // 前面條件都滿足後,可以改變PLLCR[DIV]
   if (SysCtrlRegs.PLLCR.bit.DIV != val)
   {

      EALLOW;
      // 在設置PLLCR[DIV]前,要禁用主振盪器檢測邏輯
      //Missing clock detect logic
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
      SysCtrlRegs.PLLCR.bit.DIV = div;
      EDIS;

      //等待PLL穩定且處於鎖定狀態,即PLLSTS[LOCKS]置位
      //等待穩定的時間可能略長,需要禁用看門狗或者循環喂狗

      //屏蔽註釋,禁用看門夠
      DisableDog();

      while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)
      {
          //屏蔽註釋,喂狗
          // ServiceDog();
      }

      EALLOW;
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
      EDIS;
    }

    // 如果需要分頻1/2
    if((divsel == 1)||(divsel == 2))
    {
        EALLOW;
        SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;
        EDIS;
    }

    //注意:下面代碼只有在PLL是旁路或者關閉模式時,纔可被執行,其他模式禁止。
    //倍頻時一定要分頻,不倍頻時才允許不分頻
    //如果需要切換分頻到1/1
    // * 首先從默認1/4分頻切換到1/2分頻,讓電源穩定
    //   穩定所需要的時間依賴於系統運行速度,此處延時50us只是作爲一個特例
    // * 穩定後,再切換到1/1
    if(divsel == 3)
    {
        EALLOW;
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
        DELAY_US(50L);
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
        EDIS;
    }
}

5.本章小結

本章介紹OSC和PLL模塊,闡述了二種外部時鐘輸入的操作模式,然後對外部時鐘進行倍頻分析,即PLL模塊,對PLL模塊的寄存器和操作進行了詳細的分析,最後給出了PLL初始化代碼並對代碼進行了註釋分析。對基本設置特別要強調的是PLL倍頻時一定要分頻,不倍頻時才允許不分頻。

TMS320F28335時鐘(2)
TMS320F28335通過外部時鐘信號、OSC和PLL產生倍頻時鐘信號CLKIN後,CLKIN經過CPU後產生時鐘SYSCLKOUT(CLKIN和SYSCLKOUT頻率是一樣的),SYSCLKOUT給各個片內外設提供時鐘信號。爲了實現低功耗和提供高低頻率時鐘信號,需要把SYSCLKOUT進一步分頻,本章主要講解了對SYSCLKOUT分頻產生低頻時鐘信號和高頻時鐘信號,完成外設時鐘初始化的過程。

1.時鐘系統

時鐘系統結構如圖1所示。

這裏寫圖片描述
從圖1可以看出,時鐘CLKIN經過CPU後產生時鐘SYSCLKOUT(CLKIN和SYSCLKOUT頻率是一樣的),SYSCLKOUT給各個片內外設提供時鐘;除了SPI、SCI、McBSP模塊使用低頻時鐘,ADC使用高頻時鐘外,其他外設模塊都是採用SYSCLKOUT時鐘。爲了實現低功耗,必須對每個片內外設時鐘進行開關控制;爲了實現高低頻率時鐘,必須對SYSCLKOUT進行不同的分頻處理,因此與外設時鐘配置相關的寄存器主要有兩類:外設時鐘控制寄存器PCLKCR和高低頻外設時鐘分頻寄存器SPCP。

第一類寄存器是外設時鐘控制寄存器PCLKCR,它包括16位的PCLKCR0、PCLKCR1、PCLKCR3(不知道爲什麼跳過了PCLKCR2??),主要是控制使能和禁用外設時鐘;
第二類寄存器是高低頻外設時鐘分頻寄存器,它包括高頻外設時鐘分頻寄存器16位的HISPCP(High-Speed Peripheral Clock Prescaler Register)和低頻外設時鐘分頻寄存器16位的LOSPCP(Low-Speed Peripheral Clock Prescaler Register)

2.與外設時鐘配置相關的寄存器

控制片內外設時鐘開關的外設時鐘控制寄存器PCLKCR0、PCLKCR1、PCLKCR3如表1、表2、表3所示。

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
從表1、表2、表3可以看出,默認情況下,除了3個CPU定時器和GPIO口輸入採樣時鐘使能外,其他所有外設的時鐘是禁用的。
**注:
- PCLKCR0、PCLKCR1、PCLKCR3均受ELLOW保護。
- 不使用某外設模塊時,可以禁用該時鐘模塊的時鐘以省電。 **

產生高低頻外設時鐘的分頻寄存器HISPCP和LOSPCP分別如表4和表5所示。
這裏寫圖片描述
這裏寫圖片描述
兩個寄存器具體位域描述分別如表6和表7所示。
這裏寫圖片描述
這裏寫圖片描述
從表4到表7可以看出,16位的高頻外設時鐘分頻寄存器HISPCP和低頻外設時鐘分頻寄存器LOSPCP都只用了低3位;兩個寄存器都受ELLOW保護;分頻計算方法:當分頻係數爲0,表示時鐘等於SYSCLKOUT/1,當分頻係數不爲0時,CLK=SYSCLKOUT/(n×2)。

3.時鐘輸出

SYSCLKOUT可以按1、2、4分頻從TMS320F28335的XCLKOUT引腳輸出,SYSCLKOUT輸出示意圖如2所示。
這裏寫圖片描述
從圖2可以看出,上電或復位默認情況下,SYSCLK2分頻產生XTIMCLK,XTIMCLK再通過2分頻產生XCLKOUT時鐘,該時鐘信號通過引腳XCLKOUT輸出,即默認情況下XCLKOUT=SYSCLK/4=OSCCLK/16,調試時可以觀察該引腳的信號以判斷設備是否在正確的時鐘下工作。
注:
- XCLKOUT引腳上電或者復位默認情況下是激活狀態的。
- XCLKOUT引腳沒有上拉或者下拉電阻。
- 如果XCLKOUT引腳不使用時,可以通過XINTCNF2[CLKOFF]=1關閉。
- 默認情況下,XTIMCLK=SYSCLKOUT/2,它是外擴模塊(外擴FLASH、SRAM等)的時鐘

4.外設時鐘初始化代碼

此初始化代碼主要來自TI官方例程,註釋是個人理解。

/*
*函數名稱:InitPeripheralClocks
*輸入參數:無
*輸出參數:無
*函數功能:初始化外設時鐘模塊,主要包括產生高低速時鐘、開關所需片內外設模塊時*鍾等
*/
void InitPeripheralClocks(void)
{
   EALLOW;

// 高低頻外設時鐘分頻寄存器HISPCP/LOSPCP設置,正常情況下采用默認值,即高頻時鐘爲SYSCLKOUT/2,低速時鐘爲SYSCLKOUT/4
   SysCtrlRegs.HISPCP.all = 0x0001;
   SysCtrlRegs.LOSPCP.all = 0x0002;

// 時鐘輸出引腳XCLKOUT設置,默認情況XCLKOUT = SYSCLKOUT/4 
   // XTIMCLK = SYSCLKOUT/2
   XintfRegs.XINTCNF2.bit.XTIMCLK = 1;//extern interface clock<->XinfCLK
   // XCLKOUT = XTIMCLK/2
   XintfRegs.XINTCNF2.bit.CLKMODE = 1;
   // Enable XCLKOUT
   XintfRegs.XINTCNF2.bit.CLKOFF = 0;

// 給所選用外設使能外設時鐘
// 如果不使用某外設模塊,禁用它的時鐘以省電
// 下面代碼要根據自己使用的外設模塊進行相應的修改

   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC

   // *重要提醒*
   // ADC_cal()函數, 可以從TI保留的OTP中複製ADC校驗值,並將校驗值賦值給ADCREFSEL和ADCOFFTRIM寄存器,該過程在BOOT ROM中自動地完成
   //如果在調試過程中,BOOT ROM代碼旁路未使用,那麼必須顯示調用下面 ADC_cal()函數(推薦顯示調用)
   //在調用 ADC_cal()前,必須使能ADC時鐘
   // 有關ADC更多的信息參見設備數據手冊

   ADC_cal();

//本例中使能了所有片內外設模塊時鐘
   SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;   // I2C
   SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A
   SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;   // SCI-B
   SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1;   // SCI-C
   SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A
   SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A
   SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B
   SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;    // eCAN-A
   SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1;    // eCAN-B

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWM
   SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1
   SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2
   SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;  // ePWM3
   SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;  // ePWM4
   SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM5
   SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWM

   SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;  // eCAP3
   SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;  // eCAP4
   SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;  // eCAP5
   SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;  // eCAP6
   SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;  // eCAP1
   SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;  // eCAP2
   SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;  // eQEP1
   SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;  // eQEP2

   SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2

   SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;       // DMA Clock
   SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK
   SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock

   EDIS;
}

5.本章小結

本章主要講解了對SYSCLKOUT分頻產生低頻時鐘信號和高頻時鐘信號,完成外設時鐘初始化的過程。

TMS320F28335時鐘(3)
本章對整個TMS320F28335時鐘系統做個簡要的總結,是對前面凌亂講解的補充和梳理,希望藉此總結可以更全面更徹底的掌握TMS320F28335時鐘系統。

1.時鐘源

外部時鐘信號或者外部晶振震盪信號,具體參見《TMS320F28335時鐘1》。

2.時鐘產生過程

外部時鐘或者外部晶振給F28335提供時鐘源OSCCLK,使能F28335片上PLL電路,PLL電路對時鐘源信號進行倍頻,產生時鐘CLKIN(具體操作過程和代碼詳見《TMS320F28335時鐘1》),CLKIN通過CPU產生時鐘SYSCLKOUT,SYSCLKOUT經過分頻可以產生低速時鐘LOSPCLK和高速時鐘HISPCLK,最後OSCCLK、CLKIN、SYSCLKOUT、LOSPCLK和HISPCLK給各個模塊提供時鐘(具體操作過程和代碼詳見《TMS320F28335時鐘2》)。

3.需要時鐘信號的片上外設

看門狗電路WatchDog,CPU定時器(3個32位定時器),1個I2C,2個eCAN總線控制器,SCI(3個異步串行通信控制器),SPI(1個4線制同步串口),McBSP(2個多通道緩衝型同步串口),6個PWM單元,6個事件捕捉單元,2個QEP正交編碼脈衝,12位ADC(16通道)等。

4.片上外設按輸入時鐘分組

(1)OSCCLK組:看門狗電路
(2)CLKIN組:CPU
(3)SYSOUTCLK組:I2C、eCAN總線、PWM、eCAP、eQEP、CPU定時器
(4)低速組(LOSPCLK):SCI,SPI,McBSP
(5)高速組(HISPCLK):ADC

5.其他時鐘

TMS320F2833x提供了時鐘輸出引腳和外擴接口,因此還有產生了兩種時鐘,即XCLKOUT和XTIMCLK。默認情況下,XCLKOUT=XTIMCLK/2=SYSCLKOUT/4=OSCCLK/16。特別要注意的是所有的外部擴展訪問都是以內部XINTF的時鐘XTIMCLK爲參考的,所有外部接口的訪問都是在XCLKOUT的上升沿開始(具體操作過程和代碼詳見《TMS320F28335時鐘2》)。

TI官方頭文件DSP2833x_SysCtrl.h程序如下:

// TI File $Revision: /main/5 $
// Checkin $Date: May 12, 2008   09:34:58 $
//###########################################################################
//
// FILE:   DSP2833x_SysCtrl.h
//
// TITLE:  DSP2833x Device 系統控制寄存器.
//
//###########################################################################
// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
// $Release Date: August 4, 2009 $
//###########################################################################

#ifndef DSP2833x_SYS_CTRL_H
#define DSP2833x_SYS_CTRL_H


#ifdef __cplusplus
extern "C" {
#endif


//---------------------------------------------------------------------------
// 系統控制個人註冊定義:
//


// PLL 狀態寄存器位定義
struct PLLSTS_BITS   {    // bits  描述
   Uint16 PLLLOCKS:1;     // 0     PLL鎖狀態
   Uint16 rsvd1:1;        // 1     保留
   Uint16 PLLOFF:1;       // 2     PLL關閉
   Uint16 MCLKSTS:1;      // 3     丟失時鐘信號狀態
   Uint16 MCLKCLR:1;      // 4     丟失時鐘清除位
   Uint16 OSCOFF:1;       // 5     振盪器時鐘關閉位
   Uint16 MCLKOFF:1;      // 6     丟失時鐘檢測關閉位
   Uint16 DIVSEL:2;       // 7     時鐘分頻選擇
   Uint16 rsvd2:7;        // 15:7  保留
};
// PLL狀態寄存器
union PLLSTS_REG {
   Uint16              all;
   struct PLLSTS_BITS  bit;     // PLL 狀態寄存器位定義
};

// 高速外設時鐘預分頻寄存器位定義:
struct HISPCP_BITS  {   // bits  描述
   Uint16 HSPCLK:3;     // 2:0   SYSCLKOUT分頻配置
   Uint16 rsvd1:13;     // 15:3  保留
};
// 高速外設時鐘預分頻寄存器
union HISPCP_REG {
   Uint16              all;
   struct HISPCP_BITS  bit;     // 高速外設時鐘預分頻寄存器位定義
};

// 低速外設時鐘預分頻寄存器位定義:
struct LOSPCP_BITS  {   // bits  描述
   Uint16 LSPCLK:3;     // 2:0   SYSCLKOUT分頻配置
   Uint16 rsvd1:13;     // 15:3  保留
};
// 低速外設時鐘預分頻寄存器
union LOSPCP_REG {
   Uint16              all;
   struct LOSPCP_BITS  bit;     // 低速外設時鐘預分頻寄存器位定義
};

// 外設時鐘控制寄存器0定義:
struct PCLKCR0_BITS  {   // bits  描述
   Uint16 rsvd1:2;       // 1:0   保留
   Uint16 TBCLKSYNC:1;   // 2     EWPM模塊時基時鐘同步使能
   Uint16 ADCENCLK:1;    // 3     ADC時鐘使能
   Uint16 I2CAENCLK:1;   // 4     I2C時鐘使能
   Uint16 SCICENCLK:1;   // 5     SCI-C時鐘使能
   Uint16 rsvd2:2;       // 7:6   保留
   Uint16 SPIAENCLK:1;   // 8     SPI-A時鐘使能
   Uint16 rsvd3:1;       // 9     保留
   Uint16 SCIAENCLK:1;   // 10    SCI-A時鐘使能
   Uint16 SCIBENCLK:1;   // 11    SCI-B時鐘使能
   Uint16 MCBSPAENCLK:1; // 12    McBSP-A時鐘使能
   Uint16 MCBSPBENCLK:1; // 13    McBSP-B時鐘使能
   Uint16 ECANAENCLK:1;  // 14    eCAN-A時鐘使能
   Uint16 ECANBENCLK:1;  // 15    eCAN-B時鐘使能
};
// 外設時鐘控制寄存器0
union PCLKCR0_REG {
   Uint16              all;
   struct PCLKCR0_BITS bit;     // 外設時鐘控制寄存器0定義
};

// 外設時鐘控制寄存器1定義:
struct PCLKCR1_BITS  {    // bits  描述
   Uint16 EPWM1ENCLK:1;   // 0     EPWM1時鐘使能
   Uint16 EPWM2ENCLK:1;   // 1     EPWM2時鐘使能
   Uint16 EPWM3ENCLK:1;   // 2     EPWM3時鐘使能
   Uint16 EPWM4ENCLK:1;   // 3     EPWM4時鐘使能
   Uint16 EPWM5ENCLK:1;   // 4     EPWM5時鐘使能
   Uint16 EPWM6ENCLK:1;   // 5     EPWM6時鐘使能
   Uint16 rsvd1:2;        // 7:6   保留
   Uint16 ECAP1ENCLK:1;   // 8     ECAP1時鐘使能
   Uint16 ECAP2ENCLK:1;   // 9     ECAP2時鐘使能
   Uint16 ECAP3ENCLK:1;   // 10    ECAP3時鐘使能
   Uint16 ECAP4ENCLK:1;   // 11    ECAP4時鐘使能
   Uint16 ECAP5ENCLK:1;   // 12    ECAP5時鐘使能
   Uint16 ECAP6ENCLK:1;   // 13    ECAP6時鐘使能
   Uint16 EQEP1ENCLK:1;   // 14    EQEP1時鐘使能
   Uint16 EQEP2ENCLK:1;   // 15    EQEP2時鐘使能
};
// 外設時鐘控制寄存器1
union PCLKCR1_REG {
   Uint16              all;
   struct PCLKCR1_BITS bit;     // 外設時鐘控制寄存器1定義
};

// 外設時鐘控制寄存器3定義:
struct PCLKCR3_BITS  {        // bits  描述
   Uint16 rsvd1:8;            // 7:0   保留
   Uint16 CPUTIMER0ENCLK:1;   // 8     CPU-Timer 0時鐘使能
   Uint16 CPUTIMER1ENCLK:1;   // 9     CPU-Timer 1時鐘使能
   Uint16 CPUTIMER2ENCLK:1;   // 10    CPU-Timer 2時鐘使能
   Uint16 DMAENCLK:1;         // 11    DMA時鐘使能
   Uint16 XINTFENCLK:1;       // 12    XINTF時鐘使能
   Uint16 GPIOINENCLK:1;      // 13    GPIO時鐘使能
   Uint16 rsvd2:2;            // 15:14 保留
};
// 外設時鐘控制寄存器3
union PCLKCR3_REG {
   Uint16              all;
   struct PCLKCR3_BITS bit;     // 外設時鐘控制寄存器3定義:
};


// PLL 鎖相環控制寄存器位定義:
struct PLLCR_BITS {      // bits  描述
   Uint16 DIV:4;         // 3:0   PLL時鐘倍頻數
   Uint16 rsvd1:12;      // 15:4  保留
};
// PLL 鎖相環控制寄存器
union PLLCR_REG {
   Uint16             all;
   struct PLLCR_BITS  bit;      // PLL 鎖相環控制寄存器位定義
};

// 低功耗模式控制寄存器位定義:
struct LPMCR0_BITS {     // bits  描述
   Uint16 LPM:2;         // 1:0   低功耗模式設置
   Uint16 QUALSTDBY:6;   // 7:2   STANDBY喚醒
   Uint16 rsvd1:7;       // 14:8  保留
   Uint16 WDINTE:1;      // 15    看門狗中斷使能
};
// 低功耗模式控制寄存器
union LPMCR0_REG {
   Uint16              all;
   struct LPMCR0_BITS  bit;     // 低功耗模式控制寄存器位定義
};

// 映射地址寄存器位定義:
struct MAPCNF_BITS {     // bits  描述
    Uint16 MAPEPWM:1;    // 0     映射地址使能
    Uint16 rsvd1:15;     // 15:1  保留
};
// 映射地址寄存器
union MAPCNF_REG {
    Uint16             all;
    struct MAPCNF_BITS bit;     // 映射地址寄存器位定義
};

//---------------------------------------------------------------------------
// 系統控制寄存器文件:
//
struct SYS_CTRL_REGS {
   Uint16              rsvd1;     // 0   保留
   union   PLLSTS_REG  PLLSTS;    // 1   PLL狀態寄存器
   Uint16              rsvd2[8];  // 2-9 保留
   union   HISPCP_REG  HISPCP;    // 10: 高速外設時鐘預分頻寄存器
   union   LOSPCP_REG  LOSPCP;    // 11: 低速外設時鐘預分頻寄存器
   union   PCLKCR0_REG PCLKCR0;   // 12: 外設時鐘控制寄存器0
   union   PCLKCR1_REG PCLKCR1;   // 13: 外設時鐘控制寄存器1
   union   LPMCR0_REG  LPMCR0;    // 14: 低功耗模式控制寄存器
   Uint16              rsvd3;     // 15: 保留
   union   PCLKCR3_REG PCLKCR3;   // 16: 外設時鐘控制寄存器3
   union   PLLCR_REG   PLLCR;     // 17: PLL 鎖相環控制寄存器
   // No bit definitions are defined for SCSR because
   // a read-modify-write instruction can clear the WDOVERRIDE bit
   Uint16              SCSR;      // 18: 系統控制與狀態寄存器
   Uint16              WDCNTR;    // 19: 看門狗計數器寄存器
   Uint16              rsvd4;     // 20  保留
   Uint16              WDKEY;     // 21: 看門狗復位寄存器
   Uint16              rsvd5[3];  // 22-24 保留
   // No bit definitions are defined for WDCR because
   // the proper value must be written to the WDCHK field
   // whenever writing to this register.
   Uint16              WDCR;      // 25: 看門狗控制寄存器
   Uint16              rsvd6[4];  // 26-29 保留
   union   MAPCNF_REG  MAPCNF;    // 30: 映射地址寄存器
   Uint16              rsvd7[1];  // 31  保留
};


/* --------------------------------------------------- */
/* CSM 寄存器                                       */
/*                                                     */
/* ----------------------------------------------------*/

/* CSM 狀態與控制寄存器位定義 */
struct  CSMSCR_BITS {      // bit   描述
   Uint16     SECURE:1;    // 0     僅讀位映射安全狀態
   Uint16     rsvd1:14;    // 14-1  保留
   Uint16     FORCESEC:1;  // 15    清除KEY寄存器並保護芯片

};

/* CSM 狀態與控制寄存器*/
union CSMSCR_REG {
   Uint16             all;
   struct CSMSCR_BITS bit;      //CSM 狀態與控制寄存器位定義
};

/* CSM 寄存器文件*/
struct  CSM_REGS {
   Uint16           KEY0;    // KEY reg bits 15-0
   Uint16           KEY1;    // KEY reg bits 31-16
   Uint16           KEY2;    // KEY reg bits 47-32
   Uint16           KEY3;    // KEY reg bits 63-48
   Uint16           KEY4;    // KEY reg bits 79-64
   Uint16           KEY5;    // KEY reg bits 95-80
   Uint16           KEY6;    // KEY reg bits 111-96
   Uint16           KEY7;    // KEY reg bits 127-112
   Uint16           rsvd1;   // 保留
   Uint16           rsvd2;   // 保留
   Uint16           rsvd3;   // 保?
   Uint16           rsvd4;   // 保留
   Uint16           rsvd5;   // 保留
   Uint16           rsvd6;   // 保留
   Uint16           rsvd7;   // 保留
   union CSMSCR_REG CSMSCR;  // CSM 狀態與控制寄存器位定義
};

/* 密碼位置 */
struct  CSM_PWL {
   Uint16   PSWD0;  // PSWD bits 15-0
   Uint16   PSWD1;  // PSWD bits 31-16
   Uint16   PSWD2;  // PSWD bits 47-32
   Uint16   PSWD3;  // PSWD bits 63-48
   Uint16   PSWD4;  // PSWD bits 79-64
   Uint16   PSWD5;  // PSWD bits 95-80
   Uint16   PSWD6;  // PSWD bits 111-96
   Uint16   PSWD7;  // PSWD bits 127-112
};

/* Flash 寄存器 */

#define FLASH_SLEEP   0x0000;
#define FLASH_STANDBY 0x0001;
#define FLASH_ACTIVE  0x0003;

/* Flash 選擇寄存器位定義*/
struct  FOPT_BITS {       // bit   描述
   Uint16     ENPIPE:1;   // 0     使能流水線模式
   Uint16     rsvd:15;    // 1-15  保留
};

/* Flash 選擇寄存器*/
union FOPT_REG {
   Uint16           all;
   struct FOPT_BITS bit;    //Flash 選擇寄存器位定義
};

/* Flash 功耗模式寄存器位定義 */
struct  FPWR_BITS {       // bit   描述
   Uint16     PWR:2;      // 0-1   功耗模式位
   Uint16     rsvd:14;    // 2-15  保留
};

/* Flash 功耗模式寄存器*/
union FPWR_REG {
   Uint16           all;
   struct FPWR_BITS bit;    //Flash 功耗模式寄存器位定義
};

/* Flash 狀態寄存器位定義 */
struct  FSTATUS_BITS {       // bit   描述
   Uint16     PWRS:2;        // 0-1   功耗模式狀態位
   Uint16     STDBYWAITS:1;  // 2     flash從睡眠模式到備用態計數狀態
   Uint16     ACTIVEWAITS:1; // 3     flash從備用模式到激活態計數狀態
   Uint16     rsvd1:4;       // 4-7   保留
   Uint16     V3STAT:1;      // 8     flash電壓狀態鎖存位
   Uint16     rsvd2:7;       // 9-15  保留
};

/* Flash 狀態寄存器*/
union FSTATUS_REG {
   Uint16              all;
   struct FSTATUS_BITS bit;     //Flash 狀態寄存器位定義 
};

/* Flash 備用等待寄存器位定義 */
struct  FSTDBYWAIT_BITS {    // bit   描述
   Uint16     STDBYWAIT:9;   // 0-8   flash有睡眠到備用態的計數位
   Uint16     rsvd:7;        // 9-15  保留
};

/* Flash 備用等待寄存器*/
union FSTDBYWAIT_REG {
   Uint16                 all;
   struct FSTDBYWAIT_BITS bit;  //Flash 備用等待寄存器位定義
};

/* Flash 備用到激活態等待寄存器位定義 */
struct  FACTIVEWAIT_BITS {   // bit   描述
   Uint16     ACTIVEWAIT:9;  // 0-8   flash備用到激活態等待計數
   Uint16     rsvd:7;        // 9-15  保留
};

/* Flash 備用到激活態等待寄存器 */
union FACTIVEWAIT_REG {
   Uint16                  all;
   struct FACTIVEWAIT_BITS bit;     //Flash 備用到激活態等待寄存器位定義 
};

/* flash頁訪問等待寄存器位定義 */
struct  FBANKWAIT_BITS {     // bit   描述
   Uint16     RANDWAIT:4;    // 0-3   Flash 隨機訪問等待週期數
   Uint16     rsvd1:4;       // 4-7   保留
   Uint16     PAGEWAIT:4;    // 8-11  Flash 頁訪問等待週期數
   Uint16     rsvd2:4;       // 12-15 保留
};

/* flash頁訪問等待寄存器*/
union FBANKWAIT_REG {
   Uint16                all;
   struct FBANKWAIT_BITS bit;       //flash頁訪問等待寄存器位定義
};

/* OTP 等待狀態寄存器位定義 */
struct  FOTPWAIT_BITS {      // bit   描述
   Uint16     OTPWAIT:5;     // 0-4   OTP讀等待狀態位
   Uint16     rsvd:11;       // 5-15  保留
};

/* OTP 等待狀態寄存器*/
union FOTPWAIT_REG {
   Uint16               all;
   struct FOTPWAIT_BITS bit;        //OTP 等待狀態寄存器位定義
};

//flash寄存器
struct FLASH_REGS {
   union FOPT_REG        FOPT;        // Flash 選擇寄存器
   Uint16                rsvd1;       // 保留
   union FPWR_REG        FPWR;        // Flash 功耗模式寄存器
   union FSTATUS_REG     FSTATUS;     // Flash 狀態寄存器
   union FSTDBYWAIT_REG  FSTDBYWAIT;  // Flash 備用等待寄存器
   union FACTIVEWAIT_REG FACTIVEWAIT; // Flash 備用到激活態等待寄存器
   union FBANKWAIT_REG   FBANKWAIT;   // flash頁訪問等待寄存器
   union FOTPWAIT_REG    FOTPWAIT;    //  OTP 等待狀態寄存器
};

//---------------------------------------------------------------------------
// 系統控制外部引用和函數聲明:
//
extern volatile struct SYS_CTRL_REGS SysCtrlRegs;
extern volatile struct CSM_REGS CsmRegs;
extern volatile struct CSM_PWL CsmPwl;
extern volatile struct FLASH_REGS FlashRegs;


#ifdef __cplusplus
}
#endif /* extern "C" */

#endif  // end of DSP2833x_SYS_CTRL_H definition

//===========================================================================
// End of file.
//===========================================================================

官網例程文件DSP2833x_SysCtrl.c程序如下:

// TI File $Revision: /main/8 $
// Checkin $Date: April 15, 2009   09:54:05 $
//###########################################################################
//
// FILE:   DSP2833x_SysCtrl.c
//
// TITLE:  DSP2833x Device S系統控制初始化和支持功能.
//
// DESCRIPTION:
//
//         系統資源初始化的示例.
//
//###########################################################################
// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
// $Release Date: August 4, 2009 $
//###########################################################################


#include "DSP2833x_Device.h"     // Headerfile Include File
#include "DSP2833x_Examples.h"   // Examples Include File


//函數將從RAM運行需要分配給一個不同的部分。本節將被映射到一個使用鏈接器cmd文件加載並運行地址。
#pragma CODE_SECTION(InitFlash, "ramfuncs");

//---------------------------------------------------------------------------
// InitSysCtrl:
//---------------------------------------------------------------------------
// 該函數初始化系統控制寄存器到一個已知狀態.
// - 禁用看門狗
// - 設置 PLLCR寄存器及適當的 SYSCLKOUT 頻率
// - 設置高/低外設時鐘預分頻寄存器
// - 使能相應的外設時鐘控制寄存器

void InitSysCtrl(void)                      //初始化系統控制
{
   DisableDog();                            //關閉看門狗
   InitPll(DSP28_PLLCR,DSP28_DIVSEL);       //初始化PLL控制
   InitPeripheralClocks();                  //初始化外設時鐘
}


//---------------------------------------------------------------------------
// 例子: InitFlash:
//---------------------------------------------------------------------------
// 改函數初始化flash控制寄存器

//                   警告
// This function MUST be executed out of RAM. Executing it
// out of OTP/Flash will yield unpredictable results

void InitFlash(void)                        //初始化flash
{
   EALLOW;
   FlashRegs.FOPT.bit.ENPIPE = 1;           //使能flash流水線模式

   //                警告
   //Minimum waitstates required for the flash operating
   //at a given CPU rate must be characterized by TI.
   //Refer to the datasheet for the latest information.
#if CPU_FRQ_150MHZ

   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;    //Flash 頁訪問等待週期數

   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;    //Flash 隨機訪問等待週期數

   FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;      //OTP讀等待狀態位
#endif

#if CPU_FRQ_100MHZ

   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 3;    //Flash 頁訪問等待週期數

   FlashRegs.FBANKWAIT.bit.RANDWAIT = 3;    //Flash 隨機訪問等待週期數

   FlashRegs.FOTPWAIT.bit.OTPWAIT = 5;      //OTP讀等待狀態位
#endif
   //                警告
   //這兩個寄存器應該使用默認值
   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;     //flash有睡眠到備用態的計數位
   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;   //flash備用到激活態等待計數
   EDIS;

   //Force a pipeline flush to ensure that the write to
   //the last register configured occurs before returning.

   asm(" RPT #7 || NOP");
}


//---------------------------------------------------------------------------
// 例子: ServiceDog:
//---------------------------------------------------------------------------
// 這個函數重置看門狗定時器.
// 在應用程序中使用這個函數啓用這個功能

void ServiceDog(void)
{
    EALLOW;
    SysCtrlRegs.WDKEY = 0x0055; //清零看門狗
    SysCtrlRegs.WDKEY = 0x00AA;
    EDIS;
}

//---------------------------------------------------------------------------
// Example: DisableDog:
//---------------------------------------------------------------------------
// 這個函數禁止看門狗定時器.

void DisableDog(void)
{
    EALLOW;
    SysCtrlRegs.WDCR= 0x006F; //WDDIS=1禁止看門狗模塊
    EDIS;
}

//---------------------------------------------------------------------------
// Example: EnableDog: 
//---------------------------------------------------------------------------
// 這個函數使能看門狗定時器. 
void EnableDog(void)
{
    EALLOW;
    SysCtrlRegs.WDCR= 0x00aF;   //使能看門狗
    EDIS;
}

//---------------------------------------------------------------------------
// Example: InitPll: 
//---------------------------------------------------------------------------
/*
 * 函數名稱:InitPll
 * 函數輸入:倍頻參數val,分頻參數divsel
 *            val取值爲0到10,表示倍頻數;divsel取值0到4,0和1表示4分頻,2表示2分頻,3表示不分頻
 * 函數輸出:無
 * 函數調用:InitPll(10,2);
 * 先將外部時鐘倍頻10倍,在分頻1/2,最後產生的時鐘CLKIN輸入CPU28x
 */

void InitPll(Uint16 val, Uint16 divsel)
{

   // 確保PLL不是工作在limp mode下,即有外部時鐘進入PLL
   if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)  
   {
      //檢測到無外部時鐘,軟件要採集恰當的措施保證系統不出現事故,該措施包括
      //使系統停機、復位等
      //用適合的函數替換下面一行
      // SystemShutdown(); function.
      asm("        ESTOP0");
   }

   // PLLCR從0x0000改變前,PLLSTS[DIVSEL]必須爲0
   // 外部RST復位信號會使PLLSTS[DIVSEL]復位
   // 此時分頻爲1/4
   if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)
   {
       EALLOW;
       SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
       EDIS;
   }

   // 前面條件都滿足後,可以改變PLLCR[DIV]
   if (SysCtrlRegs.PLLCR.bit.DIV != val)
   {

      EALLOW;
      // 在設置PLLCR[DIV]前,要禁用主振盪器檢測邏輯
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
      SysCtrlRegs.PLLCR.bit.DIV = val;  //設置倍頻
      EDIS;

    //等待鎖相環進入在鎖狀態。
    //在此期間CPU將切換到OSCCLK / 2。
    //直到鎖相環穩定。
    //一旦鎖相環穩定CPU切換到新的倍頻值。
    //這個鎖定時間由鎖相環計數器監視。
    //等待這個切換完成。
    //取消對看門狗的禁用
        DisableDog();

      while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)//已穩定
      {
          // Uncomment to service the watchdog
          // ServiceDog();
      }

      EALLOW;
      SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;//開啓主振盪器檢測邏輯
      EDIS;
    }

    //如果需要分頻1/2
    if((divsel == 1)||(divsel == 2))
    {
        EALLOW;
        SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel; //設置分頻
        EDIS;
    }

    //注意:下面代碼只有在PLL是旁路或者關閉模式時,纔可被執行,其他模式禁止。
    //倍頻時一定要分頻,不倍頻時才允許不分頻
    //如果需要切換分頻到1/1
    // * 首先從默認1/4分頻切換到1/2分頻,讓電源穩定
    //   穩定所需要的時間依賴於系統運行速度,此處延時50us只是作爲一個特例
    // * 穩定後,再切換到1/1
    if(divsel == 3)
    {
        EALLOW;
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
        DELAY_US(50L);
        SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
        EDIS;
    }
}

//--------------------------------------------------------------------------
// 實例: InitPeripheralClocks:
//---------------------------------------------------------------------------
// 改函數初始化時鐘的外圍模塊.
// 首先設置高/低外設時鐘預分頻寄存器
// 第二個是啓用外圍時鐘.
// 降低功耗,將未使用的外設時鐘禁止
//
// 註釋: 如果一個外設的時鐘不啓用則你不能讀寫這個外圍的寄存器

void InitPeripheralClocks(void)
{
   EALLOW;

    // HISPCP / LOSPCP預分頻寄存器設置,通常它會被設置爲默認值
   SysCtrlRegs.HISPCP.all = 0x0001;       // 75MHZ
   SysCtrlRegs.LOSPCP.all = 0x0001;       // 75Mhz

   // 時鐘輸出引腳XCLKOUT設置,默認情況XCLKOUT = SYSCLKOUT/4 
   // xintf外部接口時鐘
   // XTIMCLK = SYSCLKOUT/2
   XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
   // XCLKOUT = XTIMCLK/2
   XintfRegs.XINTCNF2.bit.CLKMODE = 1;
   // Enable XCLKOUT
   XintfRegs.XINTCNF2.bit.CLKOFF = 0;

    // 給所選用外設使能外設時鐘
    // 如果不使用某外設模塊,禁用它的時鐘以省電
    // 下面代碼要根據自己使用的外設模塊進行相應的修改

   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    //ADC時鐘使能

   // *重要提醒*
   // ADC_cal()函數, 可以從TI保留的OTP中複製ADC校驗值,並將校驗值賦值給ADCREFSEL和ADCOFFTRIM寄存器,該過程在BOOT ROM中自動地完成
   //如果在調試過程中,BOOT ROM代碼旁路未使用,那麼必須顯示調用下面 ADC_cal()函數(推薦顯示調用)
   //在調用 ADC_cal()前,必須使能ADC時鐘
   //有關ADC更多的信息參見設備數據手冊

   ADC_cal();


   SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0;   // I2C
   SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A    使能
   SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 0;   // SCI-B
   SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 0;   // SCI-C
   SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A    使能
   SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 0; // McBSP-A
   SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 0; // McBSP-B
   SysCtrlRegs.PCLKCR0.bit.ECANAENCLK = 1;    // eCAN-A 使能
   SysCtrlRegs.PCLKCR0.bit.ECANBENCLK = 0;    // eCAN-B

   SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1    使能
   SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2    使能
   SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;  // ePWM3    使能
   SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;  // ePWM4    使能
   SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM5    使能
   SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6    使能
   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC  = 1;  // TBCLK時基時鐘 ePWM   使能

   SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0;  // eCAP3
   SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0;  // eCAP4
   SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 0;  // eCAP5
   SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 0;  // eCAP6
   SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0;  // eCAP1
   SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0;  // eCAP2
   SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 0;  // eQEP1
   SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 0;  // eQEP2

   SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0   使能
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1   使能
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2   使能

   SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 0;       // DMA Clock
   SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK 外擴接口時鐘使能
   SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO 輸入時鐘使能

   EDIS;
}

//===========================================================================
// End of file.
//===========================================================================

參考資料
TMS320F28335時鐘(1)
TMS320F28335時鐘(2)
TMS320F28335時鐘(3)
28335硬件教程-時鐘系統

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章