Коммутатор Atmel SAM3X с двумя банками не работает

В настоящее время я работаю с микроконтроллером Atmel SAM3X8 ARM с флэш-памятью 2 x 256 КБ с двумя банками. Я пытаюсь реализовать функцию обновления микропрограммы, которая помещает новую микропрограмму в текущий неиспользуемый флэш-банк, и когда это делается, меняются банки, используя переназначение флэш-памяти для запуска новой прошивки.

Таблица данных заявляет, что для этого мне нужно установить бит GPNVM2, тогда MCU переназначит память, поэтому Flash 1 теперь имеет значение 0x80000, а Flash 0 - 0xC0000. Это также приведет к выполнению кода MCU, начиная с Flash 1.

Чтобы процитировать таблицу:

GPNVM2 используется только для замены Flash 0 и Flash 1. Если GPNVM2 включен, Flash 1 отображается по адресу 0x0008_0000 (Flash 1 и Flash 0 непрерывны). Если GPNVM2 ОТКЛЮЧЕН, Flash 0 отображается по адресу 0x0008_0000 (Flash 0 и Flash 1 непрерывны).

[...]

GPNVM2 позволяет выбрать, будет ли Flash 0 или Flash 1 использоваться для загрузки. Установка бит 2 GPNVM выбирает загрузку из Flash 1, очистка - выбор загрузки из Flash 0.

Но когда я устанавливаю GPNVM2, либо через SAM-BA, либо через мою собственную прошивку, использующую flash_set_gpnvm (2) (ASF SAM Flash Service API), он все равно будет загружаться из программы во Flash 0, а новая программа будет по-прежнему находиться со смещением Flash 1. 0xc0000. Состояние GPNVM2 было проверено с помощью flash_is_gpnvm_set(2)

Прошивка самой прошивки в банк Flash1 работает безупречно, что было подтверждено сбросом всей флэш-памяти с SAM-BA.

В Atmel есть ошибка, связанная с тем, что переназначение флэш-памяти работает только для частей размером менее 64 КБ. Мой код меньше этого (40 КБ), так что это не должно быть проблемой.

Я не нашел других людей, имеющих эту проблему, и ни одного примера, как ее использовать, так что, возможно, кто-то может сказать мне, если я делаю что-то не так, или что еще проверить.

1 ответ

Решение

У меня была та же проблема (см. Здесь: Atmel SAM3X8E, переключение между двумя банками для загрузки другого поведения).

После еще одного исследования я нашел примечание по применению (ссылка: http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42141-SAM-AT02333-Safe-and-Secure-Bootloader-Implementation-for-SAM3-4_Application-Note.pdf), который объясняет поведение загрузки SAM3X более понятным способом. Проблема в том, что таблица данных немного вводит в заблуждение (по крайней мере, я тоже был сбит с толку). SAM3X не имеет возможности переназначить флэш-банки. Поведение при загрузке немного отличается (см. Рисунок в ссылке, оно взято из заметки о приложении, стр. 33/34): Поведение при загрузке SAM3X

Рисунок 3-9 показывает поведение SAM3X при загрузке. Биты 1 и 2 GPNVM просто определяют, какой раздел памяти (ROM/Flash0/Flash1) зеркалируется в загрузочную память (расположена по адресу 0x00000000). Отображение банков Flash не изменилось. Поэтому Flash0 по-прежнему отображается на 0x00080000, а Flash1 на 0x000C0000).

Как отмечается в Приложении, некоторые другие микроконтроллеры Atmel могут реально перераспределять флэш-банки (например, SAM3SD8 и SAM4SD32/16). Эти процессоры меняют расположение банков Flash, как вы можете видеть на рисунке 3-10.

Поэтому, чтобы иметь возможность обновить прошивку, необходимо внедрить какой-то загрузчик. Я реализовал один самостоятельно и смог обновить прошивку даже без использования битов GPNVM. Я также открываю билет поддержки в Microchip, чтобы уточнить поведение при загрузке. Когда я получу ответ, я надеюсь рассказать вам больше.

РЕДАКТИРОВАТЬ:

Вот ответ от поддержки Microchip:

Установка бита GPNVM2 в SAM3X просто заставит процессор "перепрыгивать" или запускаться с флэш-банка 1, т. Е. 0xC0000. Никакой фактической замены адресов памяти не произойдет.

Чтобы использовать флэш-банк 1, вам нужно изменить файл компоновщика (flash.ld), чтобы он отображал начальный адрес флэш-памяти 0xC0000.

Для приложения флэш-банка 0 измените: rom (rx): ORIGIN = 0x00080000, LENGTH = 0x00080000 / * Flash, 512K / на: rom (rx): ORIGIN = 0x00080000, LENGTH = 0x00040000 / Flash, 256K * /

Для приложения Flash Bank 1 измените: rom (rx): ORIGIN = 0x00080000, LENGTH = 0x00080000 / * Flash, 512K / на: rom (rx): ORIGIN = 0x000C0000, LENGTH = 0x00040000 / Flash, 256K * /

Если этого не сделать, обработчик сброса в приложении flash 1 будет указывать на адрес в приложении flash 0. Таким образом, хотя код начнет выполнение во флэш-памяти 1 (если установлен GPNVM2), он вернется к приложению флэш-памяти 0. Ошибки, указывающие ограничение 64 КБ, могут быть проигнорированы.

Следовательно, Замечание по применению является правильным, и фактическое изменение отображения Ммори не выполняется.

Ура Лукас

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