CPU_CTRL_XMC1
|
CPU_CTRL_XMC1.c
Go to the documentation of this file.
00001 00050 /*********************************************************************************************************************** 00051 * HEADER FILES 00052 **********************************************************************************************************************/ 00053 #include "cpu_ctrl_xmc1.h" 00054 00055 /*********************************************************************************************************************** 00056 * MACROS 00057 **********************************************************************************************************************/ 00058 00059 /*********************************************************************************************************************** 00060 * LOCAL DATA 00061 **********************************************************************************************************************/ 00062 00063 /*********************************************************************************************************************** 00064 * LOCAL ROUTINES 00065 **********************************************************************************************************************/ 00066 00067 /********************************************************************************************************************** 00068 * API IMPLEMENTATION 00069 **********************************************************************************************************************/ 00070 00071 /* 00072 * API to retrieve the version of the CPU_CTRL_XMC1 APP 00073 */ 00074 DAVE_APP_VERSION_t CPU_CTRL_XMC1_GetAppVersion(void) 00075 { 00076 DAVE_APP_VERSION_t version; 00077 00078 version.major = CPU_CTRL_XMC1_MAJOR_VERSION; 00079 version.minor = CPU_CTRL_XMC1_MINOR_VERSION; 00080 version.patch = CPU_CTRL_XMC1_PATCH_VERSION; 00081 00082 return (version); 00083 } 00084 00085 /* Dummy Init API to maintain backward compatibility */ 00086 CPU_CTRL_XMC1_STATUS_t CPU_CTRL_XMC1_Init(CPU_CTRL_XMC1_t *const handler) 00087 { 00088 return CPU_CTRL_XMC1_STATUS_SUCCESS; 00089 } 00090 00091 #if (HARDFAULT_ENABLED == 1) 00092 00101 #if defined(__GNUC__) 00102 #pragma GCC diagnostic ignored "-Wunused-but-set-variable" 00103 #endif 00104 void __HardFault_Handler(uint32_t args[]) 00105 { 00106 volatile uint32_t stacked_r0 ; 00107 volatile uint32_t stacked_r1 ; 00108 volatile uint32_t stacked_r2 ; 00109 volatile uint32_t stacked_r3 ; 00110 volatile uint32_t stacked_r12 ; 00111 volatile uint32_t stacked_lr ; 00112 volatile uint32_t stacked_pc ; 00113 volatile uint32_t stacked_psr ; 00114 00115 stacked_r0 = ((uint32_t)args[0]) ; 00116 stacked_r1 = ((uint32_t)args[1]) ; 00117 stacked_r2 = ((uint32_t)args[2]) ; 00118 stacked_r3 = ((uint32_t)args[3]) ; 00119 stacked_r12 = ((uint32_t)args[4]) ; 00120 stacked_lr = ((uint32_t)args[5]) ; 00121 stacked_pc = ((uint32_t)args[6]) ; 00122 stacked_psr = ((uint32_t)args[7]) ; 00123 00124 __asm("BKPT 0\n") ; // Break into the debugger 00125 } 00126 00127 /*KEIL*/ 00128 #if defined(__CC_ARM) 00129 __asm void HardFault_Handler(void) 00130 { 00131 EXTERN __HardFault_Handler [CODE] 00132 00133 movs r0,#4 /* load bit mask into R0 */ 00134 mov r1, lr /* load link register into R1 */ 00135 tst r0, r1 /* compare with bitmask */ 00136 beq _MSP /* if bitmask is set: stack pointer is in PSP. Otherwise in MSP */ 00137 mrs r0, psp /* otherwise: stack pointer is in PSP */ 00138 b __HardFault_Handler /* go to part which loads the PC */ 00139 _MSP /* stack pointer is in MSP register */ 00140 mrs r0, msp /* load stack pointer into R0 */ 00141 b __HardFault_Handler /* go to part which loads the PC */ 00142 } 00143 00144 #endif 00145 00146 /*IAR*/ 00147 #if defined(__ICCARM__) 00148 void HardFault_Handler(void) 00149 { 00150 asm( 00151 "movs r0,#4 \n" /* load bit mask into R0 */ 00152 "mov r1, lr \n" /* load link register into R1 */ 00153 "tst r0, r1 \n" /* compare with bitmask */ 00154 "beq _MSP \n" /* if bitmask is set: stack pointer is in PSP. Otherwise in MSP */ 00155 "mrs r0, psp \n" /* otherwise: stack pointer is in PSP */ 00156 "b __HardFault_Handler \n" /* go to part which loads the PC */ 00157 "_MSP: \n" /* stack pointer is in MSP register */ 00158 "mrs r0, msp \n" /* load stack pointer into R0 */ 00159 "b __HardFault_Handler \n" /* decode more information. R0 contains pointer to stack frame */ 00160 ); 00161 } 00162 #endif 00163 00164 /*TASKING*/ 00165 #if defined(__TASKING__) 00166 void HardFault_Handler(void) 00167 { 00168 __asm volatile ( 00169 " movs r0,#4 \n" /* load bit mask into R0 */ 00170 " mov r1, lr \n" /* load link register into R1 */ 00171 " tst r0, r1 \n" /* compare with bitmask */ 00172 " beq _MSP \n" /* if bitmask is set: stack pointer is in PSP. Otherwise in MSP */ 00173 " mrs r0, psp \n" /* otherwise: stack pointer is in PSP */ 00174 " b __HardFault_Handler \n" /* go to part which loads the PC */ 00175 "_MSP: \n" /* stack pointer is in MSP register */ 00176 " mrs r0, msp \n" /* load stack pointer into R0 */ 00177 " b __HardFault_Handler \n" /* decode more information. R0 contains pointer to stack frame */ 00178 ); 00179 } 00180 #endif 00181 00182 /*GCC*/ 00183 #if defined(__GNUC__) 00184 __attribute__((naked)) 00185 void HardFault_Handler(void) 00186 { 00187 __asm volatile ( 00188 " movs r0,#4 \n" /* load bit mask into R0 */ 00189 " mov r1, lr \n" /* load link register into R1 */ 00190 " tst r0, r1 \n" /* compare with bitmask */ 00191 " beq _MSP \n" /* if bitmask is set: stack pointer is in PSP. Otherwise in MSP */ 00192 " mrs r0, psp \n" /* otherwise: stack pointer is in PSP */ 00193 " b __HardFault_Handler \n" /* go to part which loads the PC */ 00194 "_MSP: \n" /* stack pointer is in MSP register */ 00195 " mrs r0, msp \n" /* load stack pointer into R0 */ 00196 " b __HardFault_Handler \n" /* decode more information. R0 contains pointer to stack frame */ 00197 ); 00198 } 00199 #endif 00200 #endif