12. Модуль резидентной флэш-памяти
(Руководство разработчика по микроконтроллерам семейства HCS08)Ранее мы установили, что контроллер флэш-памяти может выполнять 5 различных команд: верификацию стирания (blank check), программирование байта (single-byte program), программирование в пакетном режиме, или программирование последовательности байтов (multiple-byte program), стирание блока (page erase), стирание всего массива резидентной памяти (mass erase).
12.1.1.1. Команда верификации стирания
По команде верификации стирания конечный автомат в составе контроллера выполняет последовательное считывание содержимого всех ячеек флэш-памяти МК, при этом для каждой ячейки контролируется наличие 1 в каждом бите слова. Именно единичное состояние бита для памяти, выполненной по флэш-технологии, соответствует незапрограммированному состоянию. Поэтому наличие всех 1 в каждой ячейке памяти свидетельствует о том, что процесс стирания прошел успешно. В этом случае устанавливается бит FSTAT:FBLANCK. Если же хотя бы в одной ячейке найден нулевой бит или сразу в нескольких ячейках обнаружены нулевые биты, то бит FSTAT:FBLANCK = 0.
Кроме того, команда верификации стирания также вызывает «рассекречивание» памяти МК, если по результатам ее исполнения обнаружено успешное стирание всего массива памяти (FSTAT:FBLANCK = 1). Тогда биты, отображающие состояние «секретности», автоматически принимают значения FOPT:SEC01 = 1 и FOPT:SEC00 = 0.
12.1.1.2. Команда программирования байта
Данная команда позволяет записать желаемое значение в ячейку флэш-памяти с выбранным адресом. Для этого управляющая программа должна последовательно выполнить следующие действия:
- Настроить коэффициенты деления для получения подходящей внутренней частоты контроллера флэш-памяти. При этом помните, что регистр FCDIV доступен для записи только один раз после сброса МК!
- Проверить состояние бита ошибки доступа к флэш-памяти FSTAT:FACCERR. Если бит FACCERR установлен в 1, то в ходе исполнения предыдущей команды произошла ошибка, и любая новая команда будет проигнорирована. Поэтому следует сбросить бит FACCERR посредством записи в него 1.
- Проверить состояние бита FSTAT:FCBEF. Если бит FCBEF равен 0, то контроллер занят, и программа должна ожидать, пока не будет завершено исполнение текущей команды. Событие завершения сопровождается автоматической установкой бита FCCF в 1.
- Выполнить операцию записи байта, который подлежит программированию, в ячейку памяти с желаемым адресом. При этом необходимо быть уверенным, что предварительно ячейка была подвергнута операции стирания.
- Записать код команды «программирование байта» (0x20) в регистр команды FCMD флэш-контроллера.
- Записать 1 в бит FSTAT:FCBEF. Эта операция вызовет сброс бита FCBEF и запустит на исполнение новую команду.
- Далее программа должна проверить состояние бита ошибки доступа FSTAT:FACCERR и бита попытки доступа к защищенной памяти FSTAT:FPVIOL. Если хотя бы один из них установлен, то текущая команда не будет исполнена. Бит FPVIOL устанавливается автоматически, если произошла попытка стирания или записи ячейки флэш-памяти из области защищенных адресов, которые устанавливаются в регистре FPROT.
- Если программа обнаружила, что ошибок нет, то она должна ожидать завершения исполнения команды. Это событие отмечается установкой флага FSTAT:FCCF. Флаг FCCF сбрасывается автоматически в момент начала исполнения команды и автоматически устанавливается в момент завершения ее исполнения. Причем в рекомендациях производителя для пользователя указано, что после запуска команды на исполнение необходимо подождать не менее 4 периодов BUSCLK, прежде чем выполнять опрос битов FSTAT:FCCF или FSTAT:FCBEF.
Производитель настоятельно рекомендует производить операцию программирования ячейки памяти только один раз после того, как к ней была применена операция стирания (по команде стирания массива или стирания блока). Даже если необходимо дополнительно запрограммировать нули в те биты, которые ранее были установлены в 1. Несоблюдение данного требования может вызвать необратимые разрушения флэш-памяти.
12.1.1.3. Команда программирования последовательности байтов
Эту команду часто называют программированием в пакетном режиме (burst program). Процесс программирования с применением данной команды отличается от программирования последовательности байтов с применением предшествующей команды тем, что повышающий стабилизатор напряжения не отключается после программирования каждого байта. И, как следствие, время программирования сокращается.
Для того чтобы скорость программирования по этой команде была максимальной, необходимо, чтобы начальный и конечный адреса последовательности байтов для программирования принадлежали к одной и той же странице флэш-памяти. Каждая страница флэш-памяти в HCS08 состоит из 64 ячеек, у которых биты A15...A6 адреса одинаковы (см. Рис.12.1).
Адреса | Двоичный код адреса | ||||||||||||||||
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | ||
Страницы | 0xFFFF | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
... | |||||||||||||||||
0xFFC0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
0xFFBF | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | |
... | |||||||||||||||||
0xFF80 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0xFF7F | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
... | |||||||||||||||||
0xFF40 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
Рис.12.1. Разбиение флэш-памяти на страницы.
Для корректного применения команды программирования в пакетном режиме управляющая программа должна последовательно выполнить следующие действия:
- Настроить коэффициенты деления для получения подходящей внутренней частоты контроллера флэш-памяти. При этом помните, что в регистр FCDIV для коэффициентов деления можно осуществить запись только один раз после сброса МК!
- Проверить состояние бита ошибки доступа к флэш-памяти FSTAT:FACCERR. Если бит FACCERR установлен в 1, то любая новая команда будет проигнорирована. Поэтому следует сбросить бит FACCERR посредством записи в него 1.
- Проверить состояние бита FSTAT:FCBEF. Если бит FCBEF равен 0, то контроллер занят, и программа должна ожидать, пока не будет завершено исполнение текущей команды. Событие завершения сопровождается автоматической установкой бита FCCF в 1.
- Далее следует выполнить операцию записи первого байта из последовательности, которая подлежит программированию, в ячейку памяти с желаемым адресом. При этом необходимо быть уверенным, что все ячейки, которые будут программироваться, находятся в незапрограммированном состоянии.
- Записать код команды «программирование в пакетном режиме» (0x25) в регистр команды FCMD флэш-контроллера.
- Записать 1 в бит FSTAT:FCBEF. Эта операция вызовет сброс бита FCBEF и запустит на исполнение новую команду.
- Далее программа должна проверить состояние бита ошибки доступа FSTAT:FACCERR и бита попытки доступа к защищенной памяти FSTAT:FPVIOL. Если хотя бы один из них установлен, то текущая команда не будет исполнена. Бит FPVIOL устанавливается автоматически, если произошла попытка стирания или записи ячейки флэш-памяти из области защищенных адресов, которые устанавливаются в регистре FPROT.
- Если программа обнаружила, что ошибок нет, то она должна ожидать завершения программирования одного байта из последовательности. Для этого программа должна контролировать состояние бита FSTAT:FCBEF. Если он равен 0, то продолжается программирование предыдущего байта. Если он стал равным 1, то предыдущий байт уже запрограммирован и следует повторить рассматриваемый алгоритм для следующего байта, начиная с пункта 5.
- Если реализуется процесс программирования последнего байта из последовательности, то установленный бит FSTAT:FCBEF будет свидетельствовать о том, что процесс программирования в пакетном режиме закончен. Помните, что в рекомендациях производителя для пользователя указано, что после запуска команды на исполнение необходимо подождать не менее 4 периодов BUSCLK, прежде чем выполнять опрос битов FSTAT:FCCF или FSTAT:FCBEF.
При расчете времени программирования последовательности байтов следует знать, что программирование первого байта будет занимать 9 периодов частоты BUSCLK, последующих байтов — 4 периода, если они располагаются в той же странице памяти. Если же в процессе программирования осуществляется переход через границу страниц, то первый байт на новой странице будет программироваться в течение 9 периодов BUSCLK.
12.1.1.4. Команда стирания блока
Память, выполненная по флэш-технологии, не допускает возможности стирания информации для произвольного числа ячеек памяти. Операция стирания одновременно реализуется только для группы ячеек, которые объединены в блок. Для большинства МК семейства HCS08 размер блока составляет 512 ячеек памяти (512 байт). Однако для МК серий DN, DZ, DV и EN размер блока равен 768 байт.
Важно! Для стирания всего одного байта памяти мы вынуждены стереть сразу не менее 512байт!
Команда стирания блока программно обслуживается той же последовательностью действий, что и команда записи одного байта. Выбор блока для стирания осуществляется на этапе 4, когда выполняется операция записи произвольных данных по любому адресу, который принадлежит назначенному для стирания блоку. Важно понимать, что выполняемая на этапе 4 операция записи является фиктивной, поэтому численное значение записываемых данных может быть любым.
На этапе 5 следует указать код команды стирания блока (0x40).
После того, как исполнение команды стирания блока будет завершено, и бит FSTAT:FCBEF установится в 1, содержимое каждой ячейки памяти блока станет равным 0xFF.
Стирание блока, который защищен от записи в регистре FPROT, невозможно! Попытка стирания такого блока вызовет установку бита ошибки FSTAT:FPVIOL!
Некоторые МК семейства HCS08, например DN, DZ, DV, EL и EN, имеют специальную команду флэш-контроллера, которая позволяет остановить процесс стирания блока, если он уже начат. Для выполнения этой команды программа управления должна выполнить следующую последовательность действий:
- Проверить состояние бита FSTAT:FCBEF. Если бит FCBEF равен 1, то контроллер завершил исполнение команды стирания, и нет необходимости применять команду блокировки стирания. Если бит FCBEF равен 0, то запушенный ранее процесс стирания еще не завершен и следует продолжить исполнение рассматриваемого алгоритма.
- Выполнить операцию записи любого числа по адресу, принадлежащему рассматриваемому блоку памяти.
- Записать код команды «блокирование стирания» (0x47) в регистр команды FCMD.
- Записать 1 в бит FSTAT:FCBEF. Эта операция запустит на исполнение команду блокировки стирания.
- Далее следует ожидать, пока бит FSTAT:FCBEF снова установится в 1. Это будет свидетельствовать, что команда блокировки стирания выполнена. Однако при этом нет уверенности, что все данные рассматриваемого блока остались нетронутыми.
- Поэтому программа должна проверить состояние флага FSTAT:FACCERR. Если он равен 1, то команда блокировки стирания была выполнена вовремя, и содержимое блока памяти стерто не полностью. Если же бит FSTAT:FACCERR равен 0, то все ячейки памяти блока содержат код 0xFF, т.е. операция стирания все же была выполнена.
12.1.1.5. Команда стирания массива
Эта команда выполняет стирание всех ячеек резидентной флэш-памяти МК. Последовательность действий управляющей программы для запуска команды стирания массива полностью аналогична последовательности для команды стирания одного блока. Следует лишь заменить код команды на 0x41. Также следует помнить, что для корректной работы команды операцию записи необходимо производить по адресу, который принадлежит области резидентной флэш-памяти той модели МК, для которой выполняют стирание массива.
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>