когда я пытаюсь стереть или записать флэш-память программы на моем 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);
}
Как упоминалось ранее, это происходит только тогда, когда НЕ выполняется пошаговая отладка. Я подозреваю, что это как-то связано с занятостью вспышки, но я не нашел ничего, что помогло бы мне понять.
Спасибо за вашу помощь.