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)用作附加時鐘分頻器。
兩個預定標器的輸出被用作外設的時鐘源。我們可以單獨和獨立地設置兩個預縮放器。
- 信號“CLKIN”與用於外部存儲器接口的核心輸出信號“SYSCLKOUT”具有相同的頻率,用於為ePWM和CAN單元提供時鐘。
- 看門狗單元由外部振盪器直接提供時鐘。
- 外部振盪器的最大頻率是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. //===========================================================================







浙公网安备 33010602011771号