F28335第一篇——看门狗的开断
生活随笔
收集整理的這篇文章主要介紹了
F28335第一篇——看门狗的开断
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主程序
先看一下TI提供的看門狗例程源程序,如下
// TI File $Revision: /main/8 $ // Checkin $Date: August 10, 2007 09:07:57 $ //########################################################################### // // FILE: Example_2833xWatchdog.c // // TITLE: DSP2833x Watchdog interrupt test program. // // ASSUMPTIONS: // // This program requires the DSP2833x header files. // // As supplied, this project is configured for "boot to SARAM" // operation. The 2833x Boot Mode table is shown below. // For information on configuring the boot mode of an eZdsp, // please refer to the documentation included with the eZdsp, // // $Boot_Table: // // GPIO87 GPIO86 GPIO85 GPIO84 // XA15 XA14 XA13 XA12 // PU PU PU PU // ========================================== // 1 1 1 1 Jump to Flash // 1 1 1 0 SCI-A boot // 1 1 0 1 SPI-A boot // 1 1 0 0 I2C-A boot // 1 0 1 1 eCAN-A boot // 1 0 1 0 McBSP-A boot // 1 0 0 1 Jump to XINTF x16 // 1 0 0 0 Jump to XINTF x32 // 0 1 1 1 Jump to OTP // 0 1 1 0 Parallel GPIO I/O boot // 0 1 0 1 Parallel XINTF boot // 0 1 0 0 Jump to SARAM <- "boot to SARAM" // 0 0 1 1 Branch to check boot mode // 0 0 1 0 Boot to flash, bypass ADC cal // 0 0 0 1 Boot to SARAM, bypass ADC cal // 0 0 0 0 Boot to SCI-A, bypass ADC cal // Boot_Table_End$ // // DESCRIPTION: // // This program exercises the watchdog. // // First the watchdog is connected to the WAKEINT interrupt of the // PIE block. The code is then put into an infinite loop. // // The user can select to feed the watchdog key register or not // by commenting one line of code in the infinite loop. // // If the watchdog key register is fed by the ServiceDog function // then the WAKEINT interrupt is not taken. If the key register // is not fed by the ServiceDog function then WAKEINT will be taken. // // Watch Variables: // LoopCount for the number of times through the infinite loop // WakeCount for the number of times through WAKEINT // //########################################################################### // $TI Release: DSP2833x Header Files V1.01 $ // $Release Date: September 26, 2007 $ //############################################################################include "DSP2833x_Device.h" // Headerfile Include File #include "DSP2833x_Examples.h" // Examples Include File// Prototype statements for functions found within this file. interrupt void wakeint_isr(void);// Global variables for this example Uint32 WakeCount; Uint32 LoopCount;void main(void) {// Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP2833x_SysCtrl.c file.InitSysCtrl();// Step 2. Initalize GPIO: // This example function is found in the DSP2833x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio(); // Skipped for this example // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT;// Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the DSP2833x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP2833x_DefaultIsr.c. // This function is found in DSP2833x_PieVect.c.InitPieVectTable();// Interrupts that are used in this example are re-mapped to // ISR functions found within this file. EALLOW; // This is needed to write to EALLOW protected registersPieVectTable.WAKEINT = &wakeint_isr;EDIS; // This is needed to disable write to EALLOW protected registers// Step 4. Initialize all the Device Peripherals: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals(); // Not required for this example// Step 5. User specific code, enable interrupts:// Clear the countersWakeCount = 0; // Count interruptsLoopCount = 0; // Count times through idle loop// Connect the watchdog to the WAKEINT interrupt of the PIE // Write to the whole SCSR register to avoid clearing WDOVERRIDE bitEALLOW;SysCtrlRegs.SCSR = BIT1;EDIS;// Enable WAKEINT in the PIE: Group 1 interrupt 8 // Enable INT1 which is connected to WAKEINT:PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE blockPieCtrlRegs.PIEIER1.bit.INTx8 = 1; // Enable PIE Gropu 1 INT8IER |= M_INT1; // Enable CPU int1EINT; // Enable Global Interrupts// Reset the watchdog counterServiceDog();// Enable the watchdogEALLOW;SysCtrlRegs.WDCR = 0x0028; EDIS;// Step 6. IDLE loop. Just sit and loop forever (optional): for(;;){LoopCount++;// Uncomment ServiceDog to just loop here// Comment ServiceDog to take the WAKEINT instead// ServiceDog();}} // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here: // If local ISRs are used, reassign vector addresses in vector table as // shown in Step 5interrupt void wakeint_isr(void) {WakeCount++;// Acknowledge this interrupt to get more from group 1PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }//=========================================================================== // No more. //===========================================================================以上程序就是通過兩個全局變量來計數看門狗觸發的次數WakeCount以及最后死循環的循環次數LoopCount。通過CCS6.0調試功能可是實時看到兩個變量的變化。
可以通過注釋死循環里面ServiceDog()函數來決定是否喂狗。若每次循環都喂狗,就可以發現循環次數會不斷增加,而中斷服務程序就不會觸發,即WakeCount為0;
否則的話,將喂狗函數注釋掉,那么,中斷服務程序就會不斷被觸發WakeCount也就不斷增加,即看門狗不斷觸發。
下面,我們就研究一下,看門狗被打開與關閉的條件。
相關寄存器
先引用<手把手教你學DSP(第二版)>第88頁的寄存器說明
看門狗控制寄存器WDCR
| 15~8 | 保留 | |
| 7 | WDFLAG | 看門狗復位狀態標志位;0:不滿足標志位,1:滿足了復位條件 |
| 6 | WDDIS | 看門狗禁止;0:使能看門狗功能;1:禁止看門狗功能 |
| 5~3 | WDCHK | 看門狗邏輯校驗位,必須寫101 |
| 2~0 | WDPS | 看門狗時鐘分頻,若為000或001時候,看門狗時鐘頻率=晶振頻率/512,其余時候,看門狗時鐘頻率=晶振頻率/512/(2^(WDPS-1)) |
系統控制和狀態寄存器SCSR
| 15~3 | 保留 | |
| 2 | WDINTS | 看門狗中斷狀態位,反應看門狗模塊WDINT ̄\overline{{\rm WDINT}}WDINT信號狀態 |
| 1 | WDENINT | 0:將復位信號WDRST ̄\overline{{\rm WDRST}}WDRST屏蔽,將中斷信號WDINT ̄\overline{{\rm WDINT}}WDINT使能;1:將復位信號WDRST ̄\overline{{\rm WDRST}}WDRST使能,將中斷信號WDINT ̄\overline{{\rm WDINT}}WDINT屏蔽; |
| 0 | WDOVERRIDE | 如果該位是1,允許用戶改變看門狗控制器寄存器屏蔽位WDDIS;如果通過將該位置1將其清零,用戶不能改變WDDIS位置的設置。若該位被清除,只有系統復位后才能改變狀態。用戶可以隨時讀取該狀態位。 |
注意
- 以上基本就是引用書上的原文,通過這兩個寄存器的設置基本上就可以實現DSP看門狗打開與屏蔽功能。
- 書中關于WDOVERRIDE位的設置描述非常模糊。而該位直接影響看門狗的開啟與關閉,所以,我個人的實驗結果終結如下
- 該位可以讀取與寫入,且讀取與寫入的數據并不相同,也就是說,當該位寫入1時,讀取的結果為0,該位置0后讀取的結果為1
- 讀取到
- 0:不能通過將WDDIS置1的方式關閉看門狗功能。此時,看門狗功能一直開啟,知道系統復位。
- 1:可以通過WDDIS開啟或者關閉看門狗功能。
- 寫入數據
- 0:可以通過WDDIS位開啟或者關閉看門狗。
- 1:開啟看門狗功能,直到系統重啟。不可以通過WDDIS位關閉看門狗,也無法重新將WDOVERRIDE置0來重新關閉看門狗。
程序實現
//配置SCSREALLOW;//關閉保護、//將中斷信號WDINT使能,且允許屏蔽看門狗SysCtrlRegs.SCSR = 0x0002;//0010 EDIS;//打開保護//配置WDCREALLOW;SysCtrlRegs.WDCR = 0x0028;//0010 1000:使能看門狗,分頻數為512EDIS;EALLOW;SysCtrlRegs.WDCR= 0x0068;//0110 1000;關閉看門狗EDIS;上述程序可以實現看門狗的關閉。
//配置SCSREALLOW;//關閉保護、//將中斷信號WDINT使能,打開且不允許屏蔽看門狗SysCtrlRegs.SCSR = 0x0003;//0011 EDIS;//打開保護//配置WDCREALLOW;SysCtrlRegs.WDCR = 0x0028;//0010 1000:看門狗已經打開EDIS;EALLOW;SysCtrlRegs.WDCR= 0x0068;//0110 1000;不起作用。EDIS;上述程序不能關閉看門狗。
更新
關于SCSR寄存器,我又參考了TI的官方手冊。如下圖:
下方的中文介紹截取自<TMS320F28335DSP原理及開發編程>:
總結
以上是生活随笔為你收集整理的F28335第一篇——看门狗的开断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LCD1602中文资料
- 下一篇: 安装多个 PHP 版本(PHP7, PH