Делаю проект на SAM7S128 и попутно осваиваю ARM.
Пытаюсь установить GPNVM0 и GPNVM1 биты для включения BrownOut Detector.
Пробую уже по-всякому, и так и сяк - но при выполнении все виснет... Даже WatchDog или J-Link потом не сбрасывает, помогает только выключение питания. Причем сами биты (один или оба) как раз устанавливаются...
Вот код IAR:
Код
__ramfunc void MemDelay(void)
{
for (volatile int i=0; i<100; i++);
}
__ramfunc void EnableBrownOutDetector(void)
{
__disable_irq();
while ((AT91C_BASE_MC->MC_FSR & 1)==0);
AT91C_BASE_MC->MC_FMR = (AT91C_BASE_MC->MC_FMR & ~AT91C_MC_FMCN) | (48 << 16); // 48 MHz
AT91C_BASE_MC->MC_FCR = (0x5A<<24)|(1<<8)|AT91C_MC_FCMD_SET_GP_NVM;//AT91C_MC_FCMD_SET_GP_NVM;
MemDelay();
while ((AT91C_BASE_MC->MC_FSR & 1)==0);
MemDelay();
AT91C_BASE_MC->MC_FMR = (AT91C_BASE_MC->MC_FMR & ~AT91C_MC_FMCN) | (48 << 16); // 48 MHz
AT91C_BASE_MC->MC_FCR = (0x5A<<24)|(0<<8)|AT91C_MC_FCMD_SET_GP_NVM;
MemDelay();
while ((AT91C_BASE_MC->MC_FSR & 1)==0);
__enable_irq();
}
Сама программа во Flash.
EnableBrownOutDetector() вызывается по нажатию кнопки в меню отладочного терминала (DBGU).
Если ходить по шагам, то мертво виснет на записи первой (либо второй - уже точно не помню) команды.
Еще эффект - если SET_GP заменить на CLR_GP, то биты сбрасываются и очень шустро, ничего не виснет.
WatchDog включен примерно на 1 секунду (неужели биты устанавливаются дольше чем 1 секунда?)
Что это может быть ?