__ramfunc unsigned int FlashWriteCriticalSection(unsigned long Page)
{
unsigned long status = 0; /* Устанавливаем базовый адрес Flash контроллера */
AT91PS_MC ptMC = AT91C_BASE_MC;
/* Устанавливаем команду записи Flash */
ptMC->MC_FCR = AT91C_MC_CORRECT_KEY | AT91C_MC_FCMD_START_PROG | (AT91C_MC_PAGEN & (Page << 8)) ;
/* Ожидаем выполнения команды */
while ((status & AT91C_MC_FRDY) != AT91C_MC_FRDY )
status = AT91C_BASE_MC->MC_FSR;
return status;
}
/* Запись во флэш */
int FlashWrite(unsigned char *buf, unsigned long page)
{
unsigned long *Flash = (unsigned long *)(page * AT91C_IFLASH_PAGE_SIZE + (unsigned long)AT91C_IFLASH);
/* Устанавливаем время ожидания записи во флэш */
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN) & (72 << 16)) | AT91C_MC_FWS_1FWS;
/* Копируем новые значения в буфер */
for (unsigned long i = 0; i < 32; i++)
{
unsigned long lwd = buf[i * 4] + (buf[i * 4 + 1] << 8) + (buf[i * 4 + 2] << 16) + (buf[i * 4 + 3] << 24);
*Flash = lwd;
Flash++;
}
__disable_interrupt(); /* Запрещаем прерывания на время записи */
unsigned int status = FlashWriteCriticalSection(page);
__enable_interrupt(); /* Разрешаем прерывания */
/* Проверка результата */
if ((status & (AT91C_MC_PROGE | AT91C_MC_LOCKE)) != 0)
return 0;
return 1;
}
void *FlashInit(unsigned long page){
return (void*) (page * AT91C_IFLASH_PAGE_SIZE + (unsigned long)AT91C_IFLASH);
}