30.12. Внешнее программирование
Внешнее программирование - способ программирования энергонезависимой памяти данных и памяти программ с помощью внешнего программатора или отладчика. Программирование может выполняться либо внутри системы (внутрисистемное программирование), либо на специальных производственных программаторах. Для выполнения такого программирования необходимо придерживаться ограничений по максимальным и минимальным напряжению и частоте, значения которых приводятся в документации на МК.
Доступ к микроконтроллеру при внешнем программировании осуществляется через контроллер PDI, который внешне доступен через электрический интерфейс JTAG или PDI. Более детально о разрешении работы и использовании интерфейсов PDI и JTAG см. в 20 "Интерфейс программирования и отладки". Далее по тексту полагается, что разрешение работы электрического интерфейса контроллера PDI выполнено корректно. Через PDI внешний программатор имеет возможность доступа к любой энергонезависимой памяти и NVM-контроллеру по шине PDI, при этом, и память программ и память данных образуют единое линейное пространство памяти PDI. На рисунке 30.4 показано пространство памяти PDI и базовые адреса каждого пространства памяти МК.
Рисунок 30.4. Карта памяти PDI
30.12.1. Разрешение работы интерфейса внешнего программирования
Программирование NVM через PDI требует разрешения работы, что можно сделать следующим образом.
- Запишите в регистр RESET контроллера PDI значение 0x59 (сигнатура сброса).
- Запишите корректный NVM-ключ в PDI.
- Дождитесь равенства единицы бита NVMEN регистра статуса PDI (PDI STATUS).
Если бит NVMEN в регистре PDI STATUS станет равным единице, это означает, что интерфейс NVM готов для использования контроллером PDI .
30.12.2. Программирование NVM
30.12.2.1. Адресация NVM
После разрешения работы интерфейса PDI NVM все запоминающие устройства МК становятся доступными в адресном пространстве PDI. В дальнейших упоминаниях о чтении и записи памяти данных или памяти программ полагается использование адресации в соответствии с картой памяти, представленной на рисунке 30.4. Контроллер PDI использует только побайтную адресацию. Это означает, что любой адрес памяти является адресом байта. При заполнении страничного буфера Flash-памяти или EEPROM, для определения адресуемой ячейки страничного буфера используются только младшие биты адреса. В остальных случаях, в целях гарантирования корректности отображения адресов, требуется указание полного адреса страницы Flash-памяти или EEPROM.
30.12.2.2. Занятость NVM
Во время программирования (стирание страницы и запись страницы) , когда NVM находится в занятом состоянии, блокируется возможность чтения всей NVM.
30.12.3. NVM-команды
NVM-команды, которые можно использовать для доступа к энергонезависимым запоминающим устройствам при внешнем программировании, представлены в таблице 30.5. Для внешнего программирования доступен более обширный набор команд, чем при самопрограммировании. При внешнем программировании, для исполнения команд с запуском по действию необходимо установить бит CMDEX в регистре NVM CTRLA. Исполнение команд с запуском по чтению происходит при выполнении инструкций прямого или косвенного чтения (LDS или LD) из PDI (чтение PDI). Наконец, команды с запуском по записи исполняются при выполнении инструкции прямой или косвенной записи (STS или ST) из PDI (запись PDI).
Детальное описание алгоритма выполнения каждой NVM-команды представлено в подразделах 30.12.3.1…30.12.3.11. Возможность выполнения большинства команд зависит от состояния Lock-бит. После активизации защиты от чтения и записи можно выполнить только команды стирания всей памяти и проверки CRC Flash-памяти.
Таблица 30.5. NVM-команды, доступные при внешнем программировании
CMD[6:0] |
Наименование команды |
Запуск |
Защита от изменения |
Занятость NVM |
0x00 |
Нет операции |
- |
- |
- |
0x40 |
Стирание всей памяти(1) |
CMDEX |
Есть |
Занято |
0x43 |
Чтение NVM |
Чтение PDI |
Нет |
Нет |
Страничный буфер Flash-памяти |
0x23 |
Загрузка страничного буфера |
Запись PDI |
Нет |
Нет |
0x26 |
Стирание страничного буфера |
CMDEX |
Есть |
Занято |
Flash-память |
0x2B |
Стирание страницы Flash-памяти |
Запись PDI |
Нет |
Занято |
0x2E |
Запись страницы Flash-памяти |
Запись PDI |
Нет |
Занято |
0x2F |
Стирание и запись страницы Flash-памяти |
Запись PDI |
Нет |
Занято |
0x78 |
Проверка CRC Flash-памяти |
CMDEX |
Есть |
Занято |
Сектор прикладной программы |
0x20 |
Стирание сектора прикладной программы |
Запись PDI |
Нет |
Занято |
0x22 |
Стирание страницы сектора прикладной программы |
Запись PDI |
Нет |
Занято |
0x24 |
Запись страницы сектора прикладной программы |
Запись PDI |
Нет |
Занято |
0x25 |
Стирание и запись страницы сектора прикладной программы |
Запись PDI |
Нет |
Занято |
0x38 |
Проверка CRC в секторе прикладной программы |
CMDEX |
Есть |
Занято |
Загрузочный сектор |
0x68 |
Стирание загрузочного сектора |
Запись PDI |
Нет |
Занято |
0x2A |
Стирание страницы загрузочного сектора |
Запись PDI |
Нет |
Занято |
0x2C |
Запись страницы загрузочного сектора |
Запись PDI |
Нет |
Занято |
0x2D |
Стирание и запись страницы загрузочного сектора |
Запись PDI |
Нет |
Занято |
0x39 |
Проверка CRC в загрузочном секторе |
NVMAA |
Есть |
Занято |
Секторы калибровочных данных и сигнатурного кода пользователя |
0x03 |
Чтение сигнатурного кода пользователя |
Чтение PDI |
Нет |
Нет |
0x18 |
Стирание сигнатурного кода пользователя |
Запись PDI |
Нет |
Занято |
0x1A |
Запись сигнатурного кода пользователя |
Запись PDI |
Нет |
Занято |
0x02 |
Чтение калибровочных данных |
Чтение PDI |
Нет |
Нет |
Fuse- и Lock-биты |
0x07 |
Чтение Fuse-бит |
Чтение PDI |
Нет |
Нет |
0x4С |
Запись Fuse-бит |
Запись PDI |
Нет |
Занято |
0x08 |
Запись Lock-бит |
CMDEX |
Есть |
Занято |
Страничный буфер EEPROM |
0x33 |
Загрузка страничного буфера EEPROM |
Запись PDI |
Нет |
Нет |
0x36 |
Стирание страничного буфера EEPROM |
CMDEX |
Есть |
Занято |
EEPROM |
0x30 |
Запись EEPROM |
CMDEX |
Есть |
Занято |
0x32 |
Стирание страницы EEPROM |
Запись PDI |
Нет |
Занято |
0x34 |
Запись страницы EEPROM |
Запись PDI |
Нет |
Занято |
0x35 |
Стирание и запись страницы EEPROM |
Запись PDI |
Нет |
Занято |
0x06 |
Чтение EEPROM |
Чтение PDI |
Нет |
Нет |
Прим.:
- Если fuse-бит EESAVE запрограммирован, выполнение команды стирания всей памяти не повлияет на содержимое EEPROM.
30.12.3.1. Стирание всей памяти
Данная команда предназначена для стирания Flash-памяти программ, EEPROM и Lock-бит. При необходимости из этого перечня можно исключить EEPROM. Для этого нужно запрограммировать fuse-бит EESAVE (см. 4.16.5 "FUSEBYTE5 - конфигурационный байт 5 энергонезависимой памяти"). Данная инструкция не влияет на сигнатурный код пользователя, калибровочные данные и Fuse-биты.
- Запишите в регистр NVM CMD команду стирания всей памяти.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Сразу после запуска этой операции происходит отключение PDIBUS, а бит NVMEN в регистре PDI STATUS вплоть до завершения операции имеет нулевое значение. Убедиться в возобновлении работы PDIBUS можно путем опроса бита NVMEN (должен быть равен 1).
Флаг BUSY в регистре NVM STATUS вплоть до завершения операции остается равным единице.
30.12.3.2. Чтение NVM
Данная команда предназначена для чтения Flash-памяти, EEPROM, Fuse-бит, сигнатурного кода и калибровочных данных.
- Запишите в регистр NVM CMD команду чтения NVM.
- Прочитайте выбранный адрес памяти путем выполнения операции чтение PDI.
Для чтения различных секторов памяти также можно использовать команды чтения EEPROM, чтения Fuse-бит, чтения сигнатурного кода и чтения калибровочных данных. Алгоритм выполнения этих команд идентичен команде чтения NVM.
30.12.3.3. Стирание страничного буфера Flash-памяти/EEPROM
Данные команды предназначены для стирания страничных буферов Flash-памяти и EEPROM.
- Запишите в регистр NVM CMD команду стирания страничного буфера Flash-памяти/EEPROM.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS остается установленным вплоть до завершения выполнения операции.
30.12.3.4. Загрузка страничного буфера Flash-памяти/EEPROM
Данные команды предназначены для записи одного байта данных в страничные буферы Flash-памяти и EEPROM.
- Запишите в регистр NVM CMD команду загрузки страничного буфера Flash-памяти/EEPROM.
- Выполните операцию запись PDI для записи по выбранному адресу памяти.
Поскольку доступ к страничному буферу Flash-памяти выполняется пословно, а PDI использует побайтную адресацию, запись страничного буфера Flash-памяти PDI-контроллером должна выполняться в корректной последовательности. При выполнении записи, вначале необходимо записать младший байт, а затем старший. После записи младшего байта, он помещается во временный регистр, откуда в дальнейшем будет скопирован в слово страничного буфера одновременно с записью старшего байта слова.
На время выполнения команды работа интерфейса PDI автоматически приостанавливается, чтобы избежать выполнения следующей PDI-инструкции.
30.12.3.5. Стирание страницы Flash-памяти/EEPROM
Команды стирания страницы сектора прикладной программы, стирания страницы загрузочного сектора, стирания сигнатурного кода пользователя и стирания страницы EEPROM предназначены для стирания одной страницы выбранного пространства памяти.
- Запишите в регистр NVM CMD команду стирания страницы сектора прикладной программы/загрузочного сектора/сигнатурного кода пользователя/EEPROM.
- Запишите выбранную страницу путем выполнения операции запись PDI. Для записи страницы необходимо адресоваться к любой её ячейке.
Флаг BUSY регистра NVM STATUS удерживается в установленном состоянии вплоть до завершения операции.
30.12.3.6. Запись страницы Flash-памяти/EEPROM
Команды записи страницы сектора прикладной программы, записи страницы загрузочного сектора, записи сигнатурного кода пользователя и записи страницы EEPROM предназначены для записи загруженного страничного буфера Flash-памяти/EEPROM в выбранное пространство памяти.
- Запишите в регистр NVM CMD команду записи страницы сектора прикладной программы/загрузочного сектора/сигнатурного кода пользователя/EEPROM.
- Запишите выбранную страницу путем выполнения операции запись PDI. Для записи страницы необходимо адресоваться к любой её ячейке.
Флаг BUSY регистра NVM STATUS удерживается в установленном состоянии вплоть до завершения операции.
30.12.3.7. Стирание и запись страницы Flash-памяти/EEPROM
С помощью данных команд можно за один подход выполнить стирание и запись страницы сектора прикладной программы, стирание и запись страницы загрузочного сектора или стирание и запись страницы EEPROM.
- Запишите в регистр NVM CMD команду стирание и запись страницы сектора прикладной программы/загрузочного сектора/сигнатурного кода пользователя/EEPROM.
- Запишите выбранную страницу путем выполнения операции запись PDI. Запись страницы сектора выполняется при условии адресации любой его ячейки.
Флаг BUSY регистра NVM STATUS удерживается в установленном состоянии вплоть до завершения операции.
30.12.3.8. Стирание сектора прикладной программы/загрузочного сектора/EEPROM
Данные команды предназначены для стирания всего выбранного сектора.
- Запишите в регистр NVM CMD команду стирания сектора прикладной программы/загрузочного сектора/EEPROM.
- Запишите выбранный сектор с помощью операции запись PDI. Запись страницы сектора выполняется при условии адресации любой его ячейки.
Флаг BUSY регистра NVM STATUS удерживается в установленном состоянии вплоть до завершения операции. 30.12.3.9. Проверка CRC в секторе прикладной программы/загрузочном секторе
Данные команды предназначены для проверки содержимого выбранного сектора Flash-памяти после их программирования.
- Запишите в регистр NVM CMD команду проверки CRC в секторе прикладной программы/загрузочном секторе.
- Установите бит CMDEX в регистре NVM CTRLA с помощью привязанной ко времени последовательности CCP.
Флаг BUSY регистра NVM STATUS удерживается в установленном состоянии вплоть до завершения операции. Результат вычисления контрольной суммы CRC доступен в регистре NVM DATA.
30.12.3.10. Проверка CRC Flash-памяти
Данная команда предназначена для проверки содержимого Flash-памяти программ после её программирования. Возможность выполнения команды не зависит от состояния lock-бит.
- Запишите в регистр NVM CMD команду проверки CRC Flash-памяти.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Сразу после запуска операции отключается шина PDIBUS, а бит NVMEN регистра PDI STATUS удерживается в сброшенном состоянии вплоть до завершения операции. Убедиться в возобновлении работы шины PDIBUS можно путем опроса бита NVMEN (должен быть равен единице).
Флаг BUSY регистра NVM STATUS остается в установленном состоянии до завершения операции. Результат вычисления контрольной суммы CRC доступен в регистре NVM DATA.
30.12.3.11. Запись Fuse-/Lock-бит
Данные команды предназначены для записи fuse- и lock-бит (только в направлении усиления защиты).
- Запишите в регистр NVM CMD команду записи Fuse-/ Lock-бит.
- Запишите выбранные fuse- или Lock-биты путем выполнения операции запись PDI.
Флаг BUSY в регистр NVM STATUS удерживается в установленном состоянии вплоть до завершения операции.
30.13. Описание регистров
Полное описание регистров NVM-контроллера см. в 4.15 "Описание регистров контроллера энергонезависимой памяти".
Полное описание регистров PDI см. в 29.7 "Описание регистров управления и статуса PDI".
30.14. Обзор регистров
Обзор регистров NVM-контроллера см. в 4.21 "Обзор регистров контроллера энергонезависимой памяти", а обзор регистров контроллера PDI см. в 29.8 "Обзор регистров".
|