Домой / Работа в Интернете / Контроллер динамической памяти. Контроллер прямого доступа к памяти: схема, логика, состояния и режим работы Функции контроллера кэш - памяти

Контроллер динамической памяти. Контроллер прямого доступа к памяти: схема, логика, состояния и режим работы Функции контроллера кэш - памяти

Процессорное ядро микроконтроллеров:
– арифметико-логическое устройство
– организация памяти

Доброго дня уважаемые радиолюбители!
Приветствую вас на сайте “ “

Сегодня (точнее – в течении нескольких статей) мы с вами более подробно рассмотрим основу любого микроконтроллера процессорное ядро .

Основные элементы:

1. Арифметико-логическое устройство

АЛУ – сердце (а может быть и ум, с честью и совестью) микроконтроллера.
Здесь мы не будем входить в роль “маньяка-расчленителя” и ковыряться во внутренностях этого устройства. Усвоим только, что благодаря АЛУ происходит вся работа микроконтроллера. Если у вас когда-нибудь появится желание более глубже узнать как работает “сердце” микроконтроллера (а будет неплохо, если оно появится), то в книгах замечательных авторов Белова, Рюмика, Евстифеева, Ревича, Баранова и многих других, вы всегда найдете подробный ответ.

2. Память микроконтроллера (организация памяти)

Прежде чем рассматривать память микроконтроллера, немного поговорим о памяти вообще.
Человеческая память – с ней все понятно, – она бывает “твердой” (когда находишься в твердой памяти, а иногда еще и в здравом уме) и, как не прискорбно, – “дырявой”. А вся информация хранится в так называемых “нейронах” – маленьких ячейках памяти.
У микроконтроллеров почти все также. Только, если у человека самая маленькая ячейка для хранения информации называется “нейрон”, то для микроконтроллера самая маленькая ячейка памяти для хранения информации называется “бит “.
В одном бите может храниться или одна логическая единица, или один логический ноль.
Бит минимальная единица измерения объема памяти в микропроцессорной технике .
Следующая основная, или самая распространенная, единица измерения памяти – байт .
Байт это восемь бит информации. В одном байте может храниться только восемь нулей и единиц.
Максимальное число которое можно записать в байт – 255. Если в программе вы будете оперировать большими числами то следует знать (чтобы знать сколько байт потребуется для хранения числа), что максимальное число, которое можно записать в:
– один байт = 255
– два байта = 65 535
– три байта = 16 777 215
– четыре байта – число величиной более 4 миллиардов (если вы не входите хотя бы в сотню журнала “Форбс”, то четыре байта памяти для хранения чисел вам не понадобятся).
Запись в память и чтение из памяти происходит байтами (нельзя записать или считать один бит информации).
Следующая единица измерения – килобайт .
В килобайте помещается 1024 байт информации (именно 1024, а не 1000 байт).
Есть еще и большие величины измерения объема памяти (мегабайт, гигабайт), но в микроконтроллерах они пока не применяются.
Я надеюсь, что с единицами измерения электронной памяти нам все понятно:

Организация памяти в микроконтроллере

Микросхемы AVR имеют три вида памяти:
память программ, она же FLASH-память
память данных, она же ОЗУ (оперативно-запоминающее устройство) , она же SRAM
энергонезависимая память, она же ЭСППЗУ, она же EEPROM
В микроконтроллере выделяется три адресных пространства в которых располагаются вышеперечисленные разновидности памяти. Память данных при этом (в смысле выделенного адресного пространства) оказалась немного обделенной – ей приходится делить свое адресное пространство с ячейками памяти в которых хранятся регистры общего назначения и регистры ввода/вывода (о них вы подробно узнаете в следующей статье). Эти регистры физически не относятся к памяти данных, но находятся в том же адресном пространстве. Если начальные адреса памяти программ и энергонезависимой памяти начинаются с нулевого адреса, то начальный адрес памяти данных не начинается с нулевого адреса – с нулевого адреса занимают места регистры общего назначения и регистры ввода/вывода, и только за ними следуют адреса ячеек памяти программ.
В некоторых видах МК ATiny память данных отсутствует.

Память программ (FLASH память)

Память программ предназначена для хранения в ней наших программ, а также любых нужных нам данных, которые не меняются в ходе выполнения программы (константы). При выключении питания микроконтроллера, все данные в памяти программ сохраняются.
Память программ , естественно, имеют все микроконтроллеры. Размер памяти программ, в зависимости от типа МК, варьируется от 1 килобайта до 256 килобайт.
Доступ к памяти программ имеет только программист при программировании МК, у самого МК доступ к памяти программ тоже имеется, но только для чтения данных из памяти, записать туда он ничего не может (мало ли что, вдруг захочет испортить нашу программу). Правда, у МК семейства Mega есть возможность (с разрешения программиста) вносить изменения в памяти программ, но это отдельная история.
Для памяти программ есть еще два вида измерения объема памяти – “слово ” и “страница “.
Дело в том, что память программ состоит из ячеек состоящих из двух байт . Такая ячейка называется “словом” . А сделано это так потому, что почти все команды МК состоят из двух байт, и, соответственно, для их записи нужно два байта в памяти программ. Каждая команда МК – это одно “слово” . Есть несколько команд, для записи которых требуется 4 байта в памяти – два слова, но такие команды встречаются в МК у которых память программ больше 8 килобайт.
Таким образом, в одну ячейку памяти программ можно записать :
– любую команду, состоящую из двух байт
– половину команды, состоящей из 4 байт
– две константы, каждая из которых умещается в один байт, или одну шестнадцатиразрядную константу. При этом, если вы записываете в память три однобайтовых константы, они все равно займут в памяти четыре байта (два слова).
Кроме того, запись в память программ осуществляется не только “словами”, но еще и “страницами” . Размер “страницы” составляет от 64 до 256 байт (чем больше объем памяти программ, тем больше объем “страницы”). Что это значит. Если вы создали маленькую программку, объем которой составляет 11 слов (22 байта), в памяти программ она все равно займет место в одну страницу, т.е. как минимум 64 байта. “Лишние” 42 байта при этом будут заполнены или нулями, или единицами. Вот такие вот, пироги.
Но и это еще не все.
Память программ может иметь три состояния (если можно так выразиться):
1. Вся память находится в распоряжение программиста
В этом случае мы можем забить всю память полностью своей программой и данными. А программа будет стартовать с нулевого адреса памяти.
2. Часть памяти забирает МК
В случае, если при работе МК используются (а я надеюсь – вы помните, что это такое), часть памяти МК забирает для нужд обработки прерываний и хранит в ней “векторы прерываний “.
Что это такое.
Когда мы разрешаем МК обрабатывать прерывания, он, начиная с нулевого адреса памяти, забирает часть ячеек для хранения в них адресов, по которым надо перейти МК для выполнения подпрограммы прерывания. Для каждого прерывания МК выделяет два байта памяти (одно слово) в которых хранятся адреса подпрограмм обработки прерываний. Вот эти адреса, которые указывают где находится в памяти подпрограмма обработки того, или иного прерывания, называются “векторами прерываний “. А вся область памяти, в которой хранятся “векторы прерываний”, называется таблицей векторов прерываний . Количество занятых ячеек памяти под прерывания зависит напрямую от количества возможных прерываний данного микроконтроллера (от нескольких штук, до нескольких десятков). Все прерывания располагаются в начале памяти программ, с нулевого адреса, и имеют четкую последовательность. По нулевому адресу всегда располагается вектор прерывания по “сбросу” (Reset). Когда мы включаем устройство, или производим сброс кнопкой, срабатывает прерывание по сбросу. МК считывает с нулевого адреса (с ячейки) адрес, который указывает где в памяти находится начало нашей программы, и перейдя по этому адресу начинает выполнять программу. Сама программа в этом случае будет располагаться в памяти программ сразу за таблицей прерываний.
3. МК забирает еще одну часть памяти программ (точнее не забирает, а выделяет область в конце памяти, в которой программист размещает специальную программу – “загрузчик”).
Такое возможно в МК семейства “MEGA”, у которых есть возможность разрешить МК вносить изменения в памяти программ. Что это значит.
Некоторые МК имеют возможность самопрограммироваться . В практике любителей такая возможность МК используется крайне редко. Возможность перепрограммироваться (самопрограммироваться) нужна, в основном, в случаях промышленного производства какого-то устройства на микроконтроллере, для которого потом может выпускаться обновление программного обеспечения. Мы эту возможность рассматривать не будем, по крайней мере пока. Нам достаточно только знать, что в МК, которые поддерживают самопрограммирование, память программ разделяется на две части :
- верхняя – секция прикладной программы , где располагается наша программа и векторы прерываний
- нижняя – секция загрузчика (Boot Loader Section – по английски), где программист располагает свою программу-загрузчик. Размер секции загрузчика зависит от общего размера памяти программ МК, и может составлять от 128 байт до 4096 байт. Если возможность самопрограммирования МК мы не используем, то эта секция отдается для нашей программы и данных.
Ну а FLASH-памятью память программ называют потому, что она делается по так называемой Flash-технологии (как и всем нам привычные компьютерные “флешки”)
Память программ допускает 10 тысяч циклов перепрограммирования.

Память данных (Статическое ОЗУ, SRAM)

Оперативно-запоминающее устройство , оно же память данных типа SRAM , предназначена для хранения в ней различных данных, получаемых в результате работы программы.
При выключении питания микроконтроллера, все данные хранящиеся в ней теряются.
Память данных есть почти во всех микроконтроллерах (отсутствует у простейших МК семейства Tiny).
Во всех МК семейства Mega (и части МК семейства Tiny) объем встроенной памяти данных колеблется от 128 байт до 8 килобайт, и почти вся она отдана в наше полное распоряжение. Только немножко забирает себе МК для организации стека (что это такое узнаем позднее). В некоторых МК предусмотрено подключение внешней памяти (она может быть любого типа – FLASH, SRAM, EEPROM) объемом до 64 килобайт. В случае подключения внешней памяти в таких МК, она становится как-бы продолжением памяти данных.
Запись в память данных и чтение из нее происходит побайтно, и в отличии от памяти программ в ней нет деления на страницы и слова.

Энергонезависимая память (EEPROM)

Энергонезависимая память также относится к памяти данных, но в отличие от последней имеет несколько особенностей. Предназначена она для хранения данных и констант, которые должны сохраняться при отсутствии питания.
EEPROM имеют все микроконтроллеры.
При выключении питания микроконтроллера все данные, хранящиеся в энергонезависимой памяти сохраняются (поэтому она и называется энергонезависимой).
Объем энергонезависимой памяти , в зависимости от типа МК, колеблется от 64 байт до 4 килобайт.
Запись и чтение информации в память производится побайтно. Однако в старших моделях семейства MEGA, энергонезависимая память, так же как и память программ, имеет страничную запись. Объем страницы небольшой, составляет всего 4 байта. На практике эта особенность не имеет значения – и запись, и чтение осуществляется все равно побайтно.
Число циклов записи и стирания памяти достигает 100 000.
Главная особенность EEPROM заключается в том, что при записи в нее данных она становится очень “медленной” – запись одного байта может продолжаться от 2 до 4 миллисекунд (это очень низкая скорость), и может случиться, к примеру, что во время записи сработает какое-либо прерывание и в этом случае процесс записи данных будет загублен.
Кроме того, не рекомендуется записывать данные в энергонезависимую память с нулевого адреса (не помню источника этих сведений, но точно помню, что где-то читал) – возможно повреждение данных в ходе работы МК. Иногда программисты отступают на несколько байт от начала памяти, и только в следующих ячейках начинают запись данных.

В основе любой flash-памяти лежит кристалл кремния, на котором сформированы не совсем обычные полевые транзисторы. У такого транзистора есть два изолиро­ванных затвора: управляющий (control) и плавающий (floating). Последний спо­собен удерживать электроны, то есть заряд. В ячейке, как и у любого полевого транзистора, есть сток и исток (рис. 4.1). В процессе записи на управляющий затвор подается положительное напряжение и часть электронов, движущихся от стока к истоку, отклоняется к плавающему затвору. Некоторые из электронов преодоле­вают слой изолятора и проникают (диффундируют) в плавающий затвор. В нем они могут оставаться в течение многих лет.

Концентрация электронов в области плавающего затвора определяет одно из двух устойчивых состояний транзистора - ячейки памяти. В первом, исходном, состоя­нии количество электронов на плавающем затворе мало, а пороговое напряжение открытия транзистора относительно невысоко (логическая единица). Когда на плавающий затвор занесено достаточное количество электронов, транзистор ока­зывается во втором устойчивом состоянии. Напряжение открытия его резко уве­личивается, что соответствует логическому нулю. При считывании измеряется

Рис. 4.1. Ячейка flash-памяти

пороговое напряжение, которое нужно подать на сток для открытия транзистора. Для удаления информации на управляющий затвор кратковременно подается от­рицательное напряжение, и электроны с плавающего затвора диффундируют об­ратно на исток. Транзистор вновь переходит в состояние логической единицы и остается в нем, пока не будет произведена очередная запись. Примечательно, что во flash-памяти один транзистор хранит один бит информации - он и является ячейкой. Весь процесс «запоминания» основан на диффузии электронов в полу­проводнике. Отсюда следуют два не очень оптимистичных вывода.

Время хранения заряда очень велико и измеряется годами, но все же ограниче­но. Законы термодинамики и диффузии гласят, что концентрация электронов в разных областях рано или поздно выровняется.

По той же причине ограничено количество циклов записи-перезаписи: от ста тысяч до нескольких миллионов. Со временем неизбежно происходит деграда­ция самого материала и р-п-переходов. Например, карты Kingston Compact Flash рассчитаны на 300 ООО циклов перезаписи. Transcend Compact Flash - на

1 ООО ООО, а flash-диск Transcend 32 Gb USB – всего на 100 ООО.

Существуют две архитектуры flash-памяти. Они отличаются способом обращения к ячейкам и, соответственно, организацией внутренних проводников.

Память NOR (ИЛИ-НЕ) позволяет обращаться к ячейкам по одной. К каждой ячейке подходит отдельный проводник. Адресное пространство NOR-памяти позволяет работать с отдельными байтами или словами (каждое слово содержит

2 байта). Такая архитектура накладывает серьезные ограничения на максималь­ный объем памяти на единице площади кристалла. Память NOR сегодня используется лишь в микросхемах BIOS и других ПЗУ малой емкости, например в сотовых телефонах.

В памяти архитектуры NAND (И-НЕ) каждая ячейка оказывается на пересече­нии «линии бит» и «линии слов». Ячейки группируются в небольшие блоки по аналогии с кластером жесткого диска. И считывание, и запись осуществляются лишь целыми блоками или строками. Все современные съемные носители по­строены на памяти NAND.

Крупнейшими производителями NAND-чипов являются компании Intel, Micron Technology, Sony и Samsung. Ассортимент выпускаемых чипов довольно велик, а обновление его происходит несколько раз в год.

Контроллеры

Для управления чтением и записью служит контроллер памяти. В настоящее вре­мя контроллер всегда выполняется в виде отдельного элемента (это либо микро­схема одного из стандартных форм-факторов, либо бескорпусный чип, встраиваемый в карту памяти), хотя ведутся работы по интеграции контроллера непосредственно в кристалл flash-памяти.

Контроллеры разрабатываются и выпускаются под совершенно определенные микросхемы flash-памяти. Способ адресации ячеек конструктивно заложен в кон­троллере. Данные при записи в микросхему flash-памяти располагаются опреде­ленным способом, меняющимся от модели к модели. Производители эти тонкости держат в секрете и, по всей видимости, раскрывать не планируют. Очевидно, мик­ропрограмм контроллеров создается значительно больше, чем самих моделей кон­троллеров. Микропрограмма контроллера (прошивка) и таблица трансляции ад­ресов (транслятор) записываются в служебную область flash-памяти. Именно эту область контроллер начинает считывать сразу после подачи на него питания. Кро­ме собственно адресации ячеек, контроллер выполняет ряд других функций: функ­ции контроля bad-секторов, коррекции ошибок (ЕСС - error check and correct) и равномерности износа ячеек (wear leveling).

Технологической нормой при изготовлении микросхем памяти считается наличие в них в среднем до 2 % нерабочих ячеек. Со временем их количество может увели­чиваться, поэтому, как и в винчестерах, во flash-памяти предусмотрен резервный объем. Если появляется дефектный сектор, контроллер в процессе форматиро­вания или записи подменяет его адрес в таблице размещения файлов адресом сектора из резервной области. Коррекция осуществляется контроллером, но реа­лизуется на уровне файловой системы конкретного носителя.

Из-за ограниченного ресурса ячеек (порядка нескольких миллионов циклов чтения/ записи для каждой) в контроллер заложена функция учета равномерности износа. Чтобы запись информации осуществлялась равномерно, свободное пространство условно разбивается на участки, и для каждого из них учитывается количество операций записи. Статистика циклов заносится в скрытую служебную область памяти, и за этими сведениями контроллер периодически обращается к ней. На ад­ресацию это не влияет.

Конструкция flash-диска USB

Несмотря на разнообразие корпусов, все flash-диски USB устроены одинаково. Если половинки корпуса соединены защелками, они обычно легко разъединяются. Водонепроницаемые или ультрамодные корпусы приходится вскрывать разру­шающими методами, например разрезать.

На плате внутри flash-диска USB (рис. 4.2) обязательно присутствуют две микро­схемы: чип памяти и контроллер. На обеих нанесена заводская маркировка. Иногда плата несет два чипа flash-памяти, которые работают в паре. Обвязка микросхем состоит из нескольких резисторов и диодов, стабилизатора питания и кварцевого резонатора. В последнее время стабилизатор все чаще встраивается непосред­ственно в контроллер и количество навесных элементов сокращается до минимума. Кроме того, на плате могут находиться светодиодный индикатор и миниатюрный переключатель для защиты от записи.

Рис. 4.2. Устройство flash-диска

Разъем USB припаян непосредственно к плате. Места пайки контактов во многих моделях являются довольно уязвимыми, поскольку на них приходится механиче­ская нагрузка при подключении и отключении устройства.

Виды и конструкция карт памяти

Многие компании время от времени предлагали пользователям разные конструк­ции карт памяти. За редкими исключениями все они несовместимы между собой по количеству и расположению контактов и электрическим характеристикам, Flash-карты бывают двух типов: с параллельным (parallel) и последовательным (serial) интерфейсом.

В табл. 4.1 перечислены 12 основных типов карт памяти, которые встречаются в настоящее время. Внутри каждого типа существуют свои дополнительные раз­новидности, с учетом которых можно говорить о существовании почти 40 видов карт.

Таблица 4.1. Типы карт памяти

Тип карты памяти

Габаритные размеры (мм)

Максимальная

конструктивная

Интерфейс

CompactFlash (CF)

Параллельный 50 контактов

Последовательный 9 контактов

MultiMedia Card (ММС)

Последовательный 7 контактов

Последовательный 7 контактов

Highspeed ММС

Последовательный 13 контактов

Последовательный 10 контактов

Memory Stick PRO

Последовательный 10 контактов

Memory Stick Duo

Последовательный 10 контактов

SmartMedia (SSFDC)

Параллельный 22 контакта

Параллельный 22 контакта

Последовательный 8 контактов

Карты ММС могут работать в двух режимах: ММС (MultiMedia Card) и SPI (Serial Peripheral Interface). Режим SPI является частью протокола ММС и используется идя коммуникации с каналом SPI в микроконтроллерах компании Motorola и не­которых других производителей.

В слот для карты SD (Secure Digital) можно вставить карту ММС (MultiMedia Card), но не наоборот. В контроллер карты SD заложено аппаратное шифрование данных, а сама память снабжена специальной областью, в которой хранится ключ шифрования. Сделано это для того, чтобы препятствовать нелегальному копиро­ванию музыкальных записей, для хранения и продажи которых и задумывался такой носитель. На карте сделан переключатель защиты от записи (write protection switch).

Карты CompactFlash (CF) легко можно вставить в разъем PCMCIA Туре II. Несмотря на то что у PCMCIA 68 контактов, а у CF - только 50, конструкция карт CompactFlash обеспечивает полную совместимость и обладает всеми функциональ­ными возможностями формата PCMCIA-AT А.

Все карты памяти Memory Stick (стандарт корпорации Sony) относительно совмес­тимы между собой. Стандартом теоретически предусмотрен объем карты памяти до 2 Тбайт, хотя в реальности емкость достигает единиц гигабайт.

Карты SmartMedia практически вышли из употребления, их можно встретить только в очень старых цифровых камерах. Примечательно, что это был единственный стан­дарт, в котором контроллер находился не внутри карты, а в устройстве считывания.

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

Устройства считывания

Для считывания flash-диска USB достаточно обычного порта USB: компьютер видит подобные устройства как стандартный съемный диск благодаря их контрол­леру. Контроллеры всех карт памяти обращены к компьютеру последовательными или параллельными интерфейсами - контактами на карте. Для каждого из этих интерфейсов нужен соответствующий переходник - дополнительный контроллер, согласующий данный интерфейс со стандартным портом USB.

Кард-ридер - устройство, состоящее из одного или нескольких подобных контрол­леров, преобразователя питания и разъемов для разных карт памяти (рис. 4.3). Питание осуществляется от источника +5 В через кабель USB.

Рис. 4.3. Кард-ридер

Чаще всего встречаются «комбайны», рассчитанные на несколько типов карт: от 6 до 40. Слотов в кард-ридере гораздо меньше, так как каждое гнездо использу­ется для нескольких типов карт, близких по размерам и расположению контактов. По своим характеристикам разные модели практически равноценны, а различа­ются, главным образом, количеством поддерживаемых типов карт и конструк­цией.

Логическая организация

Прежде чем перейти к файловым системам flash-накопителей, нужно вспомнить об архитектуре NAND. В этой часто используемой памяти и чтение, и запись, и уда­ление информации происходят лишь блоками.

На жестких и гибких дисках величина блока составляет 512 байтов, не считая 59 служебных байтов, которые видны только контроллеру винчестера. Все файло­вые системы создавались именно с учетом этих значений. Проблема в том, что во flash-памяти величина блока стирания, за редким исключением, не совпадает с величиной стандартного дискового сектора в 512 байтов и обычно составляет 4,8 и даже 64 Кбайт. С другой стороны, для обеспечения совместимости блок чте­ния/записи должен совпадать с величиной дискового сектора.

Для этого блок стирания разбивается на несколько блоков чтения/записи с разме­ром 512 байтов. На практике блок чуть больше: кроме 512 байтов для данных, в нем еще есть «хвост» (Tail) длиной 16 байтов для служебной информации о самом блоке. Физически расположение и количество блоков чтения/записи ничем не ограничены. Единственное ограничение - блок чтения/записи не должен пересе­кать границу блока стирания, так как он не может принадлежать двум разным блокам стирания.

Блоки чтения/записи делятся на три типа: действительные, недействительные и дефектные. Блоки, которые содержат записанные данные и принадлежат какому-либо файлу, являются действительными. Использованные блоки с устаревшей информацией считаются недействительными и подлежат очистке. Категорию де­фектных составляют блоки, не поддающиеся записи и стиранию.

Еще одна особенность flash-памяти состоит в том, что запись информации возмож­на только на предварительно очищенное от предыдущей информации пространст­во. Когда необходимо записать информацию, микропрограмма контроллера долж­на решить, какие недействительные блоки нужно перед этим стереть. В большей части микропрограмм вопрос удаления недействительных блоков решается про­стейшим способом: как только определенная часть емкости flash-диска оказывает­ся заполнена информацией, автоматически запускается механизм очистки недей­ствительных блоков.

Для увеличения срока службы памяти используется технология управления изно­сом (wear-leveling control), которая продлевает жизненный цикл кристалла памя­ти за счет равномерного распределения циклов записи/стирания блоков памяти. Побочный эффект - выход из строя одного блока памяти - не сказывается на работе остальных блоков памяти того же кристалла. Неподвижные блоки принад­лежат файлам, которые долго или вообще никогда не изменялись и не перемеща­лись. Наличие неподвижных блоков данных приводит к тому, что оставшаяся часть ячеек подвергается усиленному износу и быстрее расходует свой ресурс. Микро­программа учитывает такие блоки и по мере необходимости перемещает их содер­жимое в другие ячейки.

Файловые системы flash-дисков и карт памяти, на первый взгляд, хорошо знакомы пользователям по жестким и гибким дискам. Это FAT16, реже FAT32: именно так предлагает отформатировать диск операционная система Windows. Стандартными средствами Windows ХР и Windows 7 диск можно отформатировать и в систему NTFS! Для этого нужно предварительно зайти в Диспетчер устройств и в окне свойств подключенного flash-диска на вкладке Политика выбрать значение Оптимизация для быстрого выполнения. Специальные программы от производителей, например HP USB Disk Storage Format Tool, позволяют форматировать flash-диски в NTFS и без таких усилий.

Однако внешнее сходство файловых систем твердотельных накопителей и обыч­ных винчестеров обманчиво. Файловая система flash-памяти (Flash File System, FFS) лишь эмулирует обычный дисковый накопитель и состоит из блоков управ­ления и блока инициализации. На самом деле об истинном расположении и адре­сации блоков памяти знает только контроллер flash-диска или карты памяти.

Это очень существенно при разных способах восстановления содержимого микро­схемы flash-памяти. При считывании микросхемы памяти через ее «родной» кон­троллер в файле образа оказывается последовательность блоков в порядке их но­меров или смещений. В начале находятся заголовок и таблица файловой системы. Если же считывание производится на программаторе, в начальных блоках дампа расположена служебная информация, а блоки с данными перемешаны почти бес­порядочно. При этом служебная информация вряд ли будет полезна, поскольку она всецело зависит от модели контроллера и его прошивки - правильную после­довательность блоков приходится составлять с большим трудом.

Некоторые фотоаппараты работают только с файловой системой RAW Способ записи фотографий на носитель с такой файловой системой, а также особенности форматирования самой карты зависят от модели аппарата и даже прошивки той или иной модели. Этот формат не стандартизирован и имеет много разновидностей. Обычно данные с таких карт могут восстановить лишь сервисные программы от изготовителя фотокамеры, а в качестве кард-ридера желательно использовать сам фотоаппарат.

Рис. 4.4. Окно форматирования flash-диска в Windows Vista SPl

Нововведением является файловая система exFAT (Extended FAT - расширенная FAT). Поддержка этой специально разработанной для flash-дисков файловой системы впервые появилась в Windows Embedded СЕ 6.0. С exFAT работают Windows Vista Service Pack 1 и Windows 7 (рис. 4.4).

Назначение новой файловой системы - постепен­ная замена FAT и FAT32 на flash-накопителях. В ней заложены некоторые черты, которые ранее были присущи только файловой системе NTFS:

Преодолено ограничение в размере файла в 4 Гбайт: теоретически лимит составляет 2^ байтов (16 эксабайтов);

Улучшено распределение свободного места за счет введения битовой карты свободного мес­та, что уменьшает фрагментацию диска;

Снят лимит на количество файлов в одной директории;

Введена поддержка списка прав доступа.

Насколько скоро эта файловая система станет нормой для flash-накопителей, по­кажет время. Видимо, это произойдет не раньше, чем на операционную систему Windows 7 перейдет подавляющее большинство пользователей.

Иногда при разработке устройства возникает потребность сохранять какие-либо данные в энергонезависимую память. В таких случаях обычно используют внутреннюю EEPROM микроконтроллера. Если её недостаточно, то как правило применяются внешние микросхемы EEPROM из серии 24lxx. Микросхемы этой серии очень популярны. Чаще всего их можно встретить в старых мобильных телефонах, некоторых материнских платах, картриджах от принтеров да еще много где. Цена данных микросхем тоже очень привлекательная. Например 24LC16 у нас стоит 11 рублей.
Данная микросхема выпускается в различных корпусах, самые популярные из которых это DIP и SOIC. Микросхема имеет следующую распиновку:

Как видите выводов совсем немного. Итак попробуем разобраться для что к чему.
A0, A1, A2 — в данной микросхеме не используются. Их можно подсоединить к земле или к плюсу питания. В некоторых других микросхемах серии 24lxx, этими выводами можно задавать адрес микросхемы, для того чтобы можно было подсоединить на одну шину i2c аж сразу 8 микрух памяти.
Vss — земля.
SDA — линия данных
SCL — линия тактовых импульсов
WP — Защита от записи. Когда на данном выводе логический 0, то запись в память разрешена. Если подать логическую единицу, то возможно только чтение из памяти.
Vcc — питание микросхемы. Согласно даташиту питается она напряжением от 2.5 вольта до 5.5 вольта.

Подключение к контроллеру.
Подключить память к МК очень просто. Из обвязки потребуются только пара резисторов сопротивлением около 4.7 кОм.

Программное обеспечение

Для работы с памятью была разработана библиотека реализующая следующие функции:

i2c_init — настраивает скорость тактовых импульсов идущих по линии SCL.

Микросхема 24LC16 поддерживает частоту до 400 кГц. Рассчитать частоту можно так:

CPU Clock frequency — частота на которой работает микроконтроллер

TWBR — число записанное в одноименный регистр.

TWPS — предделитель. Значения предделителя задаются битами TWPS1 и TWPS0 в регистре TWSR

Для контроллера Atmega 32 справедлива такая таблица:

i2c_start — отсылает стартовую посылку

i2c_stop — отсылает стоповую посылку

i2c_send — отсылает байт

i2c_recive — принимает байт

i2c_recive_last — принимает последний байт. Отличие от предыдущей функции состоит в том, что когда байт принят, микроконтроллер не отсылает бит подтверждения. Если при приёме последнего байта использовать i2c_recive то линия SDA останется прижатой к земле.

Запись данных в микросхему памяти

Записывать данные можно как в произвольном порядке так и постранично. Поскольку на шине i2c могут быть сразу несколько устройств, то для того чтобы обратится к какому либо устройству нужно знать его семибитный адрес. Адрес микросхемы 24LC16 в двоичном виде выглядит так:

Биты A,B,C служат для выбора блока памяти. Блоков памяти в микросхеме 8 штук по 256 байт каждый. Соответственно биты ABC принимают значения от 000 до 111.

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

  1. Инициализировать интерфейс i2c
  2. Отослать стартовую посылку
  3. Отослать адрес микросхемы+адрес блока памяти
  4. Отослать адрес ячейки памяти в которую будет производится запись
  5. Отослать байт данных
  6. Отослать стоповую посылку

Пример: Нужно записать байт 0xFA по адресу 0x101 .

rcall i2c_init
rcall i2c_start
ldi temp,0b 1010 001 0 //Адрес микросхемы где:
// 1010 - адрес микросхемы
// 001 - адрес блока памяти (Ячейка 0x101 принадлежит блоку 1)
// 0
rcall i2c_send
ldi temp,1 //Адрес ячейки памяти. (блок 1, ячейка 1)
rcall i2c_send
ldi temp,0xFA //Загружаем в регистр байт который нужно записать
rcall i2c_send //Записываем байт
rcall i2c_stop

Записывать данные в память можно не только побайтно но и постранично. Размер страницы — 16 байт. Постараничная запись подразумевает следующее: Отправляем адрес нулевого байта нужной страницы и после этого 16 раз отправляем нужные данные. Счётчик адреса будет увеличивать на единицу автоматически. Если отправить данные в 17-й раз, то будет перезаписан нулевой байт, если отправить байт 18-й раз, то он затрет байт номер 1 итд.

Пример : Требуется записать первую страницу блока 0.

rcall i2c_init //Инициализируем интерфейс i2c
rcall i2c_start // Отправляем стартовую посылку
ldi temp,0b 1010 000 0 //Адрес микросхемы где:
// 1010 - адрес микросхемы
// 000 - адрес блока памяти (нас интересует нулевой блок)
// 0 - бит чтения/записи. 0 - запись, 1 - чтение
rcall i2c_send
ldi temp,16 //Адрес первой страницы
rcall i2c_send
ldi temp,0x01 //Загружаем в регистр байт номер 0
rcall i2c_send //Записываем байт
ldi temp,0x02 //Загружаем в регистр байт номер 1
rcall i2c_send //Записываем байт
/// тут пишем остальные байты.....
ldi temp,0x0E //Загружаем в регистр байт номер 14
rcall i2c_send //Записываем байт
ldi temp,0x0F //Загружаем в регистр байт номер 15
rcall i2c_send //Записываем байт
rcall i2c_stop //Отправляем стоповую посылку

Чтение данных из микросхемы
С записью вроде разобрались, теперь приступим к чтению. Чтобы прочитать байт нужно сделать следующее:

  1. Инициализировать интерфейс i2c (если он не инициализировался ранее)
  2. Отправить стартовую посылку
  3. Отправить адрес микросхемы и адрес блока памяти откуда будем читать
  4. Отправить адрес ячейки памяти
  5. Отправить стартовую посылку повторно
  6. Отправить адрес микросхемы и адрес блока памяти с битом «чтение»
  7. Получить байт
  8. Отправить стоповую посылку

rcall i2c_init //Инициализируем интерфейс i2c
rcall i2c_start // Отправляем стартовую посылку
ldi temp,0b1010 011 0 //Адрес микросхемы + адрес 3-го блока памяти.
//Бит чтение/запись по прежнему 0 !
rcall i2c_send
ldi temp,0x41 //Адрес ячейки памяти
rcall i2c_send
rcall i2c_start //Повторная отправка стартовой посылки
ldi temp,0b1010 011 1 //Адрес микросхемы+адрес блока памяти+бит чтения/записи стал 1
rcall i2c_send //теперь можно читать данные
rcall i2c_recive_last //Читаем байт. Первый и последний.
rcall i2c_stop //Отправляем стоповую посылку

Чтение может производится последовательно байт за байтом, т.е. просто вызывать i2c_recive столько сколько нужно. Команду увеличения адреса на единицу посылать не нужно. Переключать адреса блоков при последовательном чтении так же не нужно. Т.е. можно взять и разом прочитать всю микросхему без всяких проблем.

Библиотека для работы с i2c разрабатывалась и была испытана на микроконтроллере Atmega32. Я думаю что она будет работать на многих других контроллерах без каких либо изменений. Естественно в контроллере должна быть аппаратная поддержка i2c или как его еще называют TWI. Конечно реализовать i2c можно и программно, но я не стал заморачиваться да и не было нужды. Демонстрационный пример представляет собой программу которая записывает по первым 16 адресам байты от 0 до 15, а после записи выводит их в порт A. Наблюдать как это работает можно не только в живую но и в Proteus’е.

Ну и напоследок прикладываю осциллограмму:

Вот так выглядит шина i2c глазами моего :-)
Все вопросы и предложения жду в комментариях.

В качестве примера реализации принципов прямого доступа к памяти (ПДП) рассмотрим микросхему КР580ВТ57. Программируемый контроллер ПДП предназначен для высокоскоростного обмена данными между памятью системы и че­тырьмя внешними устройствами (ВУ).

Контроллер осуществляет двунаправленный обмен данными между памятью и ВУ (по требованию ВУ), при этом в адресном канале микропроцессорной систе­мы формируются параметры заданного массива адресов ячеек памяти (началь­ный адрес и число циклов) и управляющие сигналы. Каждый из четырех каналов контроллера обеспечивает адресацию (путем инкрементирования выработанного адреса) внешней памяти массивами объемом до 16К байт с возможностью зада­ния любого из 64К начальных адресов.

Состав контроллера ПДП

В контроллере можно выделить следующие блоки (рис. 3.11.1): блок обработки запросов, формирователь адреса, блок логики чте­ния–записи, блок управления, буфер данных и два регистра - регистр установки режима и регистр состояния каналов. Рассмотрим их особенности.

Блок обработки запросов предназначен:

● для приема сигналов запроса ЗПДП0–ЗПДП3 на прямой доступ к памяти от ВУ;

● для маскирования входов каналов К0–К3;

● для выдачи сигналов подтверждения запроса ¯ППДП0 – ¯ППДП3 прямого доступа к памяти, информирующих ВУ о готовности контроллера к обмену данными по каналу ПДП.

Формирователь адреса содержит 16–разрядные регистры начального адреса (РНА0…РНА3) и числа циклов (РЧЦ0…РЧЦ3), схему инкремента–декремен­та, триггер. В процессе выполнения программы начальной установки в РНА запи­сывается начальный адрес ячейки памяти, к которой будет обращаться ВУ по ка­налу ПДП. В 14 младших разрядов регистра числа циклов РЧЦ заносится число N – 1, где N - число циклов. Два старших разряда этого регистра используются для управления обменом по каналу ПДП.

В каждом цикле из РНА считывается два байта адреса. Триггер обеспечивает порядок считывания: старший байт выводится через буфер данных на ШД, а младший байт адреса - по шинам А0…А3, А4…А7. По завершении цикла схема инкремента–декремента содержимое РНА увеличивает, а содержимое РЧЦ умень­шает на единицу. Следует отметить, что выводы контроллера А4…А7 всегда ис­пользуются как выходы для разрядов А4…А7 кода адреса, а выводы А0…А3 ис­пользуются:

  • как выходы для передачи младших разрядов кода адреса при работе канала ПДП;
  • как входы для выбора регистра, с которым будет происходить обмен инфор­мацией. Такая необходимость возникает при записи программы начальной установки в контроллер ПДП, а также при чтении содержимого адресного ре­гистра, регистра числа циклов или регистра состояния.

Блок логики чтения–записи

осуществляет прием, формирование и выда­чу сигналов, обеспечивающих обмен информацией между процессором и контрол­лером ПДП, памятью и ВУ. Блок логики чтения–записи имеет следующие выводы:

● ¯Зп - двунаправленный управляющий трехстабильный вход/выход, использу­емый:

Как вход для получения сигнала из процессора на запись данных во внут­ренние регистры контроллера ПДП при его начальной установке;

Как выход, на котором формируется сигнал, разрешающий внешнему уст­ройству запись данных из памяти;

● ¯Чт - двунаправленный трехстабильный управляющий вход/выход, использу­емый:

Как вход для получения из процессора сигнала, разрешающего чтение (вы­вод) содержимого внутренних регистров контроллера;

Как выход для выдачи сигнала на разрешение считывания данных из ВУ в память;

● ¯ЧтП, ¯ЗпП - выходы для управления чтением из памяти и записью в память;

● ¯ВК - вход (выбор кристалла), на который подается нулевой сигнал выбора микросхемы после того, как установлены сигналы записи или чтения. Сигнал ¯ВК инициирует обмен данными между процессором и внутренними регистра­ми контроллера ПДП при программировании; автоматически блокируется в режиме прямого доступа. Вход ¯ВК подключается к ША микропроцессорной системы непосредственно или через дешифратор.

Выводы ¯Зп, ¯Чт подключаются к процессору как входы и к ВУ как выходы, а вы­ходы ¯ЗпП, ¯ЧтП - к памяти микропроцессорной системы.

На этапе начальной установки в формирователе адреса дешифрируются младшие разряды А3…А0 кода адреса и после поступления от процессора сигна­лов ¯Зп, ¯Чт организуется запись или чтение программно доступных регистров устройства ПДП. При работе в цикле ПДП логические цепи блока чтения–записи формируют пары сигналов ¯Чт, ¯ЗпП и ¯Зп, ¯ЧтП на выходах устройства, обеспечи­вающих тактирование процесса обмена данными между ВУ и памятью.

Блок управления

регламентирует последовательность операций в течение всех циклов ПДП с помощью управляющих сигналов, а также осуществляет пере­ход контроллера из состояния ожидания в состояние обслуживания по сигналу подтверждения захвата (ПЗх). Блок управления имеет следующие выводы:

  • ЗЗх (Н RQ) - выход, с которого снимается сигнал запроса захвата для микро­процессора;
  • ПЗх (HLDA) - вход, на который поступает сигнал подтверждения захвата от микропроцессора;
  • Гт (RDY)- управляющий вход готовности. Сигнал Гт = 1 от ВУ активизирует работу контроллера ПДП; сигнал Гт = 0 переводит контроллер в состояние ожидания;
  • М128 - выход маркер 128–го цикла: М128 = 1 свидетельствует о том, что те­кущий цикл ПДП является по счету 128–м циклом от конца массива данных;
  • КС (ТС) - выход конец счета: КС = 1 указывает ВУ, что текущий цикл обмена по каналу ПДП является последним при передаче массива данных. Если раз­ряд «КС–стоп» в регистре установки режимов установлен в 1, то канал будет запрещен. Выход КС активизируется (КС = 1), когда содержимое 14–разряд­ного регистра числа циклов в данном канале устанавливается в 0;
  • РА (АЕ) - выход разрешения адреса: РА = 1 указывает системе, что происхо­дят циклы прямого доступа. При этом все шины отключаются от микропроцес­сора. Сигнал может быть использован для блокировки адресной шины в уст­ройствах, не участвующих в прямом доступе, а также для записи старших восьми разрядов кода адреса в буферный регистр адреса и отключения схе­мы выборки устройства. В режиме ПДП выборка устройства осуществляется сигналами ¯ППДП0 – ¯ППДП3;
  • СтА (STBA) - выходстроб адреса, сигнал которого стробирует старший байт адреса памяти, передаваемый через ШД в дополнительный буфер данных. Через этот буфер старший байт адреса поступает на адресную шину микро­процессорной системы;
  • ТИ - вход для тактовых импульсов;
  • Сброс -вход начальной установки устройства. Подача единичного сигнала на этот вход обнуляет содержимое всех программно доступных регистров, что приводит к отключению каналов К0 – К3.

Буфер данных представляет собой 8–разрядную двунаправленную шину с тремя состояниями, соединяющую контроллер ПДП с системной шиной дан­ных ШД.

Через буфер данных:

  • при программировании в режиме записи восемь бит данных D 7… D 0 из мик­ропроцессора передаются в контроллер ПДП для записи в регистр начально­го адреса, регистр числа циклов или регистр установки режима; при чтении процессором из устройства ПДП выводится содержимое регистра начально­го адреса, регистра числа циклов и регистра состояния каналов;
  • приработе канала ПДП в начале каждого цикла старшие восемь разрядов ад­реса передаются из адресного регистра соответствующего канала в память. Затем ШД освобождается для непосредственного обмена данными между па­мятью и ВУ в течение оставшейся части цикла. Эти данные через устройство ПДП не проходят.

Регистр установки

режимов хранит информацию о запрограммированных режимах автозагрузки, удлиненной и обычной записи, фиксированного приорите­та и циклического сдвига приоритетов, КС–стоп и др. В него при программировании контроллера ПДП записывается 8–разрядное управляющее слово. Регистр установки режима обычно загружается после того, как установлены регистр ад­реса (РгА) и регистр циклов (РгЦ). Назначение разрядов регистра установки режимов приведено в табл. 3.11.1.

Регистр состояния каналов

указывает, в каком из четырех каналов окончился процесс передачи массива. Для этого в младшие разряды РС0–РС3 (флаги завершения обслуживания) записывается значение сигнала КС = 1 конца счета, появляющегося на выходе КС и указывающего на конец массива по соот­ветствующему каналу. Назначение разрядов регистра установки режимов приве­дено в табл. 3.11.2.

Основные состояния и режимы работы устройства.

Основными состояния­ми являются исходное состояние, программирование, ожидание и обслуживание.

Исходное состояние.

При поступлении на вход Сброс единичного сигна­ла устройство переходит в исходное состояние. В этом состоянии маскируются запросы всех каналов ПДП (Р0 = Р1 = Р2 = Р3 = 0), буферные схемы шины А0…А3 переводятся в состояние приема информации.

Программирование.

В состоянии программирования устройства микро­процессор по шине данных (ШД - D 0… D 7) осуществляет запись начального ад­реса, числа циклов и других данных в соответствующие регистры, адрес которых задается кодом А 3 А 2 А 1 А 0 на шинах А0–А3 (табл. 3.11.3). Старший разряд А3 кода позволяет различать при А3 = 0 -регистры каналов К0…К3; при А3 = 1 -регистр установки режимов (работает только на запись) ирегистр состояния каналов (ра­ботает только на чтение). Младший разряд А0 выбирает регистры начального ад­реса (А0 = 0) и числа циклов (А0 = 1). Два средних разряда А 2 А 1 указывают номера регистров (или каналов) в двоичном коде. Например, код 0101 соответствует РЧЦ2 - регистру числа циклов канала 2. Регистры контроллера ПДП загружаются или из них считывается информация, если микропроцессор выполняет команду записи или чтения путем обращения к устройству и его регистрам. Для этого микропроцессору необходимо выдать соответствующие сигналы записи ¯Зп или чтения ¯Чт и на системные адресные шины ША выставить адрес регистра в виде кода А 3 А 2 А 1 А 0 . В это время на шину данных ШД подается необходимая информа­ция D 7… D 0 для записи в регистры или через шину данных ШД читается информа­ция из котроллера ПДП. Для установки состояния программирования необходимо также подать сигнал выборки устройства ¯ВК = 0. В связи с тем, что регистры кана­лов являются 16–разрядными, для их загрузки или чтения требуется два про­граммных командных цикла. Вформирователе адреса контроллера имеется триг­гер, который автоматически переключает цепи во время операции чтения или за­писи. Этот триггер определяет доступ к старшему или младшему байтам регистра. Сбрасывается триггер подачей единичного сигнала на входСброса, а также вся­кий раз при загрузке регистра установки режима.

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

Ожидание.

В состоянииожидания контроллер принимает от ВУ сигнал за­проса на получение цикла ПДП (ЗПДП0–ЗПДП3) и вырабатывает для микропро­цессора сигнал запроса захвата (ЗЗх). В этом состоянии системные шины нахо­дятся под управлением микропроцессора.

Обслуживание.

После поступления от микропроцессора сигнала подтверж­дения захвата (ПЗх) при наличии сигнала запроса (ЗПДП0 – ЗПДП3) от ВУ контрол­лер вырабатывает сигнал подтверждения запроса (¯ППДП0 – ¯ППДП3) для одного из ВУ и переходит всостояние обслуживания. В этом состоянии системные шины находятся под управлением контроллера, и реализуется один из запрограм­мированных режимов ПДП:

  • младшие 8 разрядов адреса памяти поступают на шины А0–А3, А4–А7, стар­шие 8 разрядов - на шину данных ШД;
  • формируются соответствующие сигналы управления ¯ЧтП и ¯ЗпП, ¯Зп и ¯Чт, ко­торые позволяют ВУ получить из ячейки памяти или передать в ячейку памя­ти за один цикл байт данных.

В первом цикле работы устройство ПДП передает начальный адрес ячейки па­мяти. В последующих циклах адрес увеличивается, а число циклов уменьшается на единицу, до тех пор, пока содержимое регистра числа циклов (вернее его 14 раз­рядов) не станет равным нулю. После этого формируется сигналконца счета КС и возможны следующие режимы работы:

  • дальнейшее наращивание адреса прибавлением единицы после очередного цикла;
  • блокировка канала ПДП (режим «КС–стоп»);
  • повторение ранее выбранного массива адресов (режим автозагрузки).

В процессе выполнения циклов ПДП возможны три режима работы:

  • режим чтения, обеспечивающий передачу данных из памяти во ВУ;
  • режим записи, обеспечивающий передачу данных из ВУ в память;
  • режим проверки. Вэтом режиме контроллер ПДП не генерирует сигналы ¯ЧтП, ¯ЗпП, ¯Чт и ¯Зп, что предотвращает обмен данными между памятью и ВУ. Однако в каждом цикле контроллер ПДП осуществляет управление системной шиной и подтверждает запросы ВУ. Внешние устройства могут использовать сигналы подтверждения для разрешения внутреннего доступа к каждому бай­ту в массиве данных, чтобы выполнить некоторые операции проверки. Мас­сив циклов проверки может следовать за массивом циклов чтения, чтобы раз­решить ВУ проверить вновь поступившие данные.

Контроллер встроенной флэш-памяти (EFC) является частью контроллера памяти (MC) и предоставляет интерфейс для доступа к блокам флэш-памяти по внутренней 32-битной шине. Это позволяет значительно увеличить скорость выборки команд из флэш-памяти при работе ядра процессора в режиме Thumb (16-битная система команд) благодаря работе 32-битного буфера. Более того, контроллер встроенной флэш-памяти поддерживает полный набора команд для чтения, записи, стирания флэш-памяти, установки и снятия битов защиты.

20.2 Функциональное описание

20.2.1 Организация встроенной флэш-памяти

Интерфейсы встроенной флэш-памяти непосредственно подключены к внутренней 32-битной шине, построенной на основе нескольких нижеследующих интерфейсов.

  • Простая организация памяти: нескольких страниц одинакового размера.
  • Два 32-битных буфера чтения, предназначенных для увеличения скорости чтения флэш-памяти (см. "Команды чтения" на стр. 101).
  • Один буфер записи для хранения данных при программировании одной страницы флэш-памяти. Размер этого буфера равен размеру одной страницы и доступ к нему разрешен только для записи. Кроме того, с помощью буфера записи осуществляется адресация флэш-памяти во всей области размером 1 Мбайт (см. "Команды записи" на стр. 101).
  • Несколько бит защиты (блокировочные биты) для запрета стирания и записи флэш-памяти. Каждая защищаемая область флэш-памяти (все области имею равный размер) состоит фиксированного числа страниц, размещенных последовательно. Каждая одна такая область непосредственно связана только с одним битом защиты.
  • Несколько бит энергонезависимой памяти - NVM-биты (Non Volatile Memory) общего назначения. Каждый из этих битов отвечает за управление определенными узлами микроконтроллера. Для получения более подробной информации о каждом NVM-бите см. соответствующие главы этого документа.
Размер встроенной флэш-памяти, размер её страниц и организация битов защиты описаны в главе 9 "Память" .

Таблица 20-1. Число бит защиты и NVM-бит общего назначения для членов семейства AT91SAM7S

Рисунок 20-1. Карта распределения встроенной флэш-памяти памяти

20.2.2 Команды чтения

Для ускорения процесса чтения флэш-памяти в контроллер EFC встроен специально предназначенный 32-битный буфер. Благодаря наличию этого буфера при работе процессора в режиме Thumb (16-битная система команд) обращение к флэш-памяти происходит в два раза реже, за счет чего увеличивает скорость выборки команд и, следовательно, увеличится скорость работы процессора (рис. 20-2, рис. 20-3 и рис. 20-4).

Эта оптимизация осуществляется только при выборке команд, а при чтении данных из флэш-памяти - не осуществляется.

Команды чтения могут быть выполнены как без включения дополнительных циклов ожидания, так и с ними. Допустима установка только до трех (включительно) циклов ожидания в поле FWS (Flash Wait State) регистра режима флэш-памяти MC_FMR (см. "Регистр режима флэш-памяти", стр. 110). При FWS = 0 обращение к встроенной флэш-памяти осуществляется за один цикл.

Доступ к флэш-памяти возможен 32-битный (словарный), 16-битный (полуслово) и 8-битный.

Поскольку размер встроенной флэш-памяти меньше микроконтроллера, чем размер адресного пространства выделенной для нее внутренней памяти (1 Мбайт), то в контроллере памяти реализовано т.н. дублирование этого блока флэш-памяти по всему выделенному для нее адресному пространству. Например, для AT91SAM7S64 флэш-память размером 64 Кбайта отображена в этом адресном пространстве ровно 1024/64 = 16 раз (прим. переводчика).


Рисунок 20-2. Оптимизация при чтении кода команды в режиме Thumb для FWS = 0


Рисунок 20-3. Оптимизация при чтении кода команды в режиме Thumb для FWS = 1


Рисунок 20-4. Оптимизация при чтении кода команды в режиме Thumb для FWS = 3

20.2.3 Команды записи

Область внутренней памяти, зарезервированной для встроенной флэш-памяти, также может быть записана только через специальный буфер. При выполнении команд записи во флэш-память во внимание принимаются только младшие 8 бит адреса (т.к. речь идет о 32-битных данных, то фактически во внимание принимаются 10 младших бит адреса). В свою очередь старшие 10 бит адреса внутренней области (1 Мбайт), зарезервированной для флэш-памяти, адресуют это т.н. окно, размер которого равен 256 словам (1024 байта). Тактом образом, вся эта внутренняя память состоит из 1024 таких окон.

Любая команда записи во встроенную флэш-память может быть запрещена с помощью модуля защиты памяти MPU (Memory Protection Unit).

Запись во флэш-память память возможна только словарно (32 бита), поэтому любая попытка записи полуслов (16 бит) или байт (8 бит) будет вызывать непредсказуемый результат.

Команды записи выполняются за число циклов ожидания (поле FWS в регистре MC_FMR), указанных для команд чтения, плюс еще один дополнительный цикл, кроме случая при FWS = 3 (см. "Регистр режима флэш-памяти", стр. 110).

20.2.4 Система команд контроллера флэш-памяти

В состав EFCS входят команды для программирования флэш-памяти, команды установки защиты (снятия защиты) ее областей, команды последовательного программирования и установки защиты флэш-памяти, команда полного стирания всей флэш-памяти.

Таблица 20-2. Система команд контроллера флэш-памяти

Перед выполнением любой из указанных команд в поле FCMD регистра MC_FCR должен быть указан код этой команды. Поскольку доступ к регистру MC_FCR возможен только по чтению, то флаг FRDY автоматически сбрасывается. После окончания выполнения команды флаг FRDY автоматически устанавливается, что может вызывать соответствующее прерывание, если оно разрешено через контроллер памяти (MC).

Все команды флэш-памяти защищены от случайного выполнения с помощью одного общего ключевого слова (keyword), которое необходимо указывать в старших 8 битах регистра MC_FCR каждый раз при выполнении очередной команды.

Команда с неверно указанным ключевым словом и/или неверно указанным кодом этой команды не будет выполнена, даже в том случае, если установлен флаг PROGE в регистре MC_FSR. Этот флаг будет автоматически сброшен при очередном чтении регистра MC_FSR.

Попытка выполнения команды записи или стирании страницы, размещенной в защищенной области, не окажет влияния на содержимое флэш-памяти (фактически, эта команда будет проигнорирована), даже в том случае, если установлен флаг PROGE в регистре MC_FSR. Этот флаг будет автоматически сброшен при очередном чтении регистра MC_FSR.


Рисунок 20-5. Блок-схема процесса выполнения команды

Для правильного выполнения команд флэш-памяти в поле длительность цикла в микросекундах (FMCN) в регистре режима контроллера флэш-памяти (MC_FMR) должно быть записано корректное значение (см. "Регистр режима контроллера флэш-памяти памяти", стр. 110).

20.2.4.1 Программирование флэш-памяти

Всего несколько команд могут использоваться для программирования флэш-памяти.

Согласно технологии работы флэш-памяти требуется обязательное ее стирание непосредственно перед процессом ее программирования. Может быть выполнено либо стирание всей области флэш-памяти, либо отдельной страницы с помощью сброса флага NEBP в регистре MC_FMR непосредственно записью кода команды в регистр MC_FCR.

При установке флага NEBP в регистре MC_FMR страница может быть запрограммирована за определенное число этапов, если перед этим она уже очищена (см. рис. 20-6).


Рисунок 20-6. Пример программирования участка страницы флэш-памяти

После окончания процесса программирования страница может быть защищена от случайного или преднамеренного стирания или записи (при защищается вся область, в которую входит эта страница). С помощью команды WPL защита может быть установлена автоматически сразу после окончания цикла записи страницы.

Записываемые данные хранятся во внутреннем буфере, размер которого равен размеру одной страницы флэш-памяти. Этот внутренний буфер охватывает все адресное пространство внутренней флэш-памяти, т.е. фактически может быть целиком отображен на любую из ее страниц.

Примечание: запись байтами (8 бит) или полусловами (16 бит) запрещена, т.к. как вызывает искажение записываемых данных.

Процесс записи данных во флэш-память, предварительно размещенных во внутреннем буфере, управляется с помощью командного регистра флэш-памяти (MC_FCR). Ниже приведена последовательность работы с этим регистром.

  • Запись всей страницы, которая может быть размещена по любому адресу внутри всего адресного пространства флэш-памяти, возможна только словарно (32-битные данные).
  • Цикл записи страницы начинается сразу после того, как в регистре MC_FCR указан номер этой страницы и сама код команды записи. При этом автоматически сбрасывается флаг FRDY в регистре статуса программирования флэш-памяти (MC_FSR).
  • Сразу после завершения цикла программирования устанавливается флаг FRDY в регистре статуса программирования флэш-памяти (MC_FSR). Если разрешены прерывания от флага FRDY, то в контроллере памяти (MC) возникнет соответствующий сигнал прерывания.
  • Ошибка программирования (Programming Error): в регистр MC_FSR было записано неверное ключевое слово и/или указана недопустимая команда.

20.2.4.2 Команда полного стирания флэш-памяти

Вся реализованная на кристалле флэш-память может быть очищена, если в регистре MC_FCR записана команда "стереть все" - EA (Erase All).

Стирание всей флэш-памяти возможно только тогда, когда ни одна из ее областей не защищена от стирания и записи (не установлен не один из флагов защиты флэш-памяти). В противном случае (установлен хотя бы один из флагов защиты) эта команда будет проигнорирована. Если установлен флаг LOCKE в регистре MC_FMR, то возникнет соответствующий сигнал прерывания.

После выполнения последней команды программирования или стирания флэш-памяти в регистре MC_FSR автоматически будет установлен флаг FRDY. При этом на выходе контроллера памяти (MC) сразу же возникнет сигнал соответствующего прерывания, если оно разрешено.

В процессе выполнения цикла программирования могут возникать ошибки, которые фиксируются в регистре MC_FSR. Ниже приведены эти ошибки.

  • Ошибка программирования (Programming Error): в регистр MC_FSR было записано неверное ключевое слово (keyword) и/или указана недопустимая команда.
  • Ошибка защиты (Lock Error): была осуществлена попытка программирования защищенной области. Для выполнения корректного программирования этой области ее защита предварительно должна быть снята с помощью команды снятия защиты.

20.2.4.3 Биты защиты флэш-памяти

Каждый из битов защиты привязан к определенной области флэш-памяти, состоящей из определенного числа страниц. Назначение этих битов - защита флэш-памяти от случайного или преднамеренного ее стирания/программирования.

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

Ниже указана последовательность установки защиты одной области:

В регистр команды флэш-памяти должно быть записано следующее значение: (0x5A после завершения выполнения команды защиты будет установлен флаг FRDY в регистре MC_FSR. При этом на выходе контроллера памяти (MC) сразу же возникнет сигнал соответствующего прерывания, если оно разрешено. ul>

После установки защиты ее можно снять, ниже указана последовательность снятия защиты одной области:

  • в регистр команды флэш-памяти должно быть записано следующее значение: (0x5A после завершения выполнения команды защиты будет установлен флаг FRDY в регистре MC_FSR. При этом на выходе контроллера памяти (MC) сразу же возникнет сигнал соответствующего прерывания, если оно разрешено.

Если в процесс выполнения команды возникла ошибка (в регистре MC_FCR указано неверное ключевое слово и/или неверный код команды), то это факт будет зафиксирован в регистре MC_FSR.

Выполнение команды снятия бита защиты физически выполняет запись "1" в соответствующий бит, хотя при чтении регистра MC_FSR соответствующий бит LOCKx читается как "0". И наоборот, выполнение команды установки бита защиты физически выполняет запись "0" в соответствующий бит, а при чтении регистра MC_FSR соответствующий бит LOCKx читается как "1".

Примечание: независимо от наличия защиты флэш-памяти доступ к ней по-прежнему возможен по чтению.

20.2.4.4 NVM-биты общего назначения

Биты общего назначения - NVM-биты - не связаны со встроенной флэш-памятью, а предназначены для защиты других узлов микроконтроллера. Каждый из этих битов может быть установлен (сброшен) независимо от остальных. Для получения подробностей о NVM-битах см. соответствующие главы этого документа.

Ниже приведена последовательность активации NVM-битов общего назначения.

  • Выполнение команды "установка NVM-битов общего назначения" (Set General Purpose NVM Bit - SGPB) посредством записи в "регистр команд флэш-памяти" (MC_FCR) кода этой команды и количества этих бит в поле PAGEN этого же регистра.
  • после завершения выполнения команды SGPB будет установлен флаг FRDY в регистре MC_FSR. При этом на выходе контроллера памяти (MC) сразу же возникнет сигнал соответствующего прерывания, если оно разрешено.

В процессе выполнения цикла программирования могут возникать ошибки, которые фиксируются в регистре MC_FSR. Ниже приведены эти ошибки.

  • В поле PAGEN регистра MC_FCR указано число бит общего назначения, большее, чем максимально допустимое кол-во реализованных в кристалле NVM-бит. Ниже приведена последовательность очистки NVM-битов общего назначения.
  • Выполнение команды "очистка NVM-битов общего назначения" (Clear General Purpose NVM Bit - CGPB) посредством записи в "регистр команд флэш-памяти" (MC_FCR) кода этой команды и количества этих бит в поле PAGEN этого же регистра.
  • после завершения выполнения команды CGPB будет установлен флаг FRDY в регистре MC_FSR. При этом на выходе контроллера памяти (MC) сразу же возникнет сигнал соответствующего прерывания, если оно разрешено.

В процессе выполнения цикла программирования могут возникать ошибки, которые фиксируются в регистре MC_FSR. Ниже приведены эти ошибки.

  • Ошибка программирования: в регистр MC_FSR было записано неверное ключевое слово и/или указана недопустимая команда.
  • В поле PAGEN регистра MC_FCR указано число бит общего назначения, большее, чем максимально допустимое кол-во реализованных в кристалле NVM-бит.

Выполнение команды "очистка NVM-битов общего назначения" физически выполняет запись "1" в соответствующий бит, хотя при чтении регистра MC_FSR соответствующий бит GPNVMx читается как "0". И наоборот, выполнение команды "установка NVM-битов общего назначения" физически выполняет запись "0" в соответствующий бит, а при чтении регистра MC_FSR соответствующий бит GPNVMx читается как "1".

Примечание: независимо от состояния NVM-битов общего назначения доступ к флэш-памяти всегда возможен по чтению.

20.2.4.5 Бит секретности

Бит секретности предназначается для предотвращения внешних попыток доступа к внутренней системной шине. После установки бита секретности запрещается работа интерфейса JTAG, интерфейса быстрого программирования флэш-памяти и доступ к флэш-памяти по последовательному интерфейсу. Доступ к флэш-памяти через указанные выше интерфейсы вновь разрешается только при полной очистке кристалла по внешнему выводу ERASE - см. главу 4. "Назначение выводов". При подаче на вывод ERASE высокого логического уровня (см. п. 7.4. "вывод управления стиранием") происходит очистка всей реализованной на кристалле флэш-памяти, всех битов защиты флэш-памяти, всех NVM-битов общего назначения и только после всего этого производится очистка бита секретности.

Ниже приведена последовательность установки бита секретности.

  • Выполнение команды "установка бита секретности" (Set Security Bit - SSB) посредством записи в "регистр команд флэш-памяти" (MC_FCR) кода этой команды.
  • после завершения выполнения команды SSB будет установлен флаг FRDY в регистре MC_FSR. При этом на выходе контроллера памяти (MC) сразу же возникнет сигнал соответствующего прерывания, если оно разрешено.

Сразу после установки бита секретности в регистре MC_FSR будет установлен флаг SECURITY.