Atmel SAM3X8E теряет VTOR после жесткого сброса

Кажется, я повторяю этот вопрос здесь и здесь. Когда я перезагружаю свою систему после прошивки прошивки на противоположный флэш-банк, VTOR равен 0 (это означает, что он не загружается с флэш-памяти), и я не могу запустить новую прошивку.

Я использую контроллер EFC для программирования двоичного файла прошивки во второй банк флэш-памяти. Например, активная прошивка находится на Flash0, расположенном по адресу 0x0008_0000. В руководстве по внедрению сказано, что Flash1 находится по адресу 0x000C_0000. Я вижу, что полная прошивка для прошивки содержится без ошибок, в 0x000C_0000. Как только прошивка загружена и проверена, я переключаю банк загрузки GPNVM:

efc_perform_command(EFC0, EFC_FCMD_SGPB, 1); //set GPNVM bit 1
efc_perform_command(EFC0, EFC_FCMD_SGPB, 2); //set GPNVM bit 2
/* Now check to make sure the bit has flipped) */
efc_perform_command(EFC0, EFC_FCMD_GGPB, 0);
status = efc_get_result(EFC0);
printf("GPNVM is now %d\n", status);

/* Now set the VTOR to the flash1 start address) */
__DSB();
__ISB();
SCB->VTOR = ((uint32_t)FLASH1_ADDRESS & SCB_VTOR_TBLOFF_Msk);
/* Checking the VTOR value here shows a result of 0x000C_0000 */
__DSB();
__ISB();

/* Now reset the device by pulling NRSTB pin low */
reset_pull_NRSTB_low();
while(1); 

После выполнения этого кода я снова проверяю регистр VTOR по адресу 0xE000_ED08, и теперь значение равно 0x0000_0000. Прошивка не загружается, так как микросхема ищет адрес 0x0000_0000 для запуска прошивки.

Может быть, я неправильно установил биты GPNVM, и он ищет векторы ПЗУ? Если это так, какие надлежащие биты GPNVM нужно установить? В соответствии с таблицей на стр. 33 документа начального загрузчика биты GPNVM должны быть "0b110", так что GPNVM[1] равен 1, а GPNVM[2] равен 1 - это означает, что микропрограмма будет запускаться из Flash Bank 1. Это правильная интерпретация?

1 ответ

Решение

Хорошо, конечно, я знал, что поиск решения заставит меня чувствовать себя глупо. Но вот, пожалуйста... Я в конечном итоге изменил скрипт компоновщика в папке Device_Startup, предоставленный Atmel, и скомпилировал его дважды; каждый с адресами FLASH0 и FLASH1 соответственно на месте, без каких-либо других изменений в прошивке. И... двоичные файлы прошивки были идентичны! Но это не должно иметь место согласно Atmel.

Я был сбит с толку, потому что он говорит, что воспоминания зеркально отражены, что заставило меня поверить, что установка GPNVM только указывала на запуск флэш-банка по тому же адресу и переназначил вторую половину на основе GPNVM2. Вместо этого создается впечатление, что он фактически загружает таблицу векторов из второго слова двоичного файла прошивки (SP и затем ПК).

Так что нужно сказать, где прыгать в непрерывный банк флэш-памяти. Я вошел в свойства решения ASF, чтобы найти настройки компоновщика ARM/GNU и нашел настоящий файл компоновщика в разделе тегов. Это не тот, который упоминается в моем проекте. Я изменил его в соответствии с рекомендациями, которые я упомянул выше, и он успешно переключился для запуска прошивки в противоположном банке.

Простое решение, казалось бы, неясной аппаратной проблемы. Спасибо за вашу помощь!

Другие вопросы по тегам