Таких багов с SAM7A3 не видел, но сталкивался с необъяснимыми на первый взгляд случайными зависаниями контроллера - мог отработать сутки, а мог зависнуть через две секунды. Эмпирическим путем выяснил, что уходит в Data Abort. Проблема была в flash waitstate, который надо было увеличить в cstartup, несмотря на "single cycle access up to 30 MHz" и на мои 25 МГц.
Код
void AT91F_LowLevelInit(void)
{
int i;
[b]AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS;[/b]
AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
// 1 Enabling the Main Oscillator:
AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
// 2 Configuring the PLL
AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & PLL_DIV ) |
(AT91C_CKGR_PLLCOUNT & (28<<8)) |
(AT91C_CKGR_MUL & ((PLL_MUL-1)<<16)));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// 3 Selection of Master Clock and Processor Clock
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// 4 configuring reset controller, enable external reset
AT91C_BASE_RSTC->RSTC_RMR = (0xA5000000 | AT91C_RSTC_URSTEN | (0x0C << 8) /* ERSTL */);
// 5 Set up the default interrupts handler vectors
for (i=0; i<31; i++)
{
AT91C_BASE_AIC->AIC_SMR[i] = 0;
AT91C_BASE_AIC->AIC_SVR[i] = 0;
}
AT91C_BASE_AIC->AIC_SPU = (uint32_t) AT91F_Spurious_Handler;
// 6 Send acknowledge for all possible pending interrupts (8-level priority stack)
for (i=0; i<8; i++) AT91C_BASE_AIC->AIC_EOICR = 0;
}