Такая проблема.
не выпоняется команда на запись во flash. Функции взяла из примера, и раньше все вроде работало, пока работала в режиме Debuge. не знаю. в этом ли дело. но после перехода на режим relese программа стала зависать после записи в регистр команды FMR. При этом, если поставить точку останова на следующей команде после записи в регистр FMR, то после запуска команда выполнится и никаких порблем не возникнет.
Вот функци я записи.
Код
unsigned char CEfc::EFC_PerformCommand(
AT91S_EFC *pEfc,
unsigned char command,
unsigned short argument)
{
unsigned int status;
// Set FMCN
switch (command) {
case AT91C_MC_FCMD_LOCK:
case AT91C_MC_FCMD_UNLOCK:
#if (EFC_NUM_GPNVMS > 0)
case AT91C_MC_FCMD_SET_GP_NVM:
case AT91C_MC_FCMD_CLR_GP_NVM:
#endif
#if !defined(EFC_NO_SECURITY_BIT)
case AT91C_MC_FCMD_SET_SECURITY:
#endif
pEfc->EFC_FMR = (pEfc->EFC_FMR & ~AT91C_MC_FMCN) | FMCN_BITS(lMck);
break;
case AT91C_MC_FCMD_START_PROG:
case AT91C_MC_FCMD_ERASE_ALL:
pEfc->EFC_FMR = (pEfc->EFC_FMR & ~AT91C_MC_FMCN) | FMCN_FLASH(lMck);
break;
}
pEfc->EFC_FCR = (0x5A << 24) | (argument << 8) | command;
do {
status = pEfc->EFC_FSR;
}
while ((status & AT91C_MC_FRDY) == 0);
return (status & (AT91C_MC_PROGE | AT91C_MC_LOCKE));
}
Если поставить точку останова на status = pEfc->EFC_FSR;потом запустить снова - никаких проблем, массив запишется во flash. если не ставить, то iar будет ругаться Abort Handler.
Скорость FMCN_FLASH(mck) ((((mck) / 2000000) * 3) << 16)
mck 48МГц, FWS=1
в чем может быть дело?