CPU_CTRL_XMC1: CPU_CTRL_XMC1.c Source File

CPU CTRL XMC1

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