Почему не прошивает flash процессора при использовании IAP-команды в ARM?

Процессор lcp2478 c ядром ARM7TDMI-S. Пытаюсь сделать загрузчик для обновления ПО из программы используя команды IAP.

Этап подготовки возвращает результат выполнено. На этапе стирания - зависает. Причем не из-за while: он просто не возвращается в программу после вызова IAP-команды. Если пропустить этап стирания, то команда CopyRAMtoFLASH возвращает 0x0D (13 в десятичном). В UserManual возвращаемых значений всего 11 начиная с 0. Реально ничего в flash не записывается. В какую сторону копать?

#define USER_APPLICATION_START_SECTOR 8
#define USER_APPLICATION_END_SECTOR   27
...
int main(void){
...
while (IAP_PrepareSector(USER_APPLICATION_START_SECTOR, USER_APPLICATION_END_SECTOR));
while (IAP_EraseSector  (USER_APPLICATION_START_SECTOR, USER_APPLICATION_END_SECTOR));
...
while (IAP_PrepareSector(USER_APPLICATION_START_SECTOR, USER_APPLICATION_END_SECTOR));
a = IAP_CopyRAM_ToFlash(iap_flash_address, (uint32_t) TerminalBuffer(UART_0), BINARY_DATA_BLOCK_SIZE);
buf[0] = a/10 + '0';
buf[1] = a%10 + '0';
TerminalOutput(UART_0, buf,2);
...
}
...
uint32_t IAP_CopyRAM_ToFlash (const uint32_t destination, const uint32_t source, const uint32_t length)
{
	char exmpl[300] = {0};
	command[0] = IAP_CMD_COPY_RAM_TO_FLASH;
	command[1] = destination;
	command[2] = source;
	command[3] = length;
	command[4] = IAP_CLK / 1000;	// Fcclk in KHz
	IAP_ENTRY(command, result);
	return result[0];
}

uint32_t IAP_EraseSector (const uint32_t start_sector, const uint32_t end_sector)
{
	if (start_sector > end_sector)
		return IAP_RESULT_INVALD_PARAM;

	command[0] = IAP_CMD_ERASE_SECTOR;
	command[1] = start_sector;
	command[2] = end_sector;
	command[3] = IAP_CLK / 1000;

	IAP_ENTRY(command, result);

	return result[0];
}

uint32_t IAP_PrepareSector (const uint32_t start_sector, const uint32_t end_sector)
{
	if (start_sector > end_sector)
		return IAP_RESULT_INVALD_PARAM;

	command[0] = IAP_CMD_PREPARE_SECTOR;
	command[1] = start_sector;
	command[2] = end_sector;

	IAP_ENTRY(command, result);

	return result[0];
}
  • Вопрос задан
  • 2518 просмотров
Решения вопроса 1
scientistnik
@scientistnik Автор вопроса
От неизвестных ошибок я избавился)). Просто нужно было отключить прерывания VIC:

save_VicInt = VICIntEnable;              // save interrupt enable status
VICIntEnClr = 0xFFFFFFFF;                // disable all interrupts
IAP_ENTRY(command, result);
VICIntEnable = save_VicInt;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы