summaryrefslogtreecommitdiff
path: root/mcc_generated_files/traps.c
diff options
context:
space:
mode:
authorJoshua Drake <joshua.ellis.drake@gmail.com>2024-04-23 01:27:55 -0500
committerJoshua Drake <joshua.ellis.drake@gmail.com>2024-04-23 01:27:55 -0500
commit319b3a68ee64d8549524b53fba2934e94c07d19e (patch)
treeffe9a3f58471d139a3020d0592e040242b145ab5 /mcc_generated_files/traps.c
parentbe339d49fcfd3a09b8fdf590001e8e0f4369e4d3 (diff)
Added files that were forgotten in previous commits.
Diffstat (limited to 'mcc_generated_files/traps.c')
-rw-r--r--mcc_generated_files/traps.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/mcc_generated_files/traps.c b/mcc_generated_files/traps.c
new file mode 100644
index 0000000..65b5ccf
--- /dev/null
+++ b/mcc_generated_files/traps.c
@@ -0,0 +1,122 @@
+/**
+ System Traps Generated Driver File
+
+ @Company:
+ Microchip Technology Inc.
+
+ @File Name:
+ traps.h
+
+ @Summary:
+ This is the generated driver implementation file for handling traps
+ using PIC24 / dsPIC33 / PIC32MM MCUs
+
+ @Description:
+ This source file provides implementations for PIC24 / dsPIC33 / PIC32MM MCUs traps.
+ Generation Information :
+ Product Revision : PIC24 / dsPIC33 / PIC32MM MCUs - 1.171.4
+ Device : PIC24FV16KM202
+ The generated drivers are tested against the following:
+ Compiler : XC16 v2.10
+ MPLAB : MPLAB X v6.05
+*/
+/*
+ (c) 2020 Microchip Technology Inc. and its subsidiaries. You may use this
+ software and any derivatives exclusively with Microchip products.
+
+ THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
+ EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
+ WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
+ PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION
+ WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
+
+ IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
+ INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
+ WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
+ BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
+ FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
+ ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
+ THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
+
+ MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE
+ TERMS.
+*/
+
+/**
+ Section: Includes
+*/
+#include <xc.h>
+#include "traps.h"
+
+#define ERROR_HANDLER __attribute__((interrupt,no_auto_psv))
+#define FAILSAFE_STACK_GUARDSIZE 8
+
+/**
+ * a private place to store the error code if we run into a severe error
+ */
+static uint16_t TRAPS_error_code = -1;
+
+/**
+ * Halts
+ *
+ * @param code error code
+ */
+void __attribute__((weak)) TRAPS_halt_on_error(uint16_t code)
+{
+ TRAPS_error_code = code;
+#ifdef __DEBUG
+ __builtin_software_breakpoint();
+ /* If we are in debug mode, cause a software breakpoint in the debugger */
+#endif
+ while(1);
+
+}
+
+/**
+ * Sets the stack pointer to a backup area of memory, in case we run into
+ * a stack error (in which case we can't really trust the stack pointer)
+ */
+inline static void use_failsafe_stack(void)
+{
+ static uint8_t failsafe_stack[32];
+ asm volatile (
+ " mov %[pstack], W15\n"
+ :
+ : [pstack]"r"(failsafe_stack)
+ );
+/* Controls where the stack pointer limit is, relative to the end of the
+ * failsafe stack
+ */
+ SPLIM = (uint16_t)(((uint8_t *)failsafe_stack) + sizeof(failsafe_stack)
+ - FAILSAFE_STACK_GUARDSIZE);
+}
+
+/** Oscillator Fail Trap vector**/
+void ERROR_HANDLER _OscillatorFail(void)
+{
+ INTCON1bits.OSCFAIL = 0; //Clear the trap flag
+ TRAPS_halt_on_error(TRAPS_OSC_FAIL);
+}
+/** Stack Error Trap Vector**/
+void ERROR_HANDLER _StackError(void)
+{
+ /* We use a failsafe stack: the presence of a stack-pointer error
+ * means that we cannot trust the stack to operate correctly unless
+ * we set the stack pointer to a safe place.
+ */
+ use_failsafe_stack();
+ INTCON1bits.STKERR = 0; //Clear the trap flag
+ TRAPS_halt_on_error(TRAPS_STACK_ERR);
+}
+/** Address Error Trap Vector**/
+void ERROR_HANDLER _AddressError(void)
+{
+ INTCON1bits.ADDRERR = 0; //Clear the trap flag
+ TRAPS_halt_on_error(TRAPS_ADDRESS_ERR);
+}
+/** Math Error Trap Vector**/
+void ERROR_HANDLER _MathError(void)
+{
+ INTCON1bits.MATHERR = 0; //Clear the trap flag
+ TRAPS_halt_on_error(TRAPS_MATH_ERR);
+}