Hi,
I am testing some code that monitors the ESM flags in group 1-3. I am trying to inject faults and see that the corresponding ESM error is set.
First I implemented a test to inject error to the Lock-step compare, I did this simply by writing 0x9 to KEYR register.
The ESM error bit 2 in Group 2 is set accordingly as expected, so the test seems fine.
Then I tried to implement error injection for RAM ECC. I did so by the following code:
#define TCRAM_SYN_2BIT_DATA_ECC ((uint64_t)0x0303030303030303U) /* this corrupts the ecc with 2 bit error */ #define TCRAM_RAMCTRL_ECCWREN ((tU32)(1u << 8u)) /* 16 byte alignment is required to ensure that the starting address is always an even bank */ #pragma DATA_ALIGN(g_sramEccTest_arr, 16); volatile uint64_t g_sramEccTest_arr[2] = {0u}; static void injectErrorRAMECC(const tB evenBank) { volatile uint64_t ramread = 0U; volatile uint64_t* eccX; uint8_t testIdx = evenBank ? 0u:1u; /* Update ECC */ g_sramEccTest_arr[testIdx] = 0u; eccX = &g_sramEccTest_arr[testIdx]; eccX = eccX + (0x00400000u/sizeof(uint64)); // ECC is stored with an offset of 0x400000 /* Enable writes to ECC RAM */ tcram1REG->RAMCTRL |= TCRAM_RAMCTRL_ECCWREN; tcram2REG->RAMCTRL |= TCRAM_RAMCTRL_ECCWREN; /* Disable RAM ECC */ _coreDisableRamEcc_(); /* Force a double bit error */ *eccX ^= TCRAM_SYN_2BIT_DATA_ECC; /* Enable RAM ECC */ _coreEnableRamEcc_(); /* Disable writes to ECC RAM */ tcram1REG->RAMCTRL &= ~TCRAM_RAMCTRL_ECCWREN; tcram2REG->RAMCTRL &= ~TCRAM_RAMCTRL_ECCWREN; /* Read the corrupted data to generate error */ ramread = g_sramEccTest_arr[testIdx]; }
When line 38 (ramread = g_sramEccTest_arr[testIdx];) is executed above the MCU seems to reset directly, so I am not able to verify that corresponding bit in ESM register is set.
I think _dabort should be called and then it should continue execution from the next instruction, but seems like _dabort is not executed until after the reset.
Any idea what might be the problem?
Also I am wondering what is the difference between errors considered as RAM uncorrectable error and RAM ECC uncorrectable error? I didn't find any way to inject other error than RAM ECC error in the SafeTILib.
Best regards