S32K146EVB Чтение коллизий при стирании / записи флэш - PullRequest
0 голосов
/ 04 апреля 2019

когда я пытаюсь стереть или записать флэш-память программы на моем EVB S32K146, я сталкиваюсь с ошибкой в ​​тот момент, когда FTFC должен выполнить команду. Также устанавливается бит RDCOLLERR в регистре FTFC_STAT. Это ошибка от S32DS:

BusFault: произошла точная (синхронная) ошибка доступа к данным. Возможное местоположение: 0x00000BA0.

ПК остановился на 0xb8a.

Это разборка:

11          while ((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0);
00000b88:   nop     
00000b8a:   ldr     r3, [pc, #20]   ; (0xba0 <execute_command+44>)
00000b8c:   ldrb    r3, [r3, #0]
00000b8e:   uxtb    r3, r3
00000b90:   sxtb    r3, r3
00000b92:   cmp     r3, #0
00000b94:   bge.n   0xb8a <execute_command+22>
12          return;
00000b96:   nop     
13        }
00000b98:   mov     sp, r7
00000b9a:   pop     {r7}
00000b9c:   bx      lr
00000b9e:   nop     
00000ba0:   movs    r0, r0
00000ba2:   ands    r2, r0

Как ни странно, этого не происходит, когда я пересекаю программу построчно. Тогда вспышка запрограммирована правильно.

Это моя процедура удаления сектора вспышки:

void flash_erase_section(unsigned int addr)
{
    // wrong address
    if ((addr > FLASH_END_ADDRESS && addr < FLEXNVM_START_ADDRESS) || addr > FLEXNVM_END_ADDRESS){
        return;
    }

    asm volatile("cpsid i");
    // wait if operation in progress
    while ((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0);

    // clear flags
    FTFC->FSTAT = FTFC_FSTAT_ACCERR_MASK | FTFC_FSTAT_FPVIOL_MASK;

    FTFC->FCCOB[3] = 0x09;                  // erase flash section command
    FTFC->FCCOB[2] = (addr >> 16) & 0xFF;   // address[23:16]
    FTFC->FCCOB[1] = (addr >> 8) & 0xFF;    // address[15:8]
    FTFC->FCCOB[0] = addr & 0xF0;           // address[7:0] 128 bit aligned
    execute_command();
    asm volatile("cpsie i");
    return;
}

Ошибка происходит в execute_command():

void execute_command()
{
    FTFC->FSTAT |= FTFC_FSTAT_CCIF_MASK;
    while ((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0);
}

Как упоминалось ранее, это происходит только тогда, когда НЕ выполняется пошаговая отладка. Я подозреваю, что это как-то связано с занятостью вспышки, но я не нашел ничего, что помогло бы мне понять.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 05 апреля 2019

Я нашел обходной путь.Кажется, что MCU выдал Bus Fault, потому что, получив доступ к флэш-памяти, кэшированные инструкции стали недействительными.Отключение кэширования с помощью записи LMEM->PCCRMR = 0; решило проблему.

Тем не менее было бы интересно, если бы существовало решение, которое не включает полное отключение кэширования.

...