首先說明:開發環境Manjaro linux,內核5.0,滾動升級版本,隨時都是最新,CCS也是最新的CCv 8linux
1 #include "DSP2833x_Device.h" // 這是一個很重要的頭文件,決定CPU類型,數據類型、asm宏指令,包含的全部的外設,外設的頭文件和其餘硬件的抽象頭文件 2 #include "DSP2833x_Examples.h" // 該頭文件是經常使用實現函數的文件包含 3 6 //中斷服務函數聲明 7 __interrupt void wakeint_isr(void); 8 9 //聲明全局變量 12 Uint32 WakeCount; 13 Uint32 LoopCount; 14 15 //主函數 18 void main(void) 19 { 20 // Step 1. 初始化系統控制: 22 // 配置PLL,設置cpu時鐘 23 // 配置外設時鐘 24 // 配置看門狗 該函數在 DSP2833x_SysCtrl.c中. 25 InitSysCtrl(); 26 27 // Step 2. 初始化GPIO: 29 // 該函數在 DSP2833x_Gpio.c 中. 32 //InitGpio(); 33 34 // Step 3. 初始化中斷: 36 // 禁止CPU中斷,該函數在 DSP2833x_Device.h 中 38 DINT; 39 40 // 禁止外設中斷 41 // 清理外設中斷容許寄存器 42 // 清理外設中斷標誌寄存器 43 // 禁止CPU中斷,設置容許中斷位爲0 44 // 初始化外設中斷向量表 45 // 設置中斷函數 46 InitPieCtrl(); 47 48 // 49 // Disable CPU interrupts and clear all CPU interrupt flags 50 // 51 IER = 0x0000; 52 IFR = 0x0000; 53 54 // 55 // Initialize the PIE vector table with pointers to the shell Interrupt 56 // Service Routines (ISR). 57 // This will populate the entire table, even if the interrupt 58 // is not used in this example. This is useful for debug purposes. 59 // The shell ISR routines are found in DSP2833x_DefaultIsr.c. 60 // This function is found in DSP2833x_PieVect.c. 61 // 62 InitPieVectTable(); 63 64 // 65 // Interrupts that are used in this example are re-mapped to 66 // ISR functions found within this file. 67 // 68 EALLOW; // This is needed to write to EALLOW protected registers 69 PieVectTable.WAKEINT = &wakeint_isr; 70 EDIS; // This is needed to disable write to EALLOW protected registers 71 72 // Step 4. 初始化外設: 74 // 該函數在 DSP2833x_InitPeripherals.c 中 75 // 76 //InitPeripherals(); // Not required for this example 77 78 // Step 5. 用戶本身的代碼 80 // Clear the counters 84 // 85 WakeCount = 0; // Count interrupts 86 LoopCount = 0; // Count times through idle loop 87 88 // 89 // 將看門狗中斷鏈接到PIE中斷,該寄存器首SCM控制,使用特定的修改方式 90 // Write to the whole SCSR register to avoid clearing WDOVERRIDE bit 91 // 92 EALLOW; 93 SysCtrlRegs.SCSR = BIT1; 94 EDIS; 95 96 // 97 // Enable WAKEINT in the PIE: Group 1 interrupt 8 98 // Enable INT1 which is connected to WAKEINT: 99 // 100 PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block 101 PieCtrlRegs.PIEIER1.bit.INTx8 = 1; // Enable PIE Group 1 INT8 102 IER |= M_INT1; // Enable CPU int1 103 EINT; // Enable Global Interrupts 104 105 // 106 // Reset the watchdog counter 107 // 108 ServiceDog(); 109 110 // 111 // Enable the watchdog 112 // 113 EALLOW; 114 SysCtrlRegs.WDCR = 0x0028; 115 EDIS; 116 117 // 118 // Step 6. 函數執行環節 119 // 120 for(;;) 121 { 122 LoopCount++; 123 124 // 125 // Uncomment ServiceDog to just loop here 126 // Comment ServiceDog to take the WAKEINT instead 127 // 128 //ServiceDog(); 129 } 130 } 131 132 // 中斷函數 133 // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions 134 // here: If local ISRs are used, reassign vector addresses in vector table as 135 // shown in Step 5 136 // 137 138 // 139 // wakeint_isr - 140 // 141 __interrupt void 142 wakeint_isr(void) 143 { 144 WakeCount++; 145 146 // 147 // Acknowledge this interrupt to get more from group 1 148 // 149 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; 150 }
在我看來,這就是個看門狗6 + 1,一般包括ti的都把他們當成7個環節,可是做爲中斷函數更多的應該只是個附屬品而已,我這樣說也是能夠的。shell