DSP_Clock Module

Ref:TMS320x2833x, 2823x System Control and Interrupts

 

 

F2833x Clock Module

F2833x由外部的慢速時鐘發生器或振盪器驅動。內部PLL電路產生內部速度。

例如若以的F28335控制卡在外部以20MHz運行,為了達到100MHz的內部頻率,我們必須使用乘以10倍,然後除以2。

這是通過編程PLL控制暫存器(PLLCR)來實現的。

 

The PLL-based clock module provides two modes of operation:

  • Crystal/Resonator Operation:
    • 片上振盪器使得可以將外部晶振/諧振器連接到器件,為器件提供時基。晶體/諧振器連接到X1 / X2引腳,XCLKIN連接到低電平。
  • External clock source operation:
    •   如果不使用片上振盪器,該模式允許旁路內部振盪器。器件時鐘由X1或XCLKIN引腳上的外部時鐘源輸入產生。

 

高速時鐘分頻器(HISPCP)和低速時鐘分頻器(LOSPCP)用作附加時鐘分頻器。

兩個預定標器的輸出被用作外設的時鐘源。我們可以單獨和獨立地設置兩個預縮放器。

  1. 信號“CLKIN”與用於外部存儲器接口的核心輸出信號“SYSCLKOUT”具有相同的頻率,用於為ePWM和CAN單元提供時鐘。
  2. 看門狗單元由外部振盪器直接提供時鐘。
  3. 外部振盪器的最大頻率是35MHz。

 

 要使用外設單元,我們必須通過設置PCLKCRx暫存器的各個bits來使能它的時鐘分配。

位域“GPIOIN_ENCLK”使時鐘分配到輸入限定濾波器。如果不使用輸入限定,則不需要啟用該位。

 

 

 Watchdog Timer

在硬體中watchdog常被包在CPU或MCU內,目的是在於檢查目前系統是否還活著

 其工作原理為開機後,watchdog會開始計數,數到一定的時間後,系統會丟一個訊號給watchdog,watchdog收到約定的訊號就會重新計數,表示系統正常運作

 直到哪天watchdog數著數著數到爆表了,系統都沒有丟約定好的訊號給他,watchdog就判斷系統已經當掉了,watchdog就自己發一個reset的訊號給CPU,去重啟系統

有人稱這一串動作就叫「你不定時去餵狗,狗就會來踢你」。

 

 F28335只要8位看門狗向上計數器達到其最大值,看門狗模塊就會產生一個輸出脈衝,512個振盪器時鐘(OSCCLK)寬的輸出脈波去重置整個系統,以防系統當機。

為了防止這種情況,用戶可以禁用計數器,或者軟件必須定期向看門狗密鑰寄存器寫入0x55 + 0xAA序列,以復位看門狗計數器。

"Watchdog Timer”是一個自由運行的計數器單元,如果它沒有被特定的指令序列週期性地清除,它將觸發復位。

它用於識別程序離開指定執行順序的事件,例如,如果程序崩潰。

 

  • 如果CPU崩潰,則重置F2833x

    • 看門狗計數器獨立於CPU運行
    • 如果計數器溢出,則發生復位或中斷如果計數器溢出,則會觸發復位或中斷(用戶可選)觸發(用戶可選)
    • 在溢出之前,CPU必須寫入正確的數據鍵序列才能重置計數器
  • 看門狗必須在復位後的4.37ms內進行維護或禁用(假設為30 MHz OSCCLK)          30M/512/2^8(8bit)=228HZ  =>   1/288HZ=4.37mS
  • 如果CPU運行在150MHz,此時間段將轉換為645000條指令!                                    150Mhz/288=645000

 

 

 

 DSP啟動時看門狗一直處於活動狀態!當我們不定時關注看門狗時,它會觸發一個RESET。處理看門狗最簡單的方法之一就是禁用它。

這是通過將寄存器WDCR的第6位設置為1來完成的。當然,這不是一個明智的決定,因為看門狗是一項安全功能,真正的項目應該始終包含盡可能多的安全性或可用性。

看門狗除頻器可以用來增加看門狗的溢出週期。

邏輯檢查位(WDCHK)是另一個安全位字段。對寄存器WDCR的所有寫入訪問都必須包含這個3位字段的位組合“101”,否則訪問將被拒絕並立即觸發RESET。

 看門狗標誌位(WDFLAG)可用於區分複位時的正常電源(WDFLAG = 0)和看門狗復位(WDFLAG = 1)。注:要通過軟件清除該標誌,我們必須在此位寫入'1'!

 

 注意:如果由於某種原因外部振盪器時鐘失效,看門狗停止遞增。在一個應用程序中,我們可以通過定期讀取看門狗計數器寄存器來捕捉這個條件。在外部時鐘丟失的情況下,該寄存器不會再增加。如果處於PLL模式,F2833x本身仍然可以執行,因為PLL將以所謂的“跛行”模式輸出1至4 MHz之間的時鐘。

 

Servicing The Watchdog Timer

在溢出之前,我們如何清除看門狗計數器寄存器?      答案:通過將“有效密鑰”或“良好密鑰”序列寫入寄存器WDKEY:

 

  • WDKEY寫入值:
  • 任何序列的0x55和0xAA值都可以寫入WDKEY而不會導致系統復位;只有寫入0x55,然後寫入0xAA才能複位WDCNTR。
    • 0x55  - 計數器啟用在下一個0xAA復位寫入
    • 0xAA  - 如果重置啟用,計數器設置為零
  • 寫入任何其他值都不起作用
  • 看門狗不應僅在ISR中服務
    • 主代碼崩潰,但中斷繼續執行,看門狗不會發生崩潰
    • 可以在主代碼中放置0x55 WDKEY,在ISR中放置0xAA WDKEY;這會捕獲主代碼崩潰和ISR崩潰

 由上圖可看出只有先寫入0x55h後再寫入0xAAh才會使WD counter is Reset.

 

 

System Control and Status Register

 寄存器SCSR控制看門狗是否產生一個RESET(WDENINT = 0)或一個中斷服務請求(WDENINT = 1)。RESET後的默認狀態是觸發RESET。

 WDOVERRIDE位是一個“僅清除”bit,也就是說,一旦我們通過向該位寫入1來關閉此開關,我們就不能再次重新打開此開關(請參閱看門狗的框圖)。此時WD禁用位無效,因此無法禁用看門狗!

 位2(WDINTS)是一個只讀位,標誌著看門狗中斷的狀態。

 

 

 

 

Example   Lab 5_1: Digital Output at 4 LEDs

  •  在外圍設備瀏覽器電路板的LED LD1(GPIO9),LD2(GPIO11),LD3(GPIO34)和LD4(GPIO49)上顯示計數器變量的4個最低有效位
  • 每100毫秒增加一次變量“計數器”
  • 使用軟件延遲循環生成100毫秒的時間間隔

 

//
//      Lab5_1: TMS320F28335
//      (c) Frank Bormann
//
//###########################################################################
//
// FILE:    Lab5_1.c
// 
// TITLE:    DSP28335ControlCARD; Digital Output
//            4 - bit - counter at 4 LEDs LD1(GPIO9), LD2(GPIO11), LD3(GPIO34)
//            and LD4 (GPIO49) 
//            software delay loop; watchdog disabled
//            template file for Lab5_1
//###########################################################################
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  3.0 | 02 May 2008 | F.B. | Lab5_1 for F28335; 
//  3.1 | 06 Nov 2009 | F.B  | Lab5_1 for F28335 and PE revision5
//###########################################################################
#include "DSP2833x_Device.h"

// Prototype statements for functions found within this file.
void Gpio_select(void);
void InitSystem(void);
void delay_loop(long);

//###########################################################################
//                        main code                                    
//###########################################################################
void main(void)
{
    int counter=0;        // binary counter for digital output

    InitSystem();         // Basic Core Initialization

    DINT;                // Disable all interrupts
    
    Gpio_select();        // GPIO9,GPIO11,GPIO34 and GPIO49 as output (LEDs @ peripheral explorer)

    while(1)
    {    
              counter++;
            // place your code to analyze counter here 
            // if bit 0 of counter = 1, set GPIO9 to 1
            // if bit 1 of counter = 1, set GPIO11 to 1 
            // if bit 2 of counter = 1, set GPIO34 to 1
            // if bit 3 of counter = 1, set GPIO49 to 1 
            
            
            delay_loop(1000000);
    }
} 

void delay_loop(long end)
{
    long i;
    for (i = 0; i < end; i++)
    {
        asm(" NOP");
    //    EALLOW;
    //    SysCtrlRegs.WDKEY = 0x55;
    //    SysCtrlRegs.WDKEY = 0xAA;
    //    EDIS;
    }
}    

void Gpio_select(void)
{
    EALLOW;
    GpioCtrlRegs.GPAMUX1.all = 0x????????;    // GPIO15 ... GPIO0 = General Puropse I/O
    GpioCtrlRegs.GPAMUX2.all = 0x????????;    // GPIO31 ... GPIO16 = General Purpose I/O
    GpioCtrlRegs.GPBMUX1.all = 0x????????;    // GPIO47 ... GPIO32 = General Purpose I/O
    GpioCtrlRegs.GPBMUX2.all = 0x????????;    // GPIO63 ... GPIO48 = General Purpose I/O
    GpioCtrlRegs.GPCMUX1.all = 0x????????;    // GPIO79 ... GPIO64 = General Purpose I/O
    GpioCtrlRegs.GPCMUX2.all = 0x????????;    // GPIO87 ... GPIO80 = General Purpose I/O
     
    GpioCtrlRegs.GPADIR.all = 0x????????;
    // peripheral explorer: LED LD1 at GPIO9
    // peripheral explorer: LED LD2 at GPIO11
    GpioCtrlRegs.GPBDIR.all = 0x????????;
    // peripheral explorer: LED LD3 at GPIO34
    // peripheral explorer: LED LD4 at GPIO49    

    EDIS;
}   

void InitSystem(void)
{
    EALLOW;
    SysCtrlRegs.WDCR = 0x????;
    SysCtrlRegs.SCSR = 0x????;
    SysCtrlRegs.PLLSTS.bit.DIVSEL = ?;
    SysCtrlRegs.PLLCR.bit.DIV = ?;
    SysCtrlRegs.HISPCP.all = 0x????;
       SysCtrlRegs.LOSPCP.all = 0x????;
    SysCtrlRegs.PCLKCR0.all = 0x????;
    SysCtrlRegs.PCLKCR1.all = 0x????;
    SysCtrlRegs.PCLKCR3.all = 0x????;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = ?;
    EDIS;
}
//===========================================================================
// End of SourceCode.
//===========================================================================
 

 

 

 

 

 


#include "DSP2833x_Device.h"

// Prototype statements for functions found within this file.
void Gpio_select(void);
void InitSystem(void);
void delay_loop(long);

//###########################################################################
//                        main code                                    
//###########################################################################
void main(void)
{
    int counter=0;        // binary counter for digital output

    InitSystem();         // Basic Core Initialization

    DINT;                // Disable all interrupts
    
    Gpio_select();        // GPIO9,GPIO11,GPIO34 and GPIO49 as output (LEDs @ peripheral explorer)

    while(1)
    {    
              counter++;
            // place your code to analyze counter here 
            // if bit 0 of counter = 1, set GPIO9 to 1
            // if bit 1 of counter = 1, set GPIO11 to 1 
            // if bit 2 of counter = 1, set GPIO34 to 1
            // if bit 3 of counter = 1, set GPIO49 to 1 
            if(counter&1) GpioDataRegs.GPASET.bit.GPIO9 = 1;
                else GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;
            if(counter&2) GpioDataRegs.GPASET.bit.GPIO11 = 1;
                else GpioDataRegs.GPACLEAR.bit.GPIO11 = 1;
            if(counter&4) GpioDataRegs.GPBSET.bit.GPIO34 = 1;
                else GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
            if(counter&8) GpioDataRegs.GPBSET.bit.GPIO49 = 1;
                else GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1;
            
            delay_loop(1000000);
    }
} 

void delay_loop(long end)
{
    long i;
    for (i = 0; i < end; i++)
    {
        asm(" NOP");
        EALLOW;
        SysCtrlRegs.WDKEY = 0x55;
        SysCtrlRegs.WDKEY = 0xAA;
        EDIS;
    }
}    

void Gpio_select(void)
{
    EALLOW;
   //Set ALl GPIO = GPIO
    GpioCtrlRegs.GPAMUX1.all = 0;        // GPIO15 ... GPIO0 = General Puropse I/O
    GpioCtrlRegs.GPAMUX2.all = 0;        // GPIO31 ... GPIO16 = General Purpose I/O
    GpioCtrlRegs.GPBMUX1.all = 0;        // GPIO47 ... GPIO32 = General Purpose I/O
    GpioCtrlRegs.GPBMUX2.all = 0;        // GPIO63 ... GPIO48 = General Purpose I/O
    GpioCtrlRegs.GPCMUX1.all = 0;        // GPIO79 ... GPIO64 = General Purpose I/O
    GpioCtrlRegs.GPCMUX2.all = 0;        // GPIO87 ... GPIO80 = General Purpose I/O
     
  //Set All GPIO = Input
    GpioCtrlRegs.GPADIR.all = 0;
  //Set GPIO9&11 = Output
    GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;    // peripheral explorer: LED LD1 at GPIO9
    GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;    // peripheral explorer: LED LD2 at GPIO11

    GpioCtrlRegs.GPBDIR.all = 0;        // GPIO63-32 as inputs
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;    // peripheral explorer: LED LD3 at GPIO34
    GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; // peripheral explorer: LED LD4 at GPIO49
    GpioCtrlRegs.GPCDIR.all = 0;        // GPIO87-64 as inputs
    EDIS;
}   

void InitSystem(void)
{
    EALLOW;
    SysCtrlRegs.WDCR = 0x0028;            // Watchdog enabled, 4.3 milliseconds

 

 

 


SysCtrlRegs.SCSR = 0x0000; // Watchdog will cause a reset SysCtrlRegs.PLLSTS.bit.DIVSEL = 2; SysCtrlRegs.PLLCR.bit.DIV = 10; // 30MHz * 10 / 2 = 150 MHz SYSCLK SysCtrlRegs.HISPCP.all = 0x0001; // SYSCLK / 2 SysCtrlRegs.LOSPCP.all = 0x0002; // SYSCLK / 4   
    SysCtrlRegs.PCLKCR0.all = 0x0000;
    SysCtrlRegs.PCLKCR1.all = 0x0000;
    SysCtrlRegs.PCLKCR3.all = 0x0000;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
    EDIS;
}
//===========================================================================
// End of SourceCode.
//===========================================================================

 

 

//
//      Lab5_1: TMS320F28335
//      (c) Frank Bormann
//
//###########################################################################
//
// FILE:    Lab5_1.c
// 
// TITLE:    DSP28335ControlCARD; Digital Output
//            4 - bit - counter at 4 LEDs LD1(GPIO9), LD2(GPIO11), LD3(GPIO34)
//            and LD4 (GPIO49) 
//            software delay loop; watchdog disabled
//            template file for Lab5_1
//###########################################################################
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  3.0 | 02 May 2008 | F.B. | Lab5_1 for F28335; 
//  3.1 | 06 Nov 2009 | F.B  | Lab5_1 for F28335 and PE revision5
//###########################################################################
#include "DSP2833x_Device.h"

// Prototype statements for functions found within this file.
void Gpio_select(void);
void InitSystem(void);
void delay_loop(long);

//###########################################################################
//                        main code                                    
//###########################################################################
void main(void)
{
    int counter=0;        // binary counter for digital output

    InitSystem();         // Basic Core Initialization

    DINT;                // Disable all interrupts
    
    Gpio_select();        // GPIO9,GPIO11,GPIO34 and GPIO49 as output (LEDs @ peripheral explorer)

    while(1)
    {    
              counter++;
            // place your code to analyze counter here 
            // if bit 0 of counter = 1, set GPIO9 to 1
            // if bit 1 of counter = 1, set GPIO11 to 1 
            // if bit 2 of counter = 1, set GPIO34 to 1
            // if bit 3 of counter = 1, set GPIO49 to 1 
            if(counter&1) GpioDataRegs.GPASET.bit.GPIO9 = 1;
                else GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;
            if(counter&2) GpioDataRegs.GPASET.bit.GPIO11 = 1;
                else GpioDataRegs.GPACLEAR.bit.GPIO11 = 1;
            if(counter&4) GpioDataRegs.GPBSET.bit.GPIO34 = 1;
                else GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
            if(counter&8) GpioDataRegs.GPBSET.bit.GPIO49 = 1;
                else GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1;
            
            delay_loop(1000000);
    }
} 

void delay_loop(long end)
{
    long i;
    for (i = 0; i < end; i++)
    {
        asm(" NOP");
//        EALLOW;
//        SysCtrlRegs.WDKEY = 0x55;
//        SysCtrlRegs.WDKEY = 0xAA;
//        EDIS;
    }
}    

void Gpio_select(void)
{
    EALLOW;
    GpioCtrlRegs.GPAMUX1.all = 0;        // GPIO15 ... GPIO0 = General Puropse I/O
    GpioCtrlRegs.GPAMUX2.all = 0;        // GPIO31 ... GPIO16 = General Purpose I/O
    GpioCtrlRegs.GPBMUX1.all = 0;        // GPIO47 ... GPIO32 = General Purpose I/O
    GpioCtrlRegs.GPBMUX2.all = 0;        // GPIO63 ... GPIO48 = General Purpose I/O
    GpioCtrlRegs.GPCMUX1.all = 0;        // GPIO79 ... GPIO64 = General Purpose I/O
    GpioCtrlRegs.GPCMUX2.all = 0;        // GPIO87 ... GPIO80 = General Purpose I/O
     
    GpioCtrlRegs.GPADIR.all = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;    // peripheral explorer: LED LD1 at GPIO9
    GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;    // peripheral explorer: LED LD2 at GPIO11

    GpioCtrlRegs.GPBDIR.all = 0;        // GPIO63-32 as inputs
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;    // peripheral explorer: LED LD3 at GPIO34
    GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; // peripheral explorer: LED LD4 at GPIO49
    GpioCtrlRegs.GPCDIR.all = 0;        // GPIO87-64 as inputs
    EDIS;
}   

void InitSystem(void)
{
    EALLOW;
//    SysCtrlRegs.WDCR = 0x0028;            // Watchdog enabled, 4.3 milliseconds
//    SysCtrlRegs.SCSR = 0x0000;            // Watchdog will cause a reset
    SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
    SysCtrlRegs.PLLCR.bit.DIV = 10;        // 30MHz * 10 / 2 = 150 MHz SYSCLK
    SysCtrlRegs.HISPCP.all = 0x0001;    // SYSCLK / 2
       SysCtrlRegs.LOSPCP.all = 0x0002;    // SYSCLK / 4
    SysCtrlRegs.PCLKCR0.all = 0x0000;
    SysCtrlRegs.PCLKCR1.all = 0x0000;
    SysCtrlRegs.PCLKCR3.all = 0x0000;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
    EDIS;
}
//===========================================================================
// End of SourceCode.
//===========================================================================

 

 

posted @ 2018-04-22 18:47  CiAn_H  阅读(539)  评论(0)    收藏  举报