Программирование Flash-памяти программ микроконтроллера

Микроконтроллеры AVR имеют от 1кБ до 128Кб перепрограммируемой флэш памяти программ и от 128 байт до 4 Кб энергонезависимой памяти данных. При поставке флэш память и память данных стерты (содержат $FF) и готовы к программированию. Микросхемы поддерживают высоковольтный (12В) параллельный режим программирования и низковольтный режим последовательного программирования. Напряжение +12В используется только для разрешения программирования, этот вывод не потребляет тока. Последовательный режим программирования предусмотрен для загрузки программы и данных в микроконтроллер в системе пользователя (внутрисистемное программирование).

Память программ и данных в микросхеме программируются байт за байтом в обоих режимах программирования. Для энергонезависимой памяти предусмотрен режим автоматического стирания при последовательном программировании.

Параллельный режим программирования требует наличия дополнительного оборудования – программатора обычно заводского изготовления и обычно применяется при серийном производстве устройств на базе микроконтроллеров, когда программа уже отлажена. Режим последовательного программирования является более оперативным, так как не требует при прошивке физического перемещения микросхемы из устройства в программатор и обратно, поэтому рассмотрим его

Программирование битов блокировки памяти

Микроконтроллер AT90S2313 имеет два бита блокировки, которые могут быть оставлены незапрограммированными (1) или программироваться (0), при этом достигаются свойства приведенные в таблице 5.1.

Таблица 5.1 Назначение битов защиты

Биты блокировки Тип защиты
Режим LB1 LB2
      защита не установлена
      дальнейшее программирование флэш памяти и EEPROM запрещено
      как режим 2, но запрещено и чтение

Примечание: биты блокировки стираются только при полном стирании памяти

Код устройства

Все микроконтроллеры фирмы Atmel имеют 3-байтовый сигнатурный код, по которому идентифицируется устройство. Этот код может быть прочитан в параллельном и последовательном режимах. Эти три байта размещены в отдельном адресном пространстве и для AT90S2313 имеют следующие значения:

1. $000: $1E - код производителя - Atmel

2. $001: $91 - 2 кБ флэш памяти

3. $002: $01 - при $01=$91 - м/сх AT90S2313

Если запрограммированы биты блокировки, байты сигнатуры в последовательном режиме не читаются.

ПОСЛЕДОВАТЕЛЬНАЯ ЗАГРУЗКА

Как память программ, так и память данных могут быть запрограммированы с использованием последовательной шины SPI, при этом вывод RESET должен быть подключен к земле. Последовательный интерфейс работает с выводами SCK, MOSI (вход) и MISO (выход). После подачи низкого уровня на RESET перепрограммированием/стиранием необходимо исполнить команду разрешения программирования.

При программировании памяти данных, во внутренний алгоритм программирования встроен цикл стирания (только при последовательном программировании), поэтому нет необходимости в выполнении команды стирания памяти. Команда стирания микросхемы переводит все ячейки памяти программ и данных в состояние $FF.

Флэш память программ и энергонезависимая память данных имеют отдельное адресное пространство: $0000 - $хххх для памяти программ и $000- $ххх для памяти данных.

При программировании необходимо подавать внешнюю тактовую частоту на вывод XTAL1 или подключить внешний тактовый генератор к выводам XTAL1 и XTAL2. Минимальные длительности низкого и высокого уровня сигнала SCK определены следующим образом:

Низкий: > 2 периодов XTAL1

Высокий: > 2 периодов XTAL1

ПОДТВЕРЖДЕНИЕ ДАННЫХ

До завершения программировании нового байта, при чтении из памяти будет читаться значение $7F. Когда микросхема будет готова для записи следующего байта, будет выдаваться записанное значение. Это используется для определения момента, когда можно записывать следующий байт. Этот способ не будет работать для байта $7F, поэтому для записи этого числа перед программированием следующего байта придется выждать по крайней мере 4mS. Поскольку после стирания ячейки всегда устанавливаются в $FF, при программировании ячейки, содержащие $FF можно пропускать. Это не применимо при перезаписи EEPROM без стирания памяти программ. В этом случае подтверждение не работает для данных $7F и $FF, для этих значений перед программированием следующего байта необходимо выждать 4mS.

АЛГОРИТМ ПОСЛЕДОВАТЕЛЬНОГО ПРОГРАММИРОВАНИЯ

Для программирования и проверки микросхемыв режиме последовательного программирования рекомендуется следующая последовательность действий:

1. Последовательность включения питания:

Подать напряжение питания между VCC и GND, при этом RESET и SCK должны быть установлены в '0'. (Если программатор не гарантирует установки SCK в '0' при подаче питания, после того как на SCK будет установлен '0', на RESET необходимо подать положительный импульс. Если кварцевый резонатор не подключен к выводам XTAL1 и XTAL2, подайте частоту от 0 до 16 MHz на вывод XTAL1.

2. Подождать 20 mS и разрешить последовательное программирование послав команду разрешения на вывод MOSI/PB5.

3. При посылке трехбайтовой последовательности разрешения программирования, второй байт последовательности ($53) будет возвращен при посылке третьего байта. В любом случае, должны быть посланы все четыре байта команды. Если число $53 не получено обратно, необходимо подать положительный импульс на SCK и повторить команду разрешения программирования. Если после 32 попыток не будет получено число $53, микросхема неисправна.

4. При подаче команды стирания стирать микросхему (всегда при программировании памяти программ), подождать 10 mS, выдать положительный импульс на RESET и повторить шаг 2.

5. Память программ и память данных программируются по одному байту выдачей адреса и данных в команде записи. Перед записью новых данных в EEPROM ячейки памяти перед записью новых данных автоматически стираются. Чтобы определить время, когда можно записывать следующий байт, используется подтверждение данных. При записи предварительно стертой микросхемы записывать ячейки содержащие $FF не обязательно. При записи в ячейку числа $7F, перед программированием следующего адреса необходимо выждать 4 mS.

6. Любую ячейку памяти можно проверить используя команду чтения, которая выдает содержимое указанной ячейки на последовательный вывод MISO/PB6.

7. По окончанию программирования вывод RESET может быть установлен в '1' для возобновления нормальной работы схемы.

6. Последовательность выключения питания (если необходимо) Установить XTAL1 в '0' (если не используется кварцевый резонатор)

Установить RESET в '1'.

Отключить питание

Возможность внутрисхемного программирования микроконтроллеров AVR по последовательному синхронному интерфейсу SPI позволяет создавать простые и недорогие программаторы. Такие программаторы называют внутрисхемными (In-System Programmer, ISP).

При выполнении лабораторного практикума для программирования микроконтроллеров используется на наш взгляд наиболее простая и доступная программа AVReAL, которая поддерживает выходной формат файла AVRStudio и некоторым недостатком которой является то, что она не входит в число утилит AVRStudio и запускается из системной оболочки. Для более подробного изучения способов и средств программирования микроконтроллеров AVR рекомендуем обратиться на http://www.atmel.com/atmel/acrobat/doc0943.pdf.

Схема переходника программирования "Altera ByteBlaster"

Данный переходник разработан фирмой Altera для программирования и конфигурирования микросхем ПЛИС через интерфейсы JTAG и Passive Serial Схему бластера несколько модифицирована - добавлены светодиоды для индикации наличия питания и режима программирования, а также выведены дополнительный сигнал на вывод 8 разъема X2 через свободный канал шинного формирователя. Эта линия используется при программной генерации сигнала XTAL1 микроконтроллера.Таблица 5.1Назначение контактов разъема X2 байт-бластера в режиме программирования AVR.

Таблица 5.1Назначение контактов разъема X2 байт-бластера в режиме программирования AVR.

X2 pin AVR signal X2 pin AVR signal
  SCK   GND
  MISO   VCC
  nRESET   ключ
  не используется   XTAL1
  MOSI   GND

Рисунок 5.1 Принципиальная схема программатора Altera ByteBlaster

При использовании Altera ByteBlaster-II используется такое же подключение, доработка для генерации XTAL не требуется.

AVReAl - описание программы

Программа компилируется в следующих вариантах

· 16-битном DOS, для работы на процессорах начиная с 286.

· 32-битном WIN32

· Также существует вариант для LINUX, но он еще недостаточно оттестирован.

Для работы WIN32 версии необходимы

W95/W98 DLportIO.DLL

NT4,W2000 DLportIO.DLL и DLportIO.sys

Применение WIN32 версии фактически имеет смысл только под NT, когда DOS-программа не имеет доступа к портам. Под W95/W98 нормально работает DOS-версия.

Программа AVReAl предназначена для программирования микроконтроллеров серии AVR фирмы Atmel в режиме ISP (in-cirсuit serial programming, последовательное программирование в схеме). Т.е. на плату устройства устанавливаются штыри, к которым впоследствии подключается шлейф от программатора (См выше). По окончании процесса программирования снимается сигнал сброса и процессор начинает выполнять зашитую в него программу.

В режиме "fbprg" незадействованные выходы данных LPT могут быть использованы как питание чипа (ключ -ap).

При использовании буферированных адаптеров (Altera ByteBlaster, Atmel STK*00) программа рассчитана на прошивку в плате с "родными" питанием и кварцем.

Игнорируются пустые строки и строки, начинающиеся с символа '#', последнее предназначено для помещения комментариев о версии непосредственно в HEX-файлы.

Проверяется верхний адрес в HEX-файле, если не умещается в опознанный чип, то никаких действий не осуществляется. Проверяется перекрытие адресов записей в HEX файле. При нахождении первого перекрытия производится выход из программы с указанием диапазона адресов перекрывающихся данных.

Для mega103 необходим расширенный формат HEX-файла (обычный не поддерживает объем больше 64Kb). Запись прочитанных данных в файл всегда производится с дополнительными записями тип '04' - Extended Linear Address Record, как не имеющим разночтений. Чтение из HEX-файла записей типа '02' Extended Segment Address Record производится в соответствии с формированием их в AVRASM by Atmel (без предусмотренного документацией Intel сворачивания адреса смещения по модулю 64Kb).

Командная строкавызова программы прошивки имеет вид:

avreal [ключи] [[-c] имя_файла_кода [[-d] имя_файла_данных]]

или

avreal [ключи] -d имя_файла_данных (когда код программы остаётся неизменным)

Если есть только имена файлов, но нет относящихся к ним ключей (-r -w -v), то файлы игнорируются. Подробнее про работу с файлами и ключами -c, -d рассказано после описания остальных ключей.

Ключи

-? (-h) - выдать ключи и перечень поддерживаемых кристаллов. Команда avreal +name -? (+name должен быть задан раньше ключа -?) выдает список fuses, поддерживаемых в режиме ISP для чипа name. Fuses (фузы) – внутренние программные ключи данного типа микроконтроллера (чипа). Фузы в основном поддерживают чипы класса mega.

+имя - установить тип кристалла, <имя> допускается задавать как с префиксом 'AT', так и без него, в том виде, в котором имена выдаются по -h. Регистр букв не важен. Например, at90s1200, attiny22l, atmega103 либо 90s1200, tiny22l, mega103. Обязательный ключ, никаких действий по умолчанию не производится. Если задан только чип (больше нет ни ключей, ни имен файлов), то чип будет сброшен и выдана информация о нем (наличие, если есть доступные по ISP fuses - их состояние).

-p<число1>[,<число2>]

"число1", шестнадцатеричное установливает порт 1,2,3 - номер LPT порта, >0x100 - базовый адрес порта если задан номер - адрес из BIOS MEMORY (не работает для win32 и linux версий, где принято, что LPT1/2/3 это 278/378/3BC). Адрес и в виде -p3BC, и в виде -p0x3BC воспринимается как HEX число. если задан адрес – по запросу по умолчанию -p2 (LPT2)

"число2", с плавающей точкой, необязательный параметр если указан, то не производится настройку на скорость порта, время обращения принимается равным <число2> микросекунд. В win32 версии настройка не производится никогда, если не указано - считается, что обращение к порту не быстрее 1мкс

-a <буква>

группа ключей для выбора типа адаптера

-ab -работа через Altera ByteBlaster (включая ByteBlasterMV, ByteBlaster-II)

-as -работа через адаптер Atmel STK*00

-aa -автоматический выбор ByteBlaster/STK

-ax -XILINX parallel download cable

- az -пытаться переводить выходы LPT в Z-состояние для "отключения" программатора от схемы ("byte-blaster для ленивых", работает в "FBPRG" режиме)

-ar -инверсия полярности сброса (например, для подачи его через резистор в базу присутствующего в схеме транзистора)

-ai# -установить время неактивного Reset после стирания равным # mS. Необходимо устанавливать большим времени задержки снятия сброса присутствующим в схеме супервизором.

-ap - подавать питание чипа через свободные выходы данных LPT (несовместимо с -ab,-as) Рекомендуется поближе к чипу установить блокировочный конденсатор по питанию.

-o<число>

Задать частоту установленного кварца для настройки скорости SPI. Частота допускается с плавающей точкой и единицами измерения частоты Hz, kHz, MHz, например,

-o3.686MHZ

-o14745600hz

При отсутствии единиц измерения для совместимости с предыдущими версиями считается, что частота в килогерцах. При отсутствии ключа частота по умолчанию 800 (0.8MHz)

-o0 означает необходимость генерации XTAL из программы. У STK*00 для генерации XTAL используется линия LED

-n[<число>]

Использовать последние 2 байта кода как счетчик стираний. Если указано <число>, то для записи счетчика используется оно, а не инкрементированное прочитанное значение. При -ewn если последние 2 байта заняты кодом то -n игнорируется

-e[-]

Стереть чип; '-' задает сохранение содержимого EEPROM способом прочесть/стереть/записать. Для кристаллов, имеющих fuse EESAVE, по -e- также применяется этот способ. Если же хочется пользоваться имеющимся fuse EESAVE, следует установить его (-feesv=0) отдельным запуском avreal и применять обычную форму ключа -e.

-1,-2,-3,-4,-5

Увеличить задержки на программирование в 1.5, 2, 3, 4, 5 раз соответственно (для программирования при пониженном напряжении)

-b

Проверить на чистоту

-r

Прочитать из чипа в файл[ы]

-w[+][p]

Записать в чип файлы кода/данных, заданные в командной строке fuses. ' + ' - если чип в этом задании не стирался и задана запись в EEPROM, то прописать FF в ячейки EEPROM, не заданные в HEX. Верификация этих ячеек на значение FF будет производится даже, если был задан просто -v, а не -v+. Автоматическое стирание чипа не производится по -w, используйте -ew для нестертого чипа. ' p ' - использовать поллинг для определения конца записи. Если в течении времени, равного восьмикратному номинальному времени записи поллинг не даёт положительного результата - выдаётся сообщение об ошибке и завершение программы.

-v[+]

Верифицировать (только то, что есть в hex) дополнительный '+' вызывает проверку на FF "свободных" с точки зрения HEX-файла позиций

-l[+]#

Установить уровень защиты # = 1 or 2 при наличии ' + ' lock биты прошиваются до зашивки fuses (необходимо для включения BODEN и залочки 90s4433 в одном цикле подачи питания)

-f<fuselist>

список fuses для тех чипов, в которых они шьются по ISP. <fuselist> выглядит как fusename=value, fusename=value, bytename=value... где value - ШЕСТНАДЦАТЕРИЧНОЕ значение без префиксов и суффиксов. Для однобитовых fuse добавлены значения ON и OFF (прошить и стереть, 0 и 1 соответственно). Начиная с версии 1.23 НЕ ПОДДЕРЖИВАЮТСЯ однобуквенные синонимы для fuses. При наличии "пересекающихся" name=val выдается сообщение об ошибке. Перечень fusename для конкретного чипа с диапазоном value и комментарием можно получить при помощи - avreal +chipname -?

Для сокращения строки возможно задание полного байта fuses при помощи специальных имен bytename, представляющие собой названия байтов по документации с лидирующим подчерком: _low,_high,_ext,_lock Нереализованные в данном байте биты рекомендуется устанавливать в '1'. Имя _lock относится к байту lock-битов и BLB, однако на состояние lock-битов не влияет. Для блокировки кристалла по прежнему надо использовать ключ -l. Допускается комбинация отдельных fuse и байтов, однако они при этом не должны пересекаться, т.е. каждый байт fuses должен быть задан либо только через специальное имя, либо только через имена отдельных fuse. Например,

допустимо: -f_low=C3,_high=F4,blb2=1

не допустимо: -f_lock=F7,blb2=1

Если работа с fuses по SPI поддерживается, то их состояние сообщается при любой операции с чипом, задание ключа -f необязательно. Fuses программируются или верифицируются указанием ключа -w или -v совместно с ключом -f (в том числе в одном сеансе с программированием/верификацией кода или данных). Неупомянутые fuse остаются неизменными (кроме битов защиты boot-блока BLB, так как они могут быть стерты по -E независимо от ключа -F). Группа BLB относится скорее к lock-битам, записать 1 поверх уже запрограммированной в 0 fuse невозможно. Если запрошена такая операция и чип не стирался, то программа завершает работу с соответствующим предупреждением. AVReAl обеспечивает также расширенную поддержку osccal

Для tiny12, tiny15 поддерживается программирование SPIEN и RSTDSBL. Будьте осторожны, SPIEN по умолчанию запрограммировано, ключ -fspien=1 (-fspien=off) сотрет SPIEN и запретит дальнейшее низковольтное программирование. То же произойдет и при программировании RSTDSBL (-frstdsbl=0 или -frstdsbl=on).

-%

Выдавать по ходу программирования дополнительную информацию (производимые действия и ответы чипа). Внутри.bat файлов следует писать -%%.

-!

Делать, что указано ранее, даже если чип не распознан (или распознан "не так", как задано в +<имя чипа>) а также если не обнаружен указанный в командной строке адаптер. Попытка стереть нераспознанный (возможно просто закрытый) чип при наличии команды стирания производится и без -! после чего проводится повторное детектирование чипа.

Возможны осмысленные комбинации:

-v – w записать, проверить

-e – w -v+ стереть с сохранением EEPROM, записать, верифицировать с проверкой на чистоту свободных участков.

-b –w проверить на чистоту, если грязная - выход, иначе писать

После ключа -d идет имя файла данных, после -c имя кода, в этом случае порядок файлов не важен. Пробел между ключами -c/-d и именами не обязателен, т.е. допустимо как -cfoo.hex так и -c foo.hex. Если дано два имени файла без ключей -c и -d, то первое имя - файл кода, второе - файл данных (EEPROM). Если имя одно и нет ключей -c/-d, то этот файл содержит данные для кода и, если он содержит информацию после верхнего адреса FLASH для заданного кристалла, то эта информация используется для программирования EEPROM данных. Т.е. если, например, для 90s2313 hex-файл содержал данные в адресах от 0x800 до 0x87F, то эти данные будут записаны в EEPROM по адресам 0x00-0x7F.

Для занесения в код и/или данные специальных параметров применяются особые формы ключей -c и -d следующего вида:

-d*name=offset,ext - как байты в EEPROM данных

-c*name=offset,ext - как байты во FLASH кода (под команду LPM)

-с?name=offset,ext - как часть последовательных команд LDI начиная с offset где:

name - имя специального параметра, может состоять из собственно имени и уточняющего числа.

offset - адрес байта, начиная с которого производится запись специального значения, шестнадцатеричное значение без префиксов и суффиксов. Используется адрес байта, а не слова, в том числе и при обращении ко flash кода.

ext - дополнительный аргумент

Байты, необходимые для записи, должны существовать в исходном HEX-файле. В качестве специальных параметров могут выступать: Значение калибровочного байта RC-генератора В качестве имени используется слово osccal с номером калибровочного байта. При использовании нулевого байта OSCCAL указание номера 0 не обязательно. Дополнительный аргумент ext - корректирующее значение к прочитанной из кристалла величине OSCCAL (может быть необходимо при напряжении питания, отличающемся от напряжения калибровки на производстве). При выходе корректированного значения за пределы [0..255] происходит ограничение значения и выдача предупреждения.

Примеры:

1. Необходимо записать значение 3-го (считая с 0) байта osccal как байт по адресу 0x3F в EEPROM данных. Используется ключ

-d*osccal3=3F

2. Необходимо записать значение 0-го байта osccal, уменьшенное на 3, как часть команды LDI.

public osccal_ldi

...

osccal_ldi:

ldi R16,0xFF

out OSCCAL,R16

...

Далее смотрим по MAP-файлу значение osccal_ldi, например оно получилось 0x120. Команда примет вид:

avreal +tiny12 -ewv -c foo.hex -c?osccal=120,-3

Запись серийного номера прибора предназначена для присвоения последовательных серийных номеров программируемым изделиям. В качестве имени параметра используется слово serno с числом - длиной номера в байтах от 1 до 4. Серийный номер записывается в двоичном виде, младший байт записывается первым. Дополнительный аргумент ext - имя текстового файла, в котором записан номер в десятичном виде. После успешной записи в кристалл номер увеличивается на 1 и записывается назад в файл. Файл при этом переписывается полностью, если после серийного номера в нём была другая информация - она теряется. При сбое верификации при команде -w -v номер не меняется. Если в командной строке задана только верификация (без записи), то значение серийного номера из файла используется, но не инкрементируется, файл остаётся без изменений.

Примеры.

1. Необходимо записать значение 2-байтного серийного номера как 2 байта начиная с адреса 0x12 в EEPROM данных. Сам номер записан в файле serno.txt Используется ключ

-d*serno2=12,serno.txt

2. Необходимо записать значение 3-байтового серийного номера как часть команд LDI. Номер записан в файле proj.serno

public serno_load

...

serno_load:

ldi R16,0xFF; младший байт

ldi R17,0xFF; средний байт

ldi R18,0xFF; старший байт

Пусть значение serno_load по map-файлу вышло 0x120. Используется ключ:

-c?serno3=120,proj.serno

Порядок ключей не важен, выполнение производится в порядке E B W V L. Если проверка (B, V) дала отрицательный результат, то дальнейшая работа не производится. Т.е. -e -b -w -v -l2 означает: стереть, если стерлась - писать, если верифицировалась - закрыть.

Возвращаемые КОДЫ ОШИБОК

0 – программирование выполнено без ошибок

10 - not blank при -b, несовпадение при -v[+]

20 - Невозможность осуществить запрошенную операцию HEX кода или объём данных слишком большой для распознанного чипа. Запрошенное для записи состояние BLB нельзя записать, не очистив чип (при этом команды стирания не было).

30 - не распознан конкретный чип (бывает при защищенном чипе, поэтому при -e все равно делается попытка стереть и если после этого тоже не распознан - отказ)

40 - не подключен шнур программирования ("Altera ByteBlaster")илине удалось войти в программирование по алгортиму для At90s

50 - ошибка при чтении (не найден, "не те" символы, не совпала контрольная сумма, ошибка чтения,...) или записи (есть защищенный от перезаписи с таким же именем участок,...) HEX-файла.

60 - недостаточно памяти для списков кода/данных

70 - недопустимая командная строка (в т.ч. задан номер отсутствующего LPT)

Программирование может осуществляться из командной строки или командного файла (*.bat). Ниже приведен текст командного файла для прошивки микроконтроллера AT90S2313.

avreal +90S2313 -p1 -ab -o8.192MHz -e -b -w -v -cproba.hex

rem | | | | | | | | | |___ hex файл proba.hex

rem | | | | | | | | |__ Верификация

rem | | | | | | | |__ Запись

rem | | | | | | |__ Проверить на чистоту

rem | | | | | |__ Очистить

rem | | | | |__ Тактовая частота

rem | | | |__ Программатор Altera ByteBlaster

rem | | |__ Порт LPT 1

rem | |__ Тип контроллера

rem |__ Имя исполняемой прграммы


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: