Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-окт-18 16:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Флаги сброса
СообщениеДобавлено: 2018-ноя-24 20:28 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
В регистрах REG_60_TMRx батарейного домена есть флаги сброса: S_UccRESET, S_RESET0x, S_FT_RESET, S_WDG_RESET, S_OVRSTn, S_SYSRSTn.
После загрузки все эти флаги равны 0 при любой причине сброса.
Если бутовая программа не завершается, а загрузка происходит через JTAG/SWD, то флаги не очищаются.
Похоже, они очищаются бутовой программой при ее завершении и установке флага FPOR.
Таким образом, невозможно пользоваться флагами сброса для диагностики сбоев работы.
Можно ли как-то решить эту проблему?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Флаги сброса
СообщениеДобавлено: 2018-ноя-25 18:02 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
У меня есть следующие предположения:
1.Поскольку согласно СП флаги сброса сбрасываются записью "1", то похоже они обнуляются при выполнении команд BOOTROM:
MDR_BKP->REG_60_TMR0 = BKP_TMP_0;
MDR_BKP->REG_60_TMR1 = BKP_TMP_1;
MDR_BKP->REG_60_TMR2 = BKP_TMP_2;
2. Если проанализировать код BOOTROM, то можно увидеть что состояние флагов сброса регистров
MDR_BKP->REG_60_TMR после сброса сохраняется в локальных переменных uint32_t BKP_TMP_0, uint32_t BKP_TMP_1 uint32_t BKP_TMP_2.
3. Дизассемблером BOOTROM в режиме отладки можно определить номера регистров или адреса памяти где располагаются эти переменные. И если хотя бы одна из 3-х сохраняет свое состояние до передачи управления пользовательской программе, то можно определить причину сброса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Флаги сброса
СообщениеДобавлено: 2018-ноя-25 20:23 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
vasili писал(а):
У меня есть следующие предположения:
2. Если проанализировать код BOOTROM, то можно увидеть что состояние флагов сброса регистров
MDR_BKP->REG_60_TMR после сброса сохраняется в локальных переменных uint32_t BKP_TMP_0, uint32_t BKP_TMP_1 uint32_t BKP_TMP_2.
3. Дизассемблером BOOTROM в режиме отладки можно определить номера регистров или адреса памяти где располагаются эти переменные. И если хотя бы одна из 3-х сохраняет свое состояние до передачи управления пользовательской программе, то можно определить причину сброса.

Исходного кода BOOTROM у меня нет. Но функцию, вызываемую после успешной загрузки, я нашел и дизассемблировал:
Код:
seg000:00000C98                 LDR             R3, =MDR_BKP
seg000:00000C9A                 LDR             R2, =0x8555AAA1
seg000:00000C9C                 STR.W           R2, [R3,#0xF0]
seg000:00000CA0                 LDR.W           R2, [R3,#REG_60_TMR0]
seg000:00000CA4                 ORR.W           R2, R2, #0x40000000 ; CLR_ERR
seg000:00000CA8                 ORR.W           R2, R2, #0x80 ; FPOR
seg000:00000CAC                 STR.W           R2, [R3,#REG_60_TMR0]
seg000:00000CB0                 LDR.W           R2, [R3,#REG_60_TMR1]
seg000:00000CB4                 ORR.W           R2, R2, #0x40000000 ; CLR_ERR
seg000:00000CB8                 ORR.W           R2, R2, #0x80 ; FPOR
seg000:00000CBC                 STR.W           R2, [R3,#REG_60_TMR1]
seg000:00000CC0                 LDR.W           R2, [R3,#REG_60_TMR2]
seg000:00000CC4                 ORR.W           R2, R2, #0x40000000 ; CLR_ERR
seg000:00000CC8                 ORR.W           R2, R2, #0x80 ; FPOR
seg000:00000CCC                 STR.W           R2, [R3,#REG_60_TMR2]
seg000:00000CD0                 MOVS            R2, #0
seg000:00000CD2                 STR.W           R2, [R3,#0xF0]
seg000:00000CD6                 B.W             sub_5C0

Все временные переменные регистровые и хранятся в одном регистре R2. В результате состояние флагов пропадает.
Надо было в коде BOOTROM записывать в REG_60_TMRx с маской 0x00007F00, тогда не испортились бы полезные флаги сброса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Флаги сброса
СообщениеДобавлено: 2018-ноя-25 22:09 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
Это код функции setFPOR() . Она вызывается в частности перед передачей управления в OTP внутри функции runMainAppOtp(). Сохранение регистров MDR_BKP->REG_60_TMR после сброса в локальных переменных BKP_TMP_0, BKP_TMP_1, BKP_TMP_2 происходит раньше.

// read mode after reset
MDR_BKP->KEY = 0x8555AAA1;
BKP_TMP_0 = (MDR_BKP->REG_60_TMR0 & 0xFFFFFF00);
BKP_TMP_1 = (MDR_BKP->REG_60_TMR1 & 0xFFFFFF00);
BKP_TMP_2 = (MDR_BKP->REG_60_TMR2 & 0xFFFFFF00);

Открыть
Код:
void main (void)
{
    //-------------------------------- init-------------------------------//

    uint32_t i;
    uint32_t modeCorrTmp;
   
    uint32_t BKP_TMP_0;
    uint32_t BKP_TMP_1;
    uint32_t BKP_TMP_2;

    Correct_Status_TypeDef  ECC_COR_STAT;

    //--------------------------------boot start------------------------------//

    // setup clock
    MDR_CLK->KEY      = 0x8555AAA1;
    MDR_CLK->PER0_CLK = ( 1 << CLK_PER0_CLK_MDR_CLK_EN_Pos   |
                          1 << CLK_PER0_CLK_MDR_BKP_EN_Pos   |
                          1 << CLK_PER0_CLK_MDR_EBC_EN_Pos   |
                          1 << CLK_PER0_CLK_MDR_OTP_EN_Pos   |
                          1 << CLK_PER0_CLK_MDR_RAMC_EN_Pos  |
                          1 << CLK_PER0_CLK_MDR_RAMD_EN_Pos  |
                          1 << CLK_PER0_CLK_MDR_ROM_EN_Pos   |
                          1 << CLK_PER0_CLK_MDR_PORTA_EN_Pos |
                          1 << CLK_PER0_CLK_MDR_PORTB_EN_Pos |
                          1 << CLK_PER0_CLK_MDR_PORTC_EN_Pos |
                          1 << CLK_PER0_CLK_MDR_PORTD_EN_Pos |
                          1 << CLK_PER0_CLK_MDR_PORTE_EN_Pos );
   
    asm volatile (" ISB \n\t");                         // flush the pipeline

    //init and check ports
    if( initAndCheckModeEccPort() != 0 ) {
        BOOTSTATUS->initErrCntr+=1;

        if( initAndCheckModeEccPort() != 0 ) {
            BOOTSTATUS->initErrCntr+=1;

            if( initAndCheckModeEccPort() != 0 ) {
                BOOTSTATUS->initErrCntr+=1;        // ports init exceed 2 times
            }
        }
    }

    // delay 300us (@8MHz)
    for(i=0; i<350; i++){ asm volatile (" nop \n\t"); }

    // read mode+ecc and write to bootstatus
    BOOTSTATUS->mode_0 = (uint8_t)((MDR_PORTE->RXTX & 0xFF000000) >> 24);
    asm volatile (" ISB \n\t");                         // flush the pipeline
    BOOTSTATUS->mode_1 = (uint8_t)((MDR_PORTE->RXTX & 0xFF000000) >> 24);
    asm volatile (" ISB \n\t");                         // flush the pipeline
    BOOTSTATUS->mode_2 = (uint8_t)((MDR_PORTE->RXTX & 0xFF000000) >> 24);
    asm volatile (" ISB \n\t");                         // flush the pipeline
   
    //deinit ModeEcc Port
    MDR_PORTE->KEY        = 0x8555AAA1;   // key unlock
    MDR_PORTE->CPULLDOWN = 0xFF000000;   // clear pull down
    MDR_PORTE->KEY        = 0x00000000;   // key lock

    // check majoritar modeEcc_x
    BOOTSTATUS->modeMaj = ((BOOTSTATUS->mode_0 & BOOTSTATUS->mode_1)|
                           (BOOTSTATUS->mode_0 & BOOTSTATUS->mode_2)|
                           (BOOTSTATUS->mode_1 & BOOTSTATUS->mode_2));

    // check difference between modeEcc_x
    if (((BOOTSTATUS->mode_0 ^ BOOTSTATUS->mode_1)|
         (BOOTSTATUS->mode_0 ^ BOOTSTATUS->mode_2)|
         (BOOTSTATUS->mode_1 ^ BOOTSTATUS->mode_2)) != 0) BOOTSTATUS->modeMajErr = 1;  // if diff - set error flag

    ECC_COR_STAT.mode = BOOTSTATUS->modeMaj;    // write mode

    getCorrectModeEcc ( &ECC_COR_STAT );         // get correct mode & error info

    // write to bootstatus
    BOOTSTATUS->syndrome   = ECC_COR_STAT.syndrome;
    BOOTSTATUS->parityBit  = ECC_COR_STAT.parityBit;
    BOOTSTATUS->eccErrType = ECC_COR_STAT.eccErrType;
    BOOTSTATUS->modeCorr   = ECC_COR_STAT.modeCorr;

    // delete parity bit ecc_0
    ECC_COR_STAT.modeCorr = (((ECC_COR_STAT.modeCorr & 0xE0)>>1)|(ECC_COR_STAT.modeCorr & 0x0F));
   
   // read mode after reset
    MDR_BKP->KEY = 0x8555AAA1;
    BKP_TMP_0 = (MDR_BKP->REG_60_TMR0 & 0xFFFFFF00);
    BKP_TMP_1 = (MDR_BKP->REG_60_TMR1 & 0xFFFFFF00);
    BKP_TMP_2 = (MDR_BKP->REG_60_TMR2 & 0xFFFFFF00);

   
    // if uneven or double error - set ecc_mode = 011_0001 (BKP)
    // else set corrected value (BKP)
    switch (ECC_COR_STAT.eccErrType) {

    case ECC_NO_ERR    :
    case ECC_SINGL_ERR    :
      
      if (BOOTSTATUS->modeCorr == ETT_K7_TEST) ettK7_TEST();
            
        // write MODE and ECC to BKP
        BKP_TMP_0 |= (1<<30 | ECC_COR_STAT.modeCorr);   // clear FPOR
        BKP_TMP_1 |= (1<<30 | ECC_COR_STAT.modeCorr);   // clear FPOR
        BKP_TMP_2 |= (1<<30 | ECC_COR_STAT.modeCorr);   // clear FPOR
       
        MDR_BKP->REG_60_TMR0 = BKP_TMP_0;
        MDR_BKP->REG_60_TMR1 = BKP_TMP_1;
        MDR_BKP->REG_60_TMR2 = BKP_TMP_2;
       
        MDR_BKP->KEY = 0x00000000;
       
        hideFTerrors();
        break;

    case ECC_DOUBL_ERR  :
    case ECC_UNEVEN_ERR :       
    default:
   
        BOOTSTATUS->modeCorr = 0xFF; // set WAIT_BOOT_JB

        // write MODE and ECC to BKP
        BKP_TMP_0 |= (1<<30 | 0x31);      // set MODE = 0001, ECC = 011, clear FPOR
        BKP_TMP_1 |= (1<<30 | 0x31);      // set MODE = 0001, ECC = 011, clear FPOR
        BKP_TMP_2 |= (1<<30 | 0x31);      // set MODE = 0001, ECC = 011, clear FPOR
       
        MDR_BKP->REG_60_TMR0 = BKP_TMP_0;
        MDR_BKP->REG_60_TMR1 = BKP_TMP_1;
        MDR_BKP->REG_60_TMR2 = BKP_TMP_2;
       
        MDR_BKP->KEY = 0x00000000;
       
        hideFTerrors();
        while(1);
        break;
    }

    switch (BOOTSTATUS->modeCorr) {

    case OTP_JB :
    case OTP_JA :
        runMainAppOtp(); break;


    case EXTBUS_8_ECC_JB :
    case EXTBUS_8_ECC_JA :
        runAppExtBus_8(); break;


    case EXTBUS_CFG_JB :
    case EXTBUS_CFG_JA :
        runAppExtBus_CFG(); break;


    case SPI0_JB :
    case SPI1_JA :
       delay_10ms();                // POR 5575x
       runMainAppSPI(SPI0_JB); break;
   
    case SPI2_JB :
    case SPI3_JA :
       delay_10ms();               // POR 1636x
        runMainAppSPI(SPI2_JB); break;


    case UART0_JA :
       runMainAppUART(UART0_JA); break;
      
    case UART0_JB :
        runMainAppUART(UART0_JB); break;

    case ETT_K7_TEST :
        ettK7_TEST(); break;


    case RESERVED_2 :
        while(1) {}; break;


    case TEST_MODE_JA :
        while(1) {}; break;


    case WAIT_BOOT_JA :
        while(1) {}; break;


    default :
        while(1) {}; break;

    } // switch

    while(1) {};
} // main
Закрыть

Маска при записи в MDR_BKP->REG_60_TMR ничего не даст, потому что запись 1 в поля флагов сброса сбрасывает флаги.
P.S. По моему мнению разработчики BOOTROM перемудрили в отношении флагов сброса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Флаги сброса
СообщениеДобавлено: 2018-ноя-26 09:21 
Не в сети

Зарегистрирован: 2018-авг-16 17:14
Сообщения: 9
vasili писал(а):
Это код функции setFPOR() . Она вызывается в частности перед передачей управления в OTP внутри функции runMainAppOtp(). Сохранение регистров MDR_BKP->REG_60_TMR после сброса в локальных переменных BKP_TMP_0, BKP_TMP_1, BKP_TMP_2 происходит раньше.

// read mode after reset
MDR_BKP->KEY = 0x8555AAA1;
BKP_TMP_0 = (MDR_BKP->REG_60_TMR0 & 0xFFFFFF00);
BKP_TMP_1 = (MDR_BKP->REG_60_TMR1 & 0xFFFFFF00);
BKP_TMP_2 = (MDR_BKP->REG_60_TMR2 & 0xFFFFFF00);

Они регистровые и хранятся в регистрах R0,R1,R2, а затем портятся другими функциями:
Открыть
Код:
seg000:000011A6                 LDR             R3, =MDR_BKP
seg000:000011A8                 STR.W           R4, [R3,#KEY]
seg000:000011AC                 LDR.W           R0, [R3,#REG_60_TMR0]
seg000:000011B0                 LDR.W           R1, [R3,#REG_60_TMR1]
seg000:000011B4                 LDR.W           R2, [R3,#REG_60_TMR2]
seg000:000011B8                 LDRB.W          R5, [SP,#0x30+var_29] ; ECC_COR_STAT.eccErrType
seg000:000011BC                 CMP             R5, #1
seg000:000011BE                 BIC.W           R0, R0, #0xFF
seg000:000011C2                 BIC.W           R1, R1, #0xFF
seg000:000011C6                 BIC.W           R2, R2, #0xFF
seg000:000011CA                 BHI             loc_127A
seg000:000011CC                 LDRB.W          R5, [R8,#9] ; BOOTSTATUS->modeCorr
seg000:000011D0                 CMP             R5, #0x4D ; ETT_K7_TEST
seg000:000011D2                 BEQ.W           loc_1888
seg000:000011D6                 LDRB.W          R5, [SP,#0x30+var_28] ; ECC_COR_STAT.modeCorr
seg000:000011DA                 ORR.W           R5, R5, #0x40000000
seg000:000011DE                 ORRS            R0, R5
seg000:000011E0                 LDRB.W          R5, [SP,#0x30+var_28] ; ECC_COR_STAT.modeCorr
seg000:000011E4                 ORR.W           R5, R5, #0x40000000
seg000:000011E8                 ORRS            R1, R5
seg000:000011EA                 LDRB.W          R5, [SP,#0x30+var_28] ; ECC_COR_STAT.modeCorr
seg000:000011EE                 STR.W           R0, [R3,#REG_60_TMR0] ; MDR_BKP->REG_60_TMR0 = BKP_TMP_0;
seg000:000011F2                 ORR.W           R5, R5, #0x40000000
seg000:000011F6                 ORRS            R2, R5
seg000:000011F8                 STR.W           R1, [R3,#REG_60_TMR1] ; MDR_BKP->REG_60_TMR1 = BKP_TMP_1;
seg000:000011FC                 STR.W           R2, [R3,#REG_60_TMR2] ; MDR_BKP->REG_60_TMR2 = BKP_TMP_2;
seg000:00001200                 MOVS            R2, #0
seg000:00001202                 STR.W           R2, [R3,#KEY]
seg000:00001206                 BL              hideFTerrors
Закрыть

Получается, что флаги документированы в спецификации, но для приложения не работают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Флаги сброса
СообщениеДобавлено: 2018-ноя-26 13:11 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 448
Откуда: ПКК "Миландр"
Есть такая проблема в бутлоадере.
Код начального загрузчика исправили и в ожидаемой сейчас новой ревизии флаги должны стать доступны. (Не будут затираться бутлоадером)
Образцы появятся к концу декабря.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB