30.5. Особенности работы NVM-контроллера в занятом состоянии
Когда NVM-контроллер занят выполнением операции, установлен флаг Busy в регистре статуса и блокируется возможность записи в следующие регистры:
- Регистр команды энергонезависимой памяти
- Регистр А управления энергонезависимой памятью
- Регистр В управления энергонезависимой памятью
- Регистры адреса энергонезависимой памяти
- Регистры данных энергонезависимой памяти
Этим гарантируется завершение исполнения текущей команды перед запуском новой. Во внешнем программаторе или прикладной программе необходимо предусмотреть, чтобы во время занятости контроллера программированием не выполнялась адресация энергонезависимой памяти.
Программирование любой части энергонезависимой памяти приведет к автоматическому блокированию:
- программирования любой другой части энергонезависимой памяти.
- загрузки/стиранию всех страничных буферов Flash-памяти и EEPROM.
- чтению энергонезависимой памяти внешним программатором.
- чтению всей энергонезависимой памяти из сектора прикладной программы.
На время самопрограммирования необходимо либо отключить все прерывания, либо переместить таблицу векторов прерываний в загрузочный сектор (см. 12 "Прерывания и программируемый многоуровневый контроллер прерываний".)
30.6. Страничные буферы Flash-памяти и EEPROM
Обновление Flash-памяти происходит на постраничной основе. Обновление же EEPROM может происходить как побайтно, так и постранично. Для программирования страницы Flash-памяти и EEPROM необходимо вначале заполнить соответствующий страничный буфер, а затем инициировать запись всего содержимого страничного буфера в выбранную страницу Flash-памяти или EEPROM.
Размер страничного буфера зависит от размера Flash-памяти и EEPROM каждого микроконтроллера. Конкретные значения размера страницы и количества страниц приводится в документации на микроконтроллер.
30.6.1. Страничный буфер Flash-памяти
Страничный буфер Flash-памяти загружается пословно. Перед загрузкой буфера его необходимо стереть. Если же будет выполнена запись в уже загруженную ячейку буфера, то это приведет к нарушению содержимого этой ячейки страничного буфера Flash-памяти.
В незагруженном состоянии ячейки страничного буфера Flash-памяти имеют значение 0xFFFF. Это значение впоследствии программируется в ячейки страницы flash-памяти.
Страничный буфер Flash-памяти автоматически стирается при:
- системном сбросе;
- выполнении команды записи страницы Flash-памяти;
- выполнении команды стирания и записи страницы Flash-памяти;
- выполнении команды записи сигнатурного кода;
- выполнении команды записи Lock-бит.
30.6.2. Страничный буфер EEPROM
Страничный буфер EEPROM заполняется побайтно. Перед выполнением загрузки его необходимо стереть. Если же запись в одну и ту же ячейку выполнить дважды, это приведет к нарушению содержимого этой ячейки страничного буфера EEPROM.
NVM-контроллер запоминает, загрузка каких именно ячеек страничного буфера EEPROM была выполнена. Это позволяет ему записывать или стирать только целевые ячейки страницы EEPROM. Содержимое нецелевых ячеек остается неизменным. Это также означает, что перед стиранием страницы EEPROM необходимо заполнить выбранные ячейки страничного буфера, чтобы контроллер запомнил, какие ячейки являются целевыми. Если же в конечном счете запись данных в страничный буфер не будет выполнена, объектом программирования будут фактические значения в буфере.
Страничный буфер EEPROM автоматически стирается после:
- системного сброса;
- выполнения команды записи страницы EEPROM;
- выполнения команды стирания и записи страницы EEPROM;
- выполнения команд записи Lock-бит и записи Fuse-бит.
30.7. Последовательности программирования Flash-памяти и EEPROM
При выполнении программирования страницы Flash-памяти и EEPROM, необходимо учитывать, что заполнение страничных буферов и запись страничного буфера во Flash-память или EEPROM - это две разные операции. Последовательность выполнения этих операций одинакова как при самопрограммировании, так и при внешнем программировании.
30.7.1. Последовательность программирования Flash-памяти
Перед выполнением программирования страницы Flash-памяти данными из страничного буфера Flash-памяти, страница Flash-памяти должна быть стерта. Программирование нестертой страницы flash-памяти приводит к нарушению содержимого страницы flash-памяти.
Страничный буфер flash-памяти можно заполнить либо перед выполнением операции стирания страницы Flash-памяти, либо между операциями стирания страницы Flash-памяти и записи страницы Flash-памяти. Всего возможно три сценария.
Сценарий 1. Вначале заполняется буфер, а затем выполняются подряд две отдельных операции стирания страницы и записи страницы:
- Заполняется страничный буфер Flash-памяти.
- Выполняется стирание страницы Flash-памяти.
- Выполняется запись страницы Flash-памяти.
Сценарий 2. Вначале заполняется страничный буфер, а затем выполняется одна совмещенная операция стирания и записи страницы:
- Заполняется страничный буфер Flash-памяти.
- Выполняется стирание и запись страницы.
Сценарий 3. Заполнение страницы выполняется после стирания страницы:
- Выполняется стирание страницы Flash-памяти.
- Заполняется страничный буфер Flash-памяти.
- Выполняется запись страницы Flash-памяти.
Набором NVM-команд поддерживается как совмещенные операции стирания и записи, так и отдельные команды стирания страницы и записи страницы. Раздельные команды позволяют сократить время программирования при выполнении каждой команды, а выполнение операций стирания предусмотреть на этапах, некритичных ко времени программирования.
Если сценарии 1 или 2 использовать при самопрограммировании, можно воспользоваться возможностями эффективного выполнения операций типа чтение-модификация-запись, которые поддерживаются в загрузочном секторе. В таком случае, программа должна вначале считать страницу, затем выполнить необходимые изменения и записать обратно измененные данные. При использовании сценария 3, считать старые данные во время загрузки нельзя, т.к. страница уже стерта. При использовании сценария 1 или 3 в операциях стирания страницы и записи страницы должен участвовать один и тот же адрес.
30.7.2. Последовательность программирования EEPROM
Перед программированием страницы EEPROM выбранным числом байт данных, сохраненных в страничном буфере EEPROM, необходимо стереть выбранные ячейки страницы EEPROM. Программирование нестертой страницы EEPROM приведет к нарушению содержимого страницы EEPROM. Страничный буфер EEPROM необходимо загрузить перед выполнением операции стирания страницы или записи страницы по одному из двух сценариев.
Сценарий 1. Вначале заполняется страничный буфер, а затем выполняется операция стирания страницы:
- Страничный буфер EEPROM заполняется требуемым числом байт.
- Выполняется стирание страницы EEPROM.
- Выполняется запись страницы EEPROM.
Сценарий 2. Вначале заполняется страничный буфер, а затем выполняется операция стирания и записи страницы:
- Страничный буфер EEPROM заполняется требуемым числом байт.
- Выполняется операция стирания и записи EEPROM.
|