Atmel SAM3X8E переключение между двумя банками для загрузки различного поведения

В настоящее время я работаю с платой Arduino Due, в которую встроен процессор Atmel SAM3X8E. Я программирую его с помощью Atmel Studio (версия 7.0.1645) и предоставленной Atmel Software Framework (версия 3.28.1). Цель программы, работающей на SAM, - получить функциональность перепрограммирования. Поэтому программа получает изображение с хост-компьютера, мигает его блок за блоком в неиспользуемой флэш-банке и проверяет изображение. Все это работает нормально, но я сталкиваюсь с той же проблемой, что и этот пост ( переключение между двумя банками Atmel SAM3X не работает).

Atmel SAM3X8E имеет два флэш-банка по 256 КБ, Flash0 и Flash1. Мое приложение легко помещается во Flash0 и программирует полученное изображение на Flash1. Моя идея состоит в том, чтобы использовать возможности SAM3X для загрузки из другого флэш-банка (по умолчанию Flash0). На странице 35 таблицы данных SAM3X указано, что биты GPNVM можно использовать не только для выбора загрузочной памяти (ROM или Flash), но и для выбора банка для загрузки (Flash0 или Flash1). Если GPNVM2 установлен, микросхема будет загружаться с Flash1. Это достигается путем переназначения макета памяти. Поэтому, если GPNVM2 установлен, Flash1 отображается по адресу 0x0008_0000 (в то время как Flash1 и Flash0 непрерывны). Если GPNVM2 очищен, Flash0 отображается по адресу 0x0008_0000 (теперь Flash0 и Flash1 непрерывны).

Что я сделал, так это манипулировал битом GPNVM2 перед перезагрузкой процессора, но он не работал (память не была правильно перераспределена). Я также играл с вариантами Atmel Studio. Atmel Studio может запрограммировать приложение для Bank0 или Bank1, используя "Параметры проекта" -> "Инструмент" -> "Настройки программы". Я пытался запрограммировать свое приложение с этими настройками на Bank1. Это возможно только в том случае, если установлен флажок "Переопределить регистр смещения таблицы векторов (таблица исключений)" и если устройство запрограммировано с помощью "Начать отладку". Если устройство запрограммировано с помощью "Пуск без отладки", оно вообще не загружается, чтобы запустить его (помните, что приложение было перепрошено на Bank1, если переназначение было успешным, Bank1 должен быть расположен по адресу 0x0008_0000, где изначально Bank0 сопоставлен с) Мне пришлось изменить биты GPNVM вручную (используя "Инструменты" -> "Программирование устройства"), чтобы "загрузить из банка0". Тогда это сработало.

Описанное поведение научило меня, что я, должно быть, упустил возможность манипулировать некоторыми регистрами. Очевидно, что "Регистр смещения таблицы векторов переопределения (exception_table)" важен, поэтому я также установил "Регистр смещения таблицы векторов (VTOR)" в качестве начального адреса Flash1, который тоже не помог. У меня такое ощущение, что я пропускаю некоторые функции или регистрирую, что мне нужно вызывать / манипулировать.

Чтобы перепрограммировать процессор, обычно необходимо запустить какой-нибудь загрузчик, которого я надеялся избежать, используя механизм переключения банков. У кого-нибудь есть опыт переключения банков с использованием функций ASF или вообще о переключении банков на SAM3X?

Заранее спасибо!

0 ответов

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