AURIX™ TC3xx 復位後RAM不初始化方法

作者:英飛凌 張馳

在默認的狀態下,大部分RAM在上電復位後都會被清零。如果需要在上電復位後不清零RAM,則需要配置UCB_DFLASH中的下面區域:

 

 這個區域在復位後會自動load到DMU_HF_PROCONRAM寄存器中, DMU_HF_PROCONRAM中的RAMIN位域決定了冷上電復位和熱上電復位是否會清零RAM,默認的設置是所有復位都會清零RAM,但清零的RAM區域由RAMINSEL和LMUINSEL決定。




RAMINSEL選擇復位後是否清零各個CPU的PSPR/DSPR/PACHE/DCACHE:

 

 LMUINSEL選擇復位後是否清零各個CPU的DLMU:

 

 

 基於TASKING編譯器的復位後不初始化DLMU0的示例程序

 如果現在把變量放在DLMU0的區域,且不想復位影響DLMU0區域,則可以如下操作。這裡復位指除冷上電復位之外的其他復位,例如軟體復位。

 
Step 1:UCB_DFLASH的PROCONRAM區域可以配置不初始化的RAM區域,例如需要不初始化DLMU0,則把LMUINSEL的bit0設為1。 

 

#if defined(__GNUC__)

#pragma section

#pragma section ".dflash_orig" a

#endif

#if  defined(__TASKING__)

#pragma  section farrom "dflash_orig"

#endif

#if defined(__DCC__)

#pragma section CONST ".dflash_orig" far-absolute R

#endif

constIfx_DFlash_Config dflash_orig =

{

    0x00000000, // PROCONUSR

    0x00000000, // PROCONDF

    0x01000000, // PROCONRAM

    {

        0x00000000,  // RSV1

    },

 

    {

        0x00000000,  // PW0

        0x00000000,  // PW1

        0x00000000,  // PW2

        0x00000000,  // PW3

        0x00000000,  // PW4

        0x00000000,  // PW5

        0x00000000,  // PW6

        0x00000000,  // PW7

    },

 

    {

        0x00000000,  // RSV2

    },

 

 

    0x43211234,    /**<  \brief 0x1F0: .confirmation: 32-bit CODE, (always same)*/

    {

        0x00000000,  // RSV3

    }

};

 

 

在TASKING的link文件中加入下面段:

 

 

    group (ordered)

    {

      group  dflash_orig (run_addr=mem:ucb[0x2200])

      {

        select".rodata.dflash_orig";

      }

     }

 

 

Step 2:在cold power on reset後在程序中清零DLMU0區域,判斷上電復位代碼: 

 

uint8 IsPowerOnReset(void)

{

    uint8 ret;

    Ifx_SCU_RSTSTAT RstStat;

    Ifx_SCU_RSTCON2 RstCon2;

 

    RstStat.U              = MODULE_SCU.RSTSTAT.U;

 

    if((RstStat.B.PORST == 1)  && (RstStat.B.STBYR == 1))

    {

        RstCon2.U =  MODULE_SCU.RSTCON2.U;

        RstCon2.B.CLRC = 1;

         Mcal_WriteCpuEndInitProtReg(&MODULE_SCU.RSTCON2.U, RstCon2.U);

        ret = 1;

    }

    else

    {

        ret = 0;

    }

 

    return ret;

}

 

 

清零DLMU0代碼如下,注意在清零時需要64bit對齊訪問,否則可能會用RMW方式訪問,出現ECC error,因為在上電後RAM的內容是隨機的。 

 

void DLMU0_Init(void)

{

    for(uint32 i=0;  i<0x10000; i=i+8)

    {

        *(uint64*)(0xB0000000  + i) = 0;

    }

}

 

 

Step 3:在程序中訪問DLMU區域,不能用pragma 的方式把變量放在data或者bss區域,可以用直接地址訪問的方式,否則變量依然會在startup文件中的C_Init()函數中初始化這個區域。 

 

volatileuint32*  run_cnt1_dlmu0 = (uint32*)0xB0000000;

 

(*run_cnt3_dlmu0)++;

 



該文章來源於“英飛凌汽車電子生態圈”官方微信,英飛凌汽車電子生態圈對該內容擁有最終解釋權。如需轉載,請註明來源,英飛凌保留所有權利。
QR Code. (英飛凌汽車電子生態圈)官方微信公眾號

★博文內容參考自 網站,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

false: https://mp.weixin.qq.com/s/RvJeIvZ_ZEbvGgnT0RDKEg

評論