首先说明:开发环境Manjaro linux,内核5.0,滚动升级版本,随时都是最新,CCS也是最新的CCv 8
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个环节,但是作为中断函数更多的应该只是个附属品而已,我这样说也是可以的。