#include <SD.h>
#include <SPI.h>
// Found a couple of Faults to force here :: https://interrupt.memfault.com/blog/cortex-m-fault-debug
void showMyFault( const char * sz );
int illegal_instruction_execution(void);
void setup() {
pinMode( LED_BUILTIN, OUTPUT );
digitalWrite( LED_BUILTIN, 1 );
Serial.begin(115200);
while (!Serial && millis() < 4000 );
Serial.println("\n" __FILE__ " " __DATE__ " " __TIME__);
Serial.printf(" millis() now %u\n", millis() );
if ( CrashReport ) {
if (SD.begin(BUILTIN_SDCARD)) {
File dataFile = SD.open("crashlog.txt", FILE_WRITE); // FILE_WRITE append if file already exists
if (dataFile) {
dataFile.print(CrashReport);
dataFile.close();
}
} else [B]if ( Serial ) {
Serial.print(CrashReport);[/B]
}
Serial.print("\n\tRECOVERED from Crash !");
}
delay ( 100 );
digitalWrite( LED_BUILTIN, 0 );
delay ( 1000 );
digitalWrite( LED_BUILTIN, 1 );
}
void loop() {
if ( Serial.available()) {
char cc = Serial.read();
digitalWrite( LED_BUILTIN, 0 );
delay ( 50 );
if ( cc == '0' ) {
[B]showMyFault("illegal_instruction_execution()"); [/B]
illegal_instruction_execution();
}
else if ( cc == '1' ) {
showMyFault("Bad Address Read at 0xbadcafe");
uint32_t ff = *(volatile uint32_t *)0xbadcafe;
Serial.print(ff);
}
else if ( cc == '2' ) {
showMyFault("Coprocessor Fault - turn off FPU");
__asm volatile(
"ldr r0, =0xE000ED88 \n"
"mov r1, #0 \n"
"str r1, [r0] \n"
"dsb \n"
"vmov r0, s0 \n"
);
}
else if ( cc == '3' ) {
showMyFault("bad_addr_double_word_write at 0x30000000");
volatile uint64_t *buf = (volatile uint64_t *)0x30000000;
*buf = 0x1122334455667788;
}
else if ( cc == '4' ) {
showMyFault("Divide by Zero (not enabled?)");
cc = cc - '4';
cc /= cc;
}
else if ( cc == '5' ) {
showMyFault("Try FlexIO : Locks up");
// CCM_CCGR5 |= CCM_CCGR5_FLEXIO1(CCM_CCGR_ON);
IMXRT_FLEXIO_t *p = &IMXRT_FLEXIO1_S;
Serial.printf("%x\n", (uint32_t)p); Serial.flush();
Serial.printf("VERID:%x PARAM:%x CTRL:%x PIN: %x\n", p->VERID, p->PARAM, p->CTRL, p->PIN); Serial.flush();
Serial.printf("SHIFTSTAT:%x SHIFTERR=%x TIMSTAT=%x\n", p->SHIFTSTAT, p->SHIFTERR, p->TIMSTAT); Serial.flush();
Serial.printf("SHIFTSIEN:%x SHIFTEIEN=%x TIMIEN=%x\n", p->SHIFTSIEN, p->SHIFTEIEN, p->TIMIEN); Serial.flush();
Serial.printf("SHIFTSDEN:%x SHIFTSTATE=%x\n", p->SHIFTSDEN, p->SHIFTSTATE); Serial.flush();
Serial.printf("SHIFTCTL:%x %x %x %x\n", p->SHIFTCTL[0], p->SHIFTCTL[1], p->SHIFTCTL[2], p->SHIFTCTL[3]); Serial.flush();
Serial.printf("SHIFTCFG:%x %x %x %x\n", p->SHIFTCFG[0], p->SHIFTCFG[1], p->SHIFTCFG[2], p->SHIFTCFG[3]); Serial.flush();
Serial.printf("TIMCTL:%x %x %x %x\n", p->TIMCTL[0], p->TIMCTL[1], p->TIMCTL[2], p->TIMCTL[3]); Serial.flush();
Serial.printf("TIMCFG:%x %x %x %x\n", p->TIMCFG[0], p->TIMCFG[1], p->TIMCFG[2], p->TIMCFG[3]); Serial.flush();
Serial.printf("TIMCMP:%x %x %x %x\n", p->TIMCMP[0], p->TIMCMP[1], p->TIMCMP[2], p->TIMCMP[3]); Serial.flush();
Serial.println("made it through");
}
else if ( cc == '6' ) {
showMyFault("Fault using device not enabled");
LPUART3_CTRL = 0; // did not enable the clock for this }
}
else if ( cc == 't' ) {
Serial.printf( "\tdeg C=%f\t F_CPU=%u\n" , tempmonGetTemp(), F_CPU_ACTUAL );
while ( Serial.available()) Serial.read();
}
else { // default fault on Serial with no other fault ... from 'Enter'
showMyFault("NULL pointer write");
uint32_t *y = 0; y[0] = 5;
}
}
delay ( 2 );
digitalWrite( LED_BUILTIN, 0 );
delay ( 40 );
digitalWrite( LED_BUILTIN, 1 );
}
void showMyFault( const char * sz ) {
Serial.printf("\nIt's your fault! > %s\n", sz );
Serial.flush();
delay(10);
}
int illegal_instruction_execution(void) {
int (*bad_instruction)(void) = (void *)0xE0000000;
return bad_instruction();
}