30.8. Защита энергонезависимой памяти
Для защиты Flash-памяти и EEPROM от записи и/или чтения предусмотрены Lock-биты, позволяющие ограничить доступ для внешних программаторов и прикладной программы. Более детально о доступных настройках Lock-бит и их использованию см. в 4.15.12 "Описание регистров контроллера энергонезависимой памяти".
30.9. Предотвращение нарушения данных
Когда напряжение VCC становится меньше минимального рабочего напряжения МК, существует опасность нарушения чтения или записи Flash-памяти, так как напряжение питания может оказаться слишком малым для надлежащей работы ЦПУ и Flash-памяти.
30.9.1. Сбои во время записи
Для гарантирования корректности уровня напряжения на фазе завершения последовательности записи во Flash-память, сразу после её запуска автоматически включаются в работу встроенные супервизор питания (BOD) и детектор кратковременных просадок напряжения. Если любой из этих блоков генерирует сигнал сброса, последовательность программирования отменяется. В таком случае, если сбой в питании привел к полной отмене программирования или к его частичному выполнению, после восстановления корректного уровня напряжения питания программирование NVM необходимо начать заново.
30.9.2. Сбои во время чтения
Чтение NVM может дать некорректный результат, если напряжение питания настолько мало, что ЦПУ неправильно интерпретирует инструкции. Чтобы избежать этого, необходимо включить в работу супервизор питания (BOD).
30.10. Проверка CRC
При необходимости может быть включена в работу логика автоматической проверки CRC Flash-памяти программ. Эта функция доступна как при внешнем программировании, так и при самопрограммировании. Проверка CRC может выполняться в пределах сектора прикладной программы, загрузочного сектора или заданного диапазона адресов Flash-памяти.
Сразу после запуска логики проверки CRC, ЦПУ приостанавливает работу на время вычисления CRC, а вычисленная контрольная сумма будет доступна в регистре данных NVM. На вычисление CRC для каждого слова из заданного диапазона адресов затрачивается один цикл синхронизации ЦПУ.
Для проверки CRC используется полином x24 + 4x3 + 3x +1.
30.11. Самопрограммирование под управлением программы загрузчика
Чтение и запись EEPROM и Flash-памяти можно выполнять программно. Данная возможность называется самопрограммированием. Программа загрузчика (хранится в загрузочном секторе Flash-памяти) имеет возможность чтения и записи Flash-памяти программ, сигнатурного кода пользователя и EEPROM, а также записи Lock-бит, но только в направлении усиления защиты. Код программы, хранящийся в секторе прикладной программы, имеет возможность чтения Flash-памяти, сигнатурного кода пользователя, калибровочных данных и Fuse-бит, а также чтения и записи EEPROM.
30.11.1. Программирование Flash-памяти
Программа загрузчика для загрузки и обновления коды программы самим микроконтроллером использует механизм самопрограммирования с истинной поддержкой чтения во время записи. Данная возможность позволяет реализовать функцию гибкого обновления прикладной программы под управлением программы загрузчика, расположенной в загрузочном секторе Flash-памяти. Программа загрузчика для передачи кода программы может использовать любой из доступных интерфейсов. Она имеет возможности записи любого сектора Flash-памяти, в т.ч. загрузочного сектора. Это означает, что программа загрузчика способна обновить или стереть сама себя, если в ней более нет потребности.
30.11.1.1. Сектор прикладной программы и загрузочный сектор
При использовании самопрограммирования необходимо учитывать, что сектор прикладной программы и загрузочный сектор имеют некоторые отличия. Сектор прикладной программы относится к типу RWW, т.е. поддерживает чтение во время записи, а загрузочный сектор относится к типу NRWW. т.е. не поддерживает чтение во время записи. Здесь под чтением во время записи понимается возможность чтения именно загрузочного сектора, т.к. только из него можно инициировать самопрограммирование секторов Flash-памяти. Сможет ЦПУ исполнять код программы или приостановит свою работу в процессе обновления программы загрузчиком, зависит от адреса Flash-памяти, по которому выполняется программирование.
- Во время стирания или записи страницы, расположенной внутри сектора прикладной программы (RWW), возможность чтения загрузочного сектора (NRWW) сохраняется. Это означает, что ЦПУ может работать и исполнять код программы из загрузочного сектора (NRWW).
- Во время стирания или записи страницы, расположенной внутри загрузочного сектора (NRWW), ЦПУ приостанавливается на время выполнения всей операции и код программы не может исполняться.
Сектор сигнатурного кода пользователя относится к типу NRWW, таким образом, его стирание или запись имеет особенности, идентичные загрузочному сектору.
При написании программы необходимо исключить доступ к сектору прикладной программы в процессе выполняющегося программирования. Это позволит избежать приостановки ЦПУ. Программа пользователя не может считывать данные, расположенные в секторе прикладной программы, в процессе работы программы загрузчика.
Таблица 30.1. Обзор возможностей секторов типа RWW и NRWW
Сектор, адресованный Z-указателем во время программирования |
Сектор, в котором сохраняется возможность чтения в процессе программирования |
Состояние ЦПУ |
Поддержка чтения во время записи |
Сектор прикладной программы (RWW) |
Загрузочный сектор (NRWW) |
Работает |
Есть |
Загрузочный сектор (NRWW) |
Нет |
Остановлен |
Нет |
Сектор сигнатурного кода пользователя (NRWW) |
Нет |
Остановлен |
Нет |
Рисунок 30.1. Сравнение секторов типов RWW и NRWW
30.11.1.2. Адресация Flash-памяти
Адрес Flash-памяти как при чтении, так и при записи, задается через Z-указатель. Он образован двумя регистрами регистрового файла, ZL и ZH. У МК с объемом Flash-памяти более 64 кбайт указатель адреса дополняется регистром RAMPZ. Более детально о Z-указателе см. в 3.9.1 "X-, Y- и Z- регистры".
Поскольку доступ к Flash-памяти выполняется путем постраничной записи Z-указатель можно разделить на два битовых поля. Младшие биты указателя адресуют слова в пределах страницы, а старшие биты адресуют страницы в пределах Flash-памяти. Это показано на рисунке 30.2. Адрес слова в странице (FWORD) представлен битами [WORDMSB:1] Z-указателя. Оставшиеся биты [PAGEMSB:WORDMSB+1] Z-указателя хранят адрес страницы Flash-памяти (FPAGE). Совместно FWORD и FPAGE задают абсолютный адрес слова Flash-памяти.
При выполнении одной операции чтения Flash-памяти (ELPM и LMP) возвращается один байт. Является этот байт младшим или старшим байтом слова зависит от значения младшего бита (бит 0) Z-указателя. Если он равен нулю, считывается младший байт, а если единице - старший байт.
Размер битовых полей FWORD и FPAGE зависит от размера страницы и flash-памяти микроконтроллера. Узнать эти значения можно в документации на микроконтроллер.
Как только запускается программирование, выполняется фиксация адреса, после чего можно изменить значение Z-указателя и использовать его по другому назначению.
Рисунок 30.2. Адресация Flash-памяти при самопрограммировании
30.11.2. NVM-команды Flash-памяти
В таблице 30.1 представлены NVM-команды, которые можно использовать для доступа к Flash-памяти программ, сигнатурному коду и калибровочным данным. Когда используется самопрограммирование, команды с запуском по действию исполняются после установки бита CMDEX в регистре CTRLA NVM-контроллера. Команды с запуском по чтению исполняются, когда ЦПУ исполняет инструкцию (E)LPM. Наконец, команды с запуском по записи исполняются, когда ЦПУ выполняет инструкцию SPM (SPM).
В столбце "Защита от изменения" указывается, защищен запуск инструкции механизмом защиты от изменения конфигурации (CCP) или нет. Если запуск защищен, то необходимо придерживаться определенной и строго привязанной ко времени последовательности. Более детально об этом см. в 3.14.1 "CCP - регистр защиты от изменения конфигурации". В двух последних столбцах приведены данные о том, используется ли для адресации указатель адреса и какой регистр выступает в роли источника/назначения.
Алгоритм работы каждой команды более детально рассматривается в подразделах 30.11.1.1…30.11.2.14.
Таблица 30.2. Команды самопрограммирования Flash-памяти
CMD[6:0] |
Групповая конфигурация |
Описание |
Запуск |
Останов ЦПУ |
Занятость NVM |
Защита от изменения |
Указатель адреса |
Регистр данных |
0x00 |
NO_OPERATION |
Нет операции/чтение Flash-памяти |
-/(E)LPM |
-/Нет |
Нет |
-/Нет |
-/Z-указатель |
-/Rd |
Страничный буфер Flash-памяти |
0x23 |
LOAD_FLASH_BUFFER |
Загрузка страничного буфера Flash-памяти |
SPM |
Нет |
Нет |
Нет |
Z-указатель |
R1:R0 |
0x26 |
ERASE_FLASH_BUFFER |
Стирание страничного буфера Flash-памяти |
CMDEX |
Нет |
Занят |
Есть |
Z-указатель |
- |
Flash-память |
0x2B |
ERASE_FLASH_PAGE |
Стирание страницы Flash-памяти |
SPM |
Нет/Есть(2) |
Занят |
Есть |
Z-указатель |
- |
0x2E |
WRITE_FLASH_PAGE |
Запись страницы Flash-памяти |
SPM |
Нет/Есть(2) |
Занят |
Есть |
Z-указатель |
- |
0x2F |
ERASE_WRITE_FLASH_PAGE |
Стирание и запись страницы Flash-памяти |
SPM |
Нет/Есть(2) |
Занят |
Есть |
Z-указатель |
- |
0x3A |
FLASH_RANGE_CRC(3) |
Вычисление CRC для диапазона Flash-памяти |
CMDEX |
Есть |
Занят |
Есть |
DATA/ADDR(1) |
DATA |
Сектор прикладной программы |
0x20 |
ERASE_APP |
Стирание сектора прикладной программы |
SPM |
Есть |
Занят |
Есть |
Z-указатель |
- |
0x22 |
ERASE_APP_PAGE |
Стирание страницы сектора прикладной программы |
SPM |
Нет |
Занят |
Есть |
Z-указатель |
- |
0x24 |
WRITE_APP_PAGE |
Запись страницы сектора прикладной программы |
SPM |
Нет |
Занят |
Есть |
Z-указатель |
- |
0x25 |
ERASE_WRITE_FLASH_PAGE |
Стирание и запись страницы сектора прикладной программы |
SPM |
Нет |
Занят |
Есть |
Z-указатель |
- |
0x38 |
APP_CRC |
Вычисление CRC сектора прикладной программы |
CMDEX |
Есть |
Занят |
Есть |
- |
DATA |
Загрузочный сектор |
0x2A |
ERASE_BOOT_PAGE |
Стирание страницы загрузочного сектора |
SPM |
Есть |
Занят |
Есть |
Z-указатель |
- |
0x2C |
WRITE_BOOT_PAGE |
Запись страницы загрузочного сектора |
SPM |
Есть |
Занят |
Есть |
Z-указатель |
- |
0x2D |
ERASE_WRITE_BOOT_PAGE |
Стирание и запись страницы загрузочного сектора |
SPM |
Есть |
Занят |
Есть |
Z-указатель |
- |
0x39 |
BOOT_CRC |
Вычисление CRC загрузочного сектора |
CMDEX |
Есть |
Занят |
Есть |
- |
DATA |
Сигнатурный код пользователя |
0x03 |
READ_USER_SIG_ROW |
Чтение сигнатурного кода пользователя |
LPM |
Нет |
Нет |
Нет |
Z-указатель |
Rd |
0x18 |
ERASE_USER_SIG_ROW |
Стирание сигнатурного кода пользователя |
SPM |
Есть |
Есть |
Есть |
- |
- |
0x1A |
WRITE_USER_SIG_ROW |
Запись сигнатурного кода пользователя |
SPM |
Есть |
Есть |
Есть |
- |
- |
Калибровочные данные |
0x02 |
READ_CALIB_ROW |
Чтение калибровочных данных |
LPM |
Нет |
Нет |
Нет |
Z-указатель |
Rd |
Прим.:
- Команда вычисления CRC для диапазона Flash-памяти использует побайтную адресацию Flash-памяти.
- В зависимости от того, какой сектор flash-памяти адресуется (прикладной программы или загрузочный).
- Данная команда связана с Lock-битами и требует, чтобы биты Boot Lock были незапрограммированными.
30.11.2.1. Чтение Flash-памяти
Инструкция (E)LPM предназначена для чтения одного байта из Flash-памяти.
- Запишите в Z-указатель адрес байта, подлежащего чтению.
- Запишите код команды NO_OPERATION в регистр команды энергонезависимой памяти (NVM CMD).
- Выполните инструкцию LPM.
Загрузка регистра назначения будет выполнена при выполнении инструкции LPM.
30.11.2.2. Стирание страничного буфера Flash-памяти
Данная команда предназначена для стирания страничного буфера Flash-памяти.
- Запишите в NVM CMD команду стирания страничного буфера Flash-памяти.
- Установите бит исполнения команды (NVMEX) в регистре А управления энергонезависимой памятью (NVM CTRLA) с соблюдением привязанной ко времени последовательности CCP.
Флаг занятости NVM (BUSY) в регистре статуса NVM (NVM STATUS) будет установлен до тех пор, пока не будет стерт страничный буфер.
30.11.2.3. Загрузка страничного буфера Flash-памяти
Данная команда предназначена для загрузки страничного буфера Flash-памяти.
- Запишите в регистр NVM CMD команду загрузки страничного буфера Flash-памяти.
- Запишите в Z-указатель адрес слова, подлежащего записи.
- Запишите в регистры R1:R0 слово данных, подлежащее записи в буфер.
- Выполните инструкцию SPM. При выполнении операции загрузки страничного буфера инструкция SPM является незащищенной.
Повторяйте шаги 2…4 вплоть до завершения загрузки страничного буфера Flash-памяти. В незагруженных ячейках хранится значение 0xFFFF, для которого не определена инструкция ЦПУ AVR.
30.11.2.4. Стирание страницы Flash-памяти
Данная команда предназначена для стирания одной страницы Flash-памяти.
- Запишите в Z-указатель адрес подлежащей стиранию страницы flash-памяти. Адрес страницы должен быть записан в битовое поле PCPAGE. Прочие биты Z-указателя игнорируются при выполнении этой операции.
- Запишите в регистр NVM CMD команду стирания страницы Flash-памяти.
- Выполните инструкцию SPM с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS остается равным единице до тех пор, пока не завершится операция стирания. Флаг занятости сектора Flash-памяти (FBUSY) удерживается равным единице все время, пока Flash-память занята, при этом, доступ к сектору прикладной программы невозможен.
30.11.2.5. Запись страницы Flash-памяти
Данная команда предназначена для записи содержимого страничного буфера Flash-памяти в одну страницу Flash-памяти.
- Запишите в Z-указатель адрес подлежащей записи страницы flash-памяти. Адрес страницы должен быть записан в битовое поле PCPAGE. Прочие биты Z-указателя игнорируются при выполнении этой операции.
- Запишите в регистр NVM CMD команду записи страницы Flash-памяти.
- Выполните защищенную инструкцию SPM с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS остается равным единице до тех пор, пока не завершится операция записи. Флаг занятости сектора Flash-памяти (FBUSY) удерживается равным единице все время, пока Flash-память занята, при этом, доступ к сектору прикладной программы невозможен.
30.11.2.6. Вычисление CRC для диапазона Flash-памяти
Данная команда предназначена для проверки содержимого Flash-памяти в пределах заданного диапазона после завершения самопрограммирования.
- Запишите в регистр NVM CMD команду вычисления CRC для диапазона Flash-памяти.
- Запишите адрес начального байта в регистр адреса NVM (NVM ADDR).
- Запишите адрес последнего байта в регистр данных NVM (NVM DATA).
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
На время выполнения этой операции флаг BUSY в регистре NVM STATUS удерживается равным единице, а ЦПУ приостанавливает свою работу.
Результат выполнения операции (контрольная сумма CRC) будет доступен в регистре данных NVM DATA.
Команду проверки CRC для диапазона Flash-памяти можно использовать, только если биты Boot Lock не запрограммированы (т.е. блокировка доступа отключена).
Если биты Boot Lock той области, в которой выполняется проверка СRC, запрограммированы, выполнение команды отменяется.
30.11.2.7. Стирание сектора прикладной программы
Данная команда предназначена для стирания всего сектора прикладной программы.
- Запишите в Z-указатель любой адрес, принадлежащей сектору прикладной программы.
- Запишите в регистр NVM CMD команду стирания сектора прикладной программы.
- Выполните инструкцию SPM с использованием привязанной ко времени последовательности CCP.
На время выполнения операции флаг BUSY регистра STATUS становится равным единице, а ЦПУ приостанавливает свою работу.
30.11.2.8. Стирание страницы сектора прикладной программы/загрузочного сектора
Данные команды предназначены для стирания одной страницы сектора прикладной программы или загрузочного сектора.
- Запишите в Z-указатель адрес подлежащей стиранию страницы. Адрес страницы должен быть записан в битовое поле ZPAGE. Прочие биты Z-указателя при выполнении данной операции игнорируются.
- Запишите в регистр NVM CMD команду стирания страницы сектора прикладной программы/загрузочного сектора.
- Выполните инструкцию SPM с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS остается равным единице до тех пор, пока не завершится операция стирания. Флаг занятости сектора Flash-памяти (FBUSY) удерживается равным единице все время, пока Flash-память занята, при этом, доступ к сектору прикладной программы невозможен.
30.11.2.9. Запись страницы сектора прикладной программы/загрузочного сектора
Данные команды предназначены для записи страничного буфера Flash-памяти в одну страницу сектора прикладной программы или загрузочного сектора.
- Запишите в Z-указатель адрес подлежащей записи страницы. Адрес страницы должен быть записан в битовое поле PCPAGE. Прочие биты Z-указателя при выполнении данной операции игнорируются.
- Запишите в регистр NVM CMD команду записи страницы сектора прикладной программы/загрузочного сектора.
- Выполните инструкцию SPM с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS остается равным единице до тех пор, пока не завершится операция стирания. Флаг занятости сектора Flash-памяти (FBUSY) удерживается равным единице все время, пока Flash-память занята, при этом, доступ к сектору прикладной программы невозможен.
Если в Z-указатель будет записан некорректный адрес страницы, выполнение NVM-команды будет отменено. Команда стирания страницы сектора прикладной программы выполняется только в случае, если Z-указатель адресуется на сектор прикладной программы. Аналогичным образом, для выполнения команды стирания страницы загрузочного сектора необходимо, чтобы Z-указатель адресовал на загрузочный сектор.
30.11.2.10. Стирание и запись страницы сектора прикладной программы/загрузочного сектора
Данные команды предназначены для стирания одной страницы flash-памяти, а затем записи страничного буфера Flash-памяти в эту же страницу сектора прикладной программы или загрузочного сектора.
- Запишите в Z-указатель адрес подлежащей записи страницы. Адрес страницы должен быть записан в битовое поле PCPAGE. Прочие биты Z-указателя при выполнении данной операции игнорируются.
- Запишите в регистр NVM CMD команду стирания и записи страницы сектора прикладной программы/загрузочного сектора.
- Выполните инструкцию SPM с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS остается установленным вплоть до завершения операции. Занятость Flash-памяти сигнализируется установкой флага FBUSY, при этом, теряется возможность доступа к сектору прикладной программы.
Если в Z-указатель будет записан некорректный адрес страницы, выполнение команды NVM будет отменено. Команда стирания и записи страницы сектора прикладной программы выполняется только в случае, если Z-указатель адресуется на сектор прикладной программы. Аналогичным образом, для выполнения команды стирания и записи страницы загрузочного сектора необходимо, чтобы Z-указатель адресовал на загрузочный сектор.
30.11.2.11. Вычисление CRC в секторе прикладной программы/загрузочном секторе
Данные команды предназначены для проверки содержимого сектора прикладной программы и загрузочного сектора после самопрограммирования.
- Запишите в регистр NVM CMD команду проверки CRC в секторе прикладной программы/загрузочном секторе.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
На время вычисления CRC устанавливается флаг BUSY в регистре NVM STATUS, а работа ЦПУ приостанавливается. Результат вычисления контрольной суммы CRC будет доступен в регистрах данных NVM.
30.11.2.12. Стирание сигнатурного кода пользователя
Данная команда предназначена для стирания сигнатурного кода пользователя.
- Запишите в регистр NVM CMD команду стирания сигнатурного кода пользователя.
- Выполните инструкцию SPM с использованием привязанной ко времени последовательности CCP.
На время выполнения операции устанавливается флаг BUSY в регистре NVM STATUS, а работа ЦПУ приостанавливается. Сектор сигнатурного кода пользователя относится к типу NRWW.
30.11.2.13. Запись сигнатурного кода пользователя
Данная команда предназначена для записи содержимого страничного буфера Flash-памяти в сектор сигнатурного кода пользователя.
- Запишите в регистр NVM CMD команду записи сигнатурного кода пользователя.
- Выполните инструкцию SPM с использованием привязанной ко времени последовательности CCP.
На время выполнения операции устанавливается флаг BUSY в регистре NVM STATUS, а работа ЦПУ приостанавливается. По завершении записи инициируется очистка страничного буфера Flash-памяти, при этом, остановка ЦПУ не выполняется.
30.11.2.14. Чтение сигнатурного кода пользователя/калибровочных данных
Данные команды предназначены для чтения одного байта из сектора сигнатурного кода пользователя или сектора калибровочных данных.
- Запишите в Z-указатель адрес подлежащего чтению байта.
- Запишите в регистр NVM CMD команду чтения сигнатурного кода пользователя/калибровочных данных.
- Выполните инструкцию LPM.
Загрузка регистра-получателя выполняется в процессе выполнения инструкции LPM.
30.11.3. NVM-команды доступа к Fuse- и Lock-битам
В таблице 30.3 представлены NVM-команды Flash-памяти, предоставляющие доступ к Fuse- и Lock-битам. Все эти команды являются командами с запуском по действию. Для их выполнения необходимо установить бит CMDEX в регистре NVM CTRLA.
В столбце "Защита от изменения" указывается, защищен запуск инструкции механизмом защиты от изменения конфигурации (CCP) или нет. В двух последних столбцах приведены данные об используемых указателе адреса и регистре данных.
Алгоритм работы каждой команды более детально рассматривается в подразделах 30.11.3.1 и 30.11.3.2.
Таблица 30.3. Команды доступа к Fuse- и Lock-битам
CMD[6:0] |
Групповая конфигурация |
Описание |
Запуск |
Останов ЦПУ |
Занятость NVM |
Защита от изменения |
Указатель адреса |
Регистр данных |
0x00 |
NO_OPERATION |
Нет операции |
- |
- |
- |
- |
- |
- |
Fuse- и Lock-биты |
0x07 |
READ_FUSES |
Чтение Fuse-бит |
CMDEX |
Нет |
Занят |
Нет |
ADDR |
DATA |
0x08 |
WRITE_LOCK_BITS |
Запись Lock-бит |
CMDEX |
Нет |
Занят |
Есть |
ADDR |
- |
30.11.3.1. Запись Lock-бит
Данная команда предназначена для программирования бит Boot Lock, но только в направлении усиления защиты.
- Запишите в регистр NVM DATA0 новое значение Lock-бит.
- Запишите в регистр NVM CMD команду записи Lock-бит.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
В процессе выполнения команды, флаг BUSY регистра NVM STATUS удерживается в установленном состоянии. ЦПУ приостанавливает работу до завершения исполнения команды.
Данную команду можно выполнять как из загрузочного сектора, так и из сектора прикладной программы.
По завершении записи Lock-бит происходит автоматическое стирание страничного буфера EEPROM и Flash-памяти.
30.11.3.2. Чтение Fuse-бит
Данная команда предназначена для чтения из программы Fuse-бит.
- Запишите в регистры NVM ADDR адрес, подлежащего чтению байта с fuse-битами.
- Запишите в регистр NVM CMD команду чтения Fuse-бит.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Результат выполнения операции будет доступен в регистре NVM DATA0. На время выполнения команды ЦПУ приостанавливает работу.
30.11.4.Программирование EEPROM
Команды чтения и записи EEPROM можно выполнять из любой части Flash-памяти. Доступ к EEPROM выполняется побайтно или постранично. Это означает, что за один подход можно выполнить запись в EEPROM либо одного байта, либо одной страницы. При чтении EEPROM возвращается один байт.
30.11.4.1. Адресация EEPROM
Доступ к EEPROM, также как и к Flash-памяти программ, осуществляется через NVM-контроллер, который расположен в пространстве памяти ввода-вывода. Альтернативно, доступ к EEPROM можно выполнять аналогично SRAM через пространство памяти данных.
Когда доступ к EEPROM выполняется посредством NVM-контроллера, для адресации используется регистр адреса NVM (ADDR), а для чтения/записи данных - регистр данных NVM (DATA).
При программировании страницы EEPROM, регистр ADDR можно представить в виде двух битовых полей. Младшие биты адреса задают адрес байта в странице, а старшие биты задают номер страницы EEPROM. Это отражено на рисунке 30.3. Адрес байта в странице (E2BYTE) задается битами [1:BYTEMSB] регистра ADDR. Оставшиеся биты [PAGEMSB:BYTEMSB+1] регистра ADDR хранят адрес страницы EEPROM (E2PAGE).
Совместно битовые поля E2BYTE и E2PAGE образуют абсолютный адрес байта в EEPROM. Размер полей E2WORD и E2PAGE зависит от размера страницы и объема flash-памяти МК, сведения о которых приведены в документации на МК.
Рисунок 30.3. Адресация EEPROM в пространстве памяти ввода-вывода
Когда активизируется отображение EEPROM в памяти данных, загрузка данных в страничный буфер EEPROM выполняется с помощью инструкций записи с прямой или косвенной адресацией. Для задания адресуемой ячейки страничного буфера используются только младшие биты адреса EEPROM, но для адресации отображаемого в памяти EEPROM адрес должен быть указан полностью.
Чтение из EEPROM можно выполнить напрямую с использованием инструкций чтения с прямой или косвенной адресацией. При выполнении чтения отображаемого в памяти данных страничного буфера EEPROM, ЦПУ перед выполнением очередной инструкции приостанавливается на 3 цикла.
После активизации отображения EEPROM в памяти данных, возможность выполнения загрузки страничного буфера EEPROM и чтения EEPROM через NVM-контроллер отключается.
30.11.5. NVM-команды EEPROM
В таблице 30.4 представлены NVM-команды, помощью которых можно выполнить доступ к EEPROM через NVM-контроллер.
Команды самопрограммирования EEPROM с запуском по действию исполняются после установки бита CMDEX в регистре NVM CTRLA. Команды с запуском по чтению исполняются при чтении регистра NVM DATA0 (DATA0).
В столбце "Защита от изменения" указывается, защищен запуск инструкции механизмом защиты от изменения конфигурации (CCP) или нет. В двух последних столбцах приведены данные об используемых указателе адреса и регистре данных.
Алгоритм работы каждой команды более детально рассматривается в подразделах 30.11.5.1…30.11.5.7.
Таблица 30.4. Команды самопрограммирования EEPROM
CMD[6:0] |
Групповая конфигурация |
Описание |
Запуск |
Останов ЦПУ |
Занятость NVM |
Защита от изменения |
Указатель адреса |
Регистр данных |
0x00 |
NO_OPERATION |
Нет операции |
- |
- |
- |
- |
- |
- |
Страничный буфер EEPROM |
0x33 |
LOAD_EEPROM_BUFFER |
Чтение страничного буфера EEPROM |
DATA0 |
Нет |
Нет |
Есть |
ADDR |
DATA0 |
0x36 |
ERASE_EEPROM_BUFFER |
Стирание страничного буфера EEPROM |
CMDEX |
Нет |
Занят |
Есть |
- |
- |
EEPROM |
0x32 |
ERASE_EEPROME_PAGE |
Стирание страницы EEPROM |
CMDEX |
Нет |
Занят |
Есть |
ADDR |
- |
0x34 |
WRITE_EEPROME_PAGE |
Запись страницы EEPROM |
CMDEX |
Нет |
Занят |
Есть |
ADDR |
- |
0x35 |
ERASE_WRITE_EEPROM_PAGE |
Стирание и запись страницы EEPROM |
CMDEX |
Нет |
Занят |
Есть |
ADDR |
- |
0x30 |
ERASE_EEPROM |
Стирание EEPROM |
CMDEX |
Нет |
Занят |
Есть |
- |
- |
0x06 |
READ_EEPROM |
Чтение EEPROM |
CMDEX |
Нет |
Нет |
Есть |
ADDR |
DATA0 |
30.11.5.1. Загрузка страничного буфера EEPROM
Данная команда предназначена для записи одного байта в страничный буфер EEPROM.
- Запишите в регистр NVM CMD команду загрузки страничного буфера EEPROM
- Запишите в регистр NVM ADDR0 адрес, по которому выполняется запись.
- Запишите в регистр NVM DATA0 данные, подлежащие записи. Это приведет к запуску исполнения команды.
Повторите шаги 2-3 нужное число раз.
30.11.5.2. Стирание страничного буфера EEPROM
Данная команда предназначена для стирания страничного буфера EEPROM.
- Запишите в регистр NVM CMD команду стирания страничного буфера EEPROM.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Флаг BUSY регистра NVM STATUS в процессе выполнения операции равен единице.
30.11.5.3. Стирание страницы EPPROM
Данная команда предназначена для стирания одной страницы EEPROM.
- Запишите в регистр NVM CMD команду стирания страницы EEPROM.
- Запишите в регистр NVM ADDRESS адрес подлежащей стиранию страницы EEPROM.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS в процессе выполнения операции равен единице.
Команды стирания страницы стирают только те ячейки страницы, загрузка которых была выполнена в страничный буфер EEPROM.
30.11.5.4. Запись страницы EEPROM
Данная команда предназначена для записи загруженного страничного буфера EEPROM в одну страницу EEPROM. Запись выполняется только тех ячеек, которые предварительно были загружены в страничный буфер EEPROM.
- Запишите в регистр NVM CMD команду записи страницы EEPROM.
- Запишите в регистр NVM ADDR адрес подлежащей записи страницы EEPROM.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Флаг BUSY регистра NVM STATUS равен единице вплоть до завершения операции.
30.11.5.5. Стирание и запись страницы EEPROM
Данная команда позволяет за один подход выполнить стирание страницы EEPROM, а затем запись страничного буфера EEPROM в только что стертую страницу EEPROM.
- Запишите в регистр NVM CMD команду стирания и записи страницы EEPROM.
- Запишите в регистр NVM ADDR адрес подлежащей записи страницы EEPROM.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Флаг BUSY в регистре NVM STATUS остается установленным до завершения операции.
30.11.5.6. Стирание EEPROM
Данная команда предназначена для стирания тех ячеек всех страниц EEPROM, которые были загружены ранее в страничный буфер EEPROM.
- Запишите в регистр NVM CMD команду стирания EPPROM.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Флаг BUSY регистра NVM STATUS удерживается в установленном состоянии вплоть до завершения операции.
30.11.5.7. Чтение EPPROM
Команда чтения EEPROM предназначена для чтения одного байта из EEPROM.
- Запишите в регистр NVM CMD команду чтения EPPROM.
- Запишите в регистр NVM ADDR адрес, по которому будет выполняться чтение.
- Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.
Считанный байт данных будет доступен в NVM DATA0.
|