This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LS3137: CCM Self Test

Part Number: TMS570LS3137
Other Parts Discussed in Thread: HALCOGEN

Hi,

I am using Halcogen generated safety startup code for the TMS570LS3137 and I am having issues with the CCM self test in error forcing mode.

I am a little confused about what happens when I place the CCM in error-forcing mode (MKEY=0x9). I believe that a CCM-R4F compare error will be generated and this in turn will cause an ESM high-level (non-maskable) interrupt. However in the Halcogen code the function vimInit is not invoked until the end of the function afterSTC() which is after ccmSelfCheck() is called. In this case what will be the behaviour when the NMI is generated?

Thanks,

Mark..

  • Hello Mark,

    My apologies for the delay in answering you post. For some reason it as missed when you posted it.

    The NMI is always mapped to channel 0 of the VIM and by default in Halcogen generates the esmHighInterrupt. It is defined in esm.c so any CCMR4 error that triggers the ESM Group 2 channel 2 error should result in vectoring to this ISR.

    Note,CCMR4 operation is impacted by debug mode as noted in the TRM section 9.3.5 and, therefore, the error may not be asserted in this mode of operation.
  • Hi Chuck, thank you for your response.

    I found the definition for esmHighInterrupt() in esm.c, but as I said previously, as far as I can tell in the Halcogen code the call to vimInit() which loads the address of this ISR into the VIM RAM does not occur until after ccmSelfCheck() is called. In this case when the NMI is generated there is no way of vectoring to the ISR.

    Will the behaviour in this case simply depend on what value is stored in the VIM table location for channel 0 at startup?

    Thanks,

    Mark. 

  • Hi Mark,

    usually, the vectors/ISR pointers are defined at compile time and the init function is only adjusting the channel mapping and priorities for the ISRs. Below is the const struct that defines the pointers to the ISRs. Note the setup of the ESM ISR pointer.

    static const t_isrFuncPTR s_vim_init[96U] =
    {
        &phantomInterrupt,
        &esmHighInterrupt,            /* Channel 0 */
        &phantomInterrupt,            /* Channel 1 */
        &phantomInterrupt,            /* Channel 2 */
        &phantomInterrupt,            /* Channel 3 */
        &phantomInterrupt,            /* Channel 4 */
        &phantomInterrupt,            /* Channel 5 */
        &phantomInterrupt,            /* Channel 6 */
        &phantomInterrupt,            /* Channel 7 */
        &phantomInterrupt,            /* Channel 8 */
        &phantomInterrupt,            /* Channel 9 */
        &phantomInterrupt,            /* Channel 10 */
        &phantomInterrupt,            /* Channel 11 */
        &phantomInterrupt,            /* Channel 12 */
        &phantomInterrupt,            /* Channel 13 */
        &phantomInterrupt,            /* Channel 14 */
        &phantomInterrupt,            /* Channel 15 */
        &phantomInterrupt,            /* Channel 16 */
        &phantomInterrupt,            /* Channel 17 */
        &phantomInterrupt,            /* Channel 18 */
        &phantomInterrupt,            /* Channel 19 */
        &phantomInterrupt,            /* Channel 20 */
        &phantomInterrupt,            /* Channel 21 */
        &phantomInterrupt,            /* Channel 22 */
        &phantomInterrupt,            /* Channel 23 */
        &phantomInterrupt,            /* Channel 24 */
        &phantomInterrupt,            /* Channel 25 */
        &phantomInterrupt,            /* Channel 26 */
        &phantomInterrupt,            /* Channel 27 */
        &phantomInterrupt,            /* Channel 28 */
        &phantomInterrupt,            /* Channel 29 */
        &phantomInterrupt,            /* Channel 30 */
        &phantomInterrupt,            /* Channel 31 */
        &phantomInterrupt,            /* Channel 32 */
        &phantomInterrupt,            /* Channel 33 */
        &phantomInterrupt,            /* Channel 34 */
        &phantomInterrupt,            /* Channel 35 */
        &phantomInterrupt,            /* Channel 36 */
        &phantomInterrupt,            /* Channel 37 */
        &phantomInterrupt,            /* Channel 38 */
        &phantomInterrupt,            /* Channel 39 */
        &phantomInterrupt,            /* Channel 40 */
        &phantomInterrupt,            /* Channel 41 */
        &phantomInterrupt,            /* Channel 42 */
        &phantomInterrupt,            /* Channel 43 */
        &phantomInterrupt,            /* Channel 44 */
        &phantomInterrupt,            /* Channel 45 */
        &phantomInterrupt,            /* Channel 46 */
        &phantomInterrupt,            /* Channel 47 */
        &phantomInterrupt,            /* Channel 48 */
        &phantomInterrupt,            /* Channel 49 */
        &phantomInterrupt,            /* Channel 50 */
        &phantomInterrupt,            /* Channel 51 */
        &phantomInterrupt,            /* Channel 52 */
        &phantomInterrupt,            /* Channel 53 */
        &phantomInterrupt,            /* Channel 54 */
        &phantomInterrupt,            /* Channel 55 */
        &phantomInterrupt,            /* Channel 56 */
        &phantomInterrupt,            /* Channel 57 */
        &phantomInterrupt,            /* Channel 58 */
        &phantomInterrupt,            /* Channel 59 */
        &phantomInterrupt,            /* Channel 60 */
        &phantomInterrupt,            /* Channel 61 */
        &phantomInterrupt,            /* Channel 62 */
        &phantomInterrupt,            /* Channel 63 */
        &phantomInterrupt,            /* Channel 64 */
        &phantomInterrupt,            /* Channel 65 */
        &phantomInterrupt,            /* Channel 66 */
        &phantomInterrupt,            /* Channel 67 */
        &phantomInterrupt,            /* Channel 68 */
        &phantomInterrupt,            /* Channel 69 */
        &phantomInterrupt,            /* Channel 70 */
        &phantomInterrupt,            /* Channel 71 */
        &phantomInterrupt,            /* Channel 72 */
        &phantomInterrupt,            /* Channel 73 */
        &phantomInterrupt,            /* Channel 74 */
        &phantomInterrupt,            /* Channel 75 */
        &phantomInterrupt,            /* Channel 76 */
        &phantomInterrupt,            /* Channel 77 */
        &phantomInterrupt,            /* Channel 78 */
        &phantomInterrupt,            /* Channel 79 */
        &phantomInterrupt,            /* Channel 80 */
        &phantomInterrupt,            /* Channel 81 */
        &phantomInterrupt,            /* Channel 82 */
        &phantomInterrupt,            /* Channel 83 */
        &phantomInterrupt,            /* Channel 84 */
        &phantomInterrupt,            /* Channel 85 */
        &phantomInterrupt,            /* Channel 86 */
        &phantomInterrupt,            /* Channel 87 */
        &phantomInterrupt,            /* Channel 88 */
        &phantomInterrupt,            /* Channel 89 */
        &phantomInterrupt,            /* Channel 90 */
        &phantomInterrupt,            /* Channel 91 */
        &phantomInterrupt,            /* Channel 92 */
        &phantomInterrupt,            /* Channel 93 */
        &phantomInterrupt,            /* Channel 94 */
    };

    If this isn't the case for your code, then it would result in either a phantom interrupt or a pre-fetch abort if the address at the vector location is an illegal address.