Как работает память микроконтроллера
Можно выделить три основных вида памяти, используемой в микроконтроллерах. Память программ представляет собой постоянную память, предназначенную для хранения программного кода и констант. Эта память не изменяет своего содержимого в процессе выполнения программы. Память данных предназначена для хранения переменных в ходе выполнения программы. Регистры микроконтроллера - этот вид памяти включает внутренние регистры процессора и регистры, которые служат для управления периферийными устройствами.
Вас, возможно, удивит малый объем памяти микроконтроллеров. Далее вы увидите, что это не является их существенным недостатком. Но при первом знакомстве данная особенность действительно вызывает удивление, особенно, если сравнивать микроконтроллеры с современными персональными компьютерами, которые содержат десятки мегабайт памяти.
Для хранения программ обычно служит один из видов постоянной памяти:
PROM (однократно-программируемое ПЗУ),
EPROM (электрически программируемое ПЗУ с ультрафиолетовым стиранием),
EEPROM (ПЗУ с электрической записью и стиранием, к этому виду относятся также современные микросхемы Flash-памяти)
ROM (масочно-программируемое ПЗУ).
Все эти виды памяти являются энергонезависимыми - это означает, что содержимое памяти сохраняется после выключения питания микроконтроллера. Такая память необходима, так как микроконтроллер не содержит каких-либо устройств массовой памяти (магнитных дисков), с которых загружается программа в компьютерах. Программа постоянно хранится в микроконтроллере.
В процессе выполнения программа считывается из этой памяти, а блок управления (дешифратор команд) обеспечивает ее декодирование и выполнение необходимых операций. Содержимое памяти программ не может меняться (перепрограммироваться) во время выполнения программы. Поэтому функциональное назначение микроконтроллера не может измениться, пока содержимое его памяти программ не будет стерто (если это возможно) и перепрограммировано (заполнено новыми командами).
Следует обратить внимание, что разрядность микроконтроллера (8, 16 или 32 бит) указывается в соответствии с разрядностью его шины данных. В Гарвардской архитектуре команды могут иметь большую разрядность, чем данные, чтобы дать возможность считывать за один такт целую команду. Например, микроконтроллеры PIC в зависимости от модели используют команды с разрядностью 12, 14 или 16 бит. В микроконтроллерах AVR команда всегда имеет разрядность 16 бит. Однако все эти микроконтроллеры имеют шину данных разрядностью 8 бит.
Память ROM (ПЗУ) используется тогда, когда программный код заносится в микроконтроллер на этапе его производства. Предварительно программа отлаживается и тестируется, после чего передается фирме-производителю, где программа преобразуется в рисунок маски на стеклянном фотошаблоне. Полученный фотошаблон с маской используется в процессе создания соединений между элементами, из которых состоит память программ. Поэтому такую память часто называют масочно-программируемой ROM .
ROM является самым дешевым типом постоянной памяти для массового производства. Однако она имеет ряд существенных недостатков, которые привели к тому, что в последние годы этот тип памяти почти не используется. Основными недостатками являются значительные затраты средств и времени на создание нового комплекта фотошаблонов и их внедрение в производство. Обычно такой процесс занимает около десяти недель и является экономически выгодным при выпуске десятков тысяч приборов. Только при таких объемах производства обеспечивается преимущество ROM по сравнению с E ( E ) PROM . Существует также ограничение, связанное с возможностью использования таких микроконтроллеров только в определенной сфере применения, так как его программа обеспечивает выполнение жестко фиксированной последовательности операций, и не может быть использована для решения каких-либо других задач.
Электрически программируемая память EPROM состоит из ячеек, которые программируются электрическими сигналами и стираются с помощью ультрафиолетового света. Память PROM может быть запрограммирована только один раз. Эта память обычно содержит плавкие перемычки, которые пережигаются во время программирования. В настоящее время такая память используется очень редко.
Ячейка памяти EPROM представляет собой М OS-транзистор с плавающим затвором, который окружен диоксидом кремния ( SiO 2 ). Сток транзистора соединен с «землей», а исток подключен к напряжению питания с помощью резистора. В стертом состоянии (до записи) плавающий затвор не содержит заряда, и М OS-транзистор закрыт. В этом случае на истоке поддерживается высокий потенциал, и при обращении к ячейке считывается логическая единица. Программирование памяти сводится к записи в соответствующие ячейки логических нулей.
Программирование осуществляется путем подачи на управляющий затвор высокого напряжения (рис 1.7). Этого напряжения должно быть достаточно, чтобы обеспечить пробой между управляющим и плавающим затвором, после чего заряд с управляющего затвора переносится на плавающий. MOS-транзистор переключается в открытое состояние, закорачивая исток с землей. В этом случае при обращении к ячейке считывается логический нуль.
Чтобы стереть содержимое ячейки, она освещается ультрафиолетовым светом, который дает заряду на плавающем затворе достаточную энергию, чтобы он мог покинуть затвор. Этот процесс может занимать от нескольких секунд до нескольких минут.
Рис 1.7 - Ячейка памяти EPROM.
Обычно, микросхемы EPROM производятся в керамическом корпусе с кварцевым окошком для доступа ультрафиолетового света. Такой корпус довольно дорог, что значительно увеличивает стоимость микросхемы. Для уменьшения цены микросхемы EPROM заключают в корпус без окошка (версия EPROM с однократным программированием). Сокращение стоимости при использовании таких корпусов может быть настолько значительным, что эти версии EPROM в настоящее время часто используются вместо масочно-программируемых ROM .
Раньше микроконтроллеры программировались только с помощью параллельных протоколов, достаточно сложных для реализации. В настоящее время протоколы программирования современной EPROM и EEPROM памяти существенно изменились, что позволило выполнять программирование микроконтроллера непосредственно в составе системе, где он работает. Такой способ программирования получил название « in - system programming » или « ISP ». ISP-микроконтроллеры могут быть запрограммированы после того, как их припаяли на плату. При этом сокращаются расходы на программирование, так как нет необходимости в использовании специального оборудования - программаторов.
Память EEPROM ( Electrically Erasable Programmable Memory - электрически стираемая программируемая память) можно считать новым поколением EPROM памяти. В такой памяти ячейка стирается не ультрафиолетовым светом, а путем электрического соединения плавающего затвора с «землей». Использование EEPROM позволяет стирать и программировать микроконтроллер, не снимая его с платы. Таким способом можно периодически обновлять его программное обеспечение.
Память EEPROM более дорогая, чем EPROM (в два раза дороже EPROM с однократным программированием). EEPROM работает немного медленнее, чем EPROM.
Основное преимущество использования памяти EEPROM заключается в возможности ее многократного перепрограммирования без удаления из платы. Это дает огромный выигрыш на начальных этапах разработки систем на базе микроконтроллеров или в процессе их изучения, когда масса времени уходит на многократный поиск причин неработоспособности системы и выполнение последующих циклов стирания-программирования памяти программ.
Функционально Flash-память мало отличается от EEPROM . Основное различие состоит в способе стирания записанной информации. В памяти EEPROM стирание производится отдельно для каждой ячейки, а во Flash-памяти стирание осуществляется целыми блоками. Если Вы хотите изменить содержимое одной ячейки Flash-памяти, то Вам потребуется перепрограммировать целый блок (или всю микросхему). В микроконтроллерах с памятью EEPROM можно изменять отдельные участки программы без необходимости перепрограммировать все устройство.
Часто указывается, что микроконтроллер имеет Flash-память, хотя на самом деле он содержит EEPROM . В настоящее время между этими типами памяти имеется мало различий, поэтому некоторые производители используют эти термины как эквивалентные.
При первом знакомстве с описанием микроконтроллера многих удивит малый объем их оперативной памяти данных RAM , который обычно составляет десятки или сотни байт. Если микроконтроллер использует для хранения данных память EEPROM , то ее объем также не превышает нескольких десятков байт.
Если Вы пишите программы для персонального компьютера ( PC ), то у Вас, вероятно, возникнет вопрос, что можно сделать с таким маленьким объемом памяти. Вероятно, Ваши приложения для PC содержат переменные, объем которых измеряется в килобайтах, не считая используемых массивов данных. При использовании массивов требуемый объем памяти может составлять сотни килобайт. Так что же можно сделать, имея объем ОЗУ порядка 25 байт?
Дело в том, программирование для микроконтроллера выполняется по несколько другим правилам, чем программирование PC . Применяя некоторые несложные правила можно решать многие задачи с использованием небольшого объема памяти RAM . При программировании микроконтроллеров константы, если возможно, не хранятся как переменные. Максимально используются аппаратные возможности микроконтроллеров (такие как таймеры, индексные регистры), чтобы по возможности ограничить размещение данных в RAM . Это означает, что при разработке прикладных программ необходимо предварительно позаботиться о распределении ресурсов памяти. Прикладные программы должны ориентироваться на работу без использования больших массивов данных.
В микроконтроллерах RAM используется для организации вызова подпрограмм и обработки прерываний. При этих операциях содержимое программного счетчика и основных регистров (аккумулятор, регистр состояния, индексные регистры и т.д.) сохраняется и затем восстанавливается при возврате к основной программе.
Стек - это электронная структура данных, которая функционирует аналогично своей физической копии - стопки бумаг. Когда что-либо помещается в стек, то оно остается там до тех пор, пока не будет вынуто обратно. Представьте разноцветные листы бумаги, которые укладываются в стопку один на другой. Когда листы удаляются, то происходит их перемещение в обратном порядке. По этой причине, стек часто называют очередью типа LIFO ( Last In . First Out ) - «последний пришел, первый ушел».
В Принстонской архитектуре RAM используется для реализации множества аппаратных функций, включая функции стека. При этом снижается производительность устройства, так как для доступа к различным видам памяти требуются многократные обращения, которые не могут выполняться одновременно. По этой же причине Принстонская архитектура обычно требует большего количества тактов на выполнение команды, чем Гарвардская.
Процессоры Гарвардской архитектуры могут иметь три области памяти, которые адресуются параллельно (в одно и тоже время): память программ, память данных, включающая пространство ввода-вывода, и стек.
В Гарвардской архитектуре стековые операции могут производиться в памяти, специально выделенной для этой цели. Это означает, что при выполнении команды вызова подпрограммы « call » процессор с Гарвардской архитектурой выполняет несколько действий одновременно. В Принстонской архитектуре при выполнении команды « call » следующая команда выбирается после того, как в стек будет помещено содержимое программного счетчика.
Необходимо помнить, что микроконтроллеры обоих архитектур имеют ограниченную емкость памяти для хранения данных. Превышение этого предела может вызвать проблемы при выполнении программы.
Если в процессоре выделен отдельный стек, и объем записанных в него данных превышает его емкость, то происходит циклическое изменение содержимого указателя стека, и указатель стека начинает ссылаться на ранее заполненную ячейку стека. Это означает, что после слишком большого количества команд « call » в стеке окажется неправильный адрес возврата, который был записан вместо правильного адреса. Если микропроцессор использует общую область памяти для размещения данных и стека, то существует опасность, что при переполнении стека произойдет запись в область данных, либо будет сделана попытка записи загружаемых в стек данных в область ROM .
Теперь рассмотрим возможности сохранения в стеке содержимого регистров. В некоторых архитектурах нет команд, выполняющих загрузку содержимого регистров в стек « push » и извлечения из стека « pop ». Однако команды « push » и « pop » могут быть легко реализованы при помощи индексного регистра, который явно указывает на область стека. При этом вместо каждой из команд « push » и « pop » используются две команды, указанные ниже:
Push : ;загрузка данных в стек
move [ index ], А ;сохранить содержимое аккумулятора в стеке
Decrement index ;перейти к следующей ячейке стека
Pop : ;извлечение данных из стека
increment index ;перейти к предыдущей ячейке стека
move А, [ index ] ;поместить значение стека в аккумулятор
Конечно такое решение является менее эффективным, чем использование специальных команд « push » и « pop », а используемый индексный регистр может потребоваться для других целей. Однако это решение обеспечивает имитацию стека при использовании процессоров, у которых такие команды отсутствуют.
Существует еще одна проблема с приведенным выше примером. Что случится, если произойдет прерывание между первой и второй командой, которые имитируют операции « push » и « pop »? Если программа обработки прерывания использует стек, то записанные в нем данные будут потеряны. Для предотвращения этого можно запретить прерывания перед выполнением этих команд или переставить их в следующем порядке:
Push : ;загрузка данных в стек
Decrement index ;перейти к следующей ячейке стека
move [ index ], А ;сохранить содержимое аккумулятора в стеке
Pop : ;извлечение данных из стека
move А, [ index ] ;поместить значение стека в аккумулятор
increment index ;перейти к предыдущей ячейке стека
Если после первой команды программа будет прервана, то после выполнения обработки прерывания содержимое стека не будет потеряно.
Наверняка вы уже знаете, как устроен компьютер. Даже на бытовом уровне вы представляете, что такое память RAM и ROM. Также знаете, что информация в компьютере представляется в двоичной форме. Однако этих знаний нам недостаточно для того, чтобы начать работать с микроконтроллером.
Помимо уже упомянутых видов памяти и непосредственно самого процессорного ядра в микроконтроллер входит регулятор напряжения, генератор тактового сигнала, системная шина, различные контроллеры, блок системы прерываний, периферийные устройства и т.д.
Однако, первое, с чем нам придется ознакомиться – с особым видом памяти под названием «регистр».
Что такое регистр?
Регистр (англ. register) – это устройство, расположенное внутри ядра микроконтроллера (или процессора), для хранения n-разрядных двоичных данных и выполнения преобразований над ними. Скорость их работы очень высока. Регистр представляет собой упорядоченный набор триггеров, или переключателей (англ. trigger), способных принимать значение «0» (потенциал равен 0 вольт) или «1» (потенциал равен рабочему напряжению для внутренностей МК, в нашем случае это 1,8 вольта). Число триггеров n соответствует числу разрядов в слове. В свою очередь, машинное слово — платформозависимая величина, измеряемая в битах (или байтах) и равная разрядности регистров процессора и/или разрядности шины данных. Так, например, наш микроконтроллер является 32-разрядным, а это значит, что слово состоит из 32 бит (или из 4 байт). Специальные регистры — это часть RAM-памяти. Их функции определены производителем и не могут быть изменены. Все биты (триггеры) такого регистра подсоединены к определенным цепям внутри микроконтроллера, т. е. изменение состояния триггера напрямую влияет на работу микроконтроллера (отдельных его частей/цепей). Например, записав «0» в ячейку памяти регистра, отвечающего за порт ввода/вывода, вы определяете его функцию: будет он работать на вход (т. е. принимать сигналы) или на выход (т. е. посылать сигналы).
Так как мы будем использовать язык программирования Си, то будет правильно напомнить некоторые операции, которые позволят нам быстро и удобно настраивать необходимые биты в регистре. Первое, что стоит вспомнить – это операции побитового смещения. Допустим, нам нужно получить число 8. Мы уже знаем что 810 равно 10002. Таким образом, чтобы получить 8, нам всего-то нужно передвинуть в памяти «1» на три позиции влево. Сделать это можно так:
Можно выделить три основных вида памяти, используемой в микроконтроллерах:
● память программ, которая представляет собой постоянную память, предназначенную для хранения программного кода и констант. Эта память не изменяет своего содержимого в процессе выполнения программы;
● память данных, предназначенная для хранения переменных (результатов) в ходе выполнения программы;
● регистровая память, состоящая из внутренних регистров микроконтроллера. Рассмотрим особенности каждого из перечисленных видов памяти.
Память программ.
Необходимость такой памяти вызвана тем, что микроконтроллер не содержит таких устройств памяти, как винчестер в компьютере, с которого загружается исполняемая программа. Поэтому код программы должен постоянно храниться в микроконтроллере.
Все типы памяти программ относятся к энергонезависимой памяти, или постоянной памяти (ПЗУ), содержимое которой сохраняется после выключения питания микроконтроллера.
В процессе выполнения программа считывается из этой памяти, а блок управления (дешифратор команд) обеспечивает ее декодирование и выполнение необходимых операций. Содержимое памяти программ не может меняться (перепрограммироваться) во время выполнения программы. Поэтому функциональное назначение микроконтроллера не может измениться, пока содержимое его памяти программ не будет стерто (если это возможно) и перепрограммировано (заполнено новыми командами).
Следует обратить внимание, что разрядность микроконтроллера (8, 16 или 32 бит) указывается в соответствии с разрядностью его шины данных.
Когда говорится, что устройство является 8–разрядным, это означает разрядность данных, которые способен обрабатывать микроконтроллер.
В Гарвардской архитектуре команды могут иметь большую разрядность, чем данные, чтобы дать возможность считывать за один такт целую команду. Например, микроконтроллеры PIC в зависимости от модели используют команды с разрядностью 12, 14 или 16 бит. В микроконтроллерах AVR команда всегда имеет разрядность 16 бит. Однако все эти микроконтроллеры имеют шину данных разрядностью 8 бит.
В устройствах с Принстонской архитектурой разрядность данных обычно определяет разрядность (число линий) используемой шины. В микроконтроллерах Motorola 68НС05 24–разрядная команда размешается в трех 8–разрядных ячейках памяти программ. Для полной выборки такой команды необходимо произвести три цикла считывания этой памяти.
Выделим и рассмотрим пять типов энергонезависимой резидентной памяти, или постоянных запоминающих устройств (ПЗУ), используемых для хранения программ.
Масочная память.
Масочные ПЗУ (Mask–ROMили просто ROM) изготавливаются на этапе производства микроконтроллеров для полностью отлаженной программы. На стеклянном фотошаблоне при использовании программы создается рисунок маски. Полученный фотошаблон с маской используется для формирования соединений между элементами, из которых состоит память программ.
Первые масочные ПЗУ появились в начале 1960–х годов и находят применение до настоящего времени благодаря таким достоинствам как низкая стоимость при массовом производстве изделий и высокая надежность хранения программ.
Недостатки масочных ПЗУ — любое изменение прикладной программы связано со значительными затратами средств и времени на создание нового комплекта фотошаблонов и их внедрение в производство.
Однократно программируемая память.
Эта память (One–Time Program mable ROM — OTPROM ) программируется пользователем и в исходном состоянии содержит ячейки с единичными битами. Программированию подлежат только те ячейки памяти, содержимое которых должно принять значение 0. Для этого на ячейку памяти подают последовательность импульсов повышенного напряжения.
Уровень напряжения, число импульсов и их временные параметры должны строго соответствовать техническим условиям. После записи нуля восстановить единичное значение невозможно. По этой причине память получила название однократно программируемых ПЗУ. Однако следует указать на возможность допрограммирования (не тронутых) ячеек с единичными битами.
Микроконтроллеры с однократно программируемым ПЗУ используются в изделиях, выпускаемых небольшими партиями.
Репрограммируемая память с ультрафиолетовым стиранием.
Ячейка памяти с ультрафиолетовым стиранием (Erasable Programmable ROM — EPROM) представляет собой ЛИПЗМОП (лавинно–инжекционный с плавающим затвором) транзистор. В исходном состоянии (до записи) при обращении к ячейке считывается логическая единица. Программирование памяти сводится к записи в соответствующие ячейки логических нулей. Память ЕР ROM допускают многократное программирование, технология которого подобна технологии однократно программируемых ПЗУ.
Перед каждым сеансом программирования выполняется операция стирания для восстановления исходного состояния ячеек памяти. Для этого в корпусе микроконтроллера предусмотрено специальное окно, которое облучается ультрафиолетовыми лучами. Число сеансов стирания/программирования ПЗУ составляет 25–100 раз при соблюдении технологии программирования (заданные значения питающих напряжений, число и длительность импульсов) и технологии стирания (волновой диапазон источника ультрафиолетового излучения).
Микроконтроллеры с памятью EPROM из–за высокой стоимости применяются в опытных образцах разрабатываемых приложений.
Для уменьшения цены микросхемы EPROM заключают в корпус без окошка (версия EPROM с однократным программированием). Благодаря снижению стоимости версии EPROM часто используются вместо масочно–программируемых ROM.
Репрограммируемая память с электрическим стиранием.
В качестве элемента памяти с электрическим стиранием (Electrically Erasable Pro grammable ROM — EEPROM или E2 PROM) используется транзистор со структурой МНОП (Металл, Нитрид кремния, Окисел кремния, Полупроводник), благодаря чему ПЗУ имеет сравнительно низкую стоимость (по отношению к EPROM) и допускает максимальное число циклов стирания/программирования 10 4 –10 6 . Кроме того, технология программирования памяти EEPROM позволяет реализовать побайтное стирание и побайтное программирование, не снимая контроллер с платы, что позволяет периодически обновлять его программное обеспечение.
Несмотря на указанные достоинства, этот тип памяти не получил широкого распространения для хранения программ по двум причинам:
● ПЗУ типа EEPROM имеют ограниченную емкость;
● появились ПЗУ типа FLASH , которые имеют близкие пользовательские характеристики, но более низкую стоимость.
Память типа FLASH.
Электрически программируемая и электрически стираемая память типа FLASH (FLASH ROM) создавалась как альтернатива между дешевыми однократно программируемыми ПЗУ большой емкости и дорогими EEPROM ПЗУ малой емкости. Память FLASH (как и EEPROM) сохранила возможность многократного стирания и программирования.
Из схемы ПЗУ изъят транзистор адресации каждой ячейки, что, с одной стороны, лишило возможности программировать каждый бит памяти отдельно, с другой стороны, позволило увеличить объем памяти. Поэтому память типа FLASH стирается и программируется страницами или блоками.
Таким образом, функционально FLASH –память мало отличается от EEPROM. Основное отличие состоит в способе стирания записанной информации: если в EEPROM–памяти стирание производится отдельно для каждой ячейки, то во FLASH –памяти — целыми блоками. В микроконтроллерах с памятью EEPROM приходится изменять отдельные участки программы без необходимости перепрограммирования всего устройство.
В настоящее время МК с FLASH начинают вытеснять МК с однократно программируемым (и даже масочным) ПЗУ.
Программирование ПЗУ.
Отметим, что Mask ROM –память программируется только в заводских условиях при изготовлении МК. Память типа OTPROM и EPROM предоставляет разработчику возможности программирования с использованием программатора и источника повышенного напряжения, которые подключаются к соответствующим выводам МК.
Память EEPROM и FLASH относится к многократно программируемой, или репрограммируемой, памяти. Необходимое для стирания/программирования повышенное напряжение питания создается в модулях EEPROM и FLASH –памяти современных контроллеров с помощью встроенных схем усиления напряжения, называемых генераторами накачки. Благодаря реализации программного управления включением и отключением генератора накачки появилась принципиальная возможность осуществить программирование или стирание ячеек памяти FLASH и EEPROM в составе разрабатываемой системы. Такая технология программирования получила название программирования в системе (In System Programming — ISP).
Она не требует специального оборудования (программаторов), благодаря чему сокращаются расходы на программирование. Микроконтроллеры с ISP–памятью могут быть запрограммированы после их установки на плату конечного изделия.
Рассмотрим, как реализуется (и используется) возможность программирования EEPROM–памяти под управлением прикладной программы. Если программу с алгоритмом программирования хранить в отдельном модуле памяти с номинальным питающим напряжением, а EEPROM–память снабдить генераторами накачки, то можно произвести ISP–программирование EEPROM –памяти. Данное обстоятельство делает EEPROM –память идеальным энергонезависимым запоминающим устройством для хранения изменяемых в процессе эксплуатации изделия настроек пользователя. В качестве примера можно привести современный телевизор, настройки каналов которого сохраняются при отключении питания.
Поэтому одной из тенденций совершенствования резидентной памяти 8–разрядных МК стала интеграция на кристалл МК двух модулей энергонезависимой памяти: FLASH (или OTP ) — для хранения программ и EEPROM — для хранения перепрограммируемых констант.
Рассмотрим технологию (ре)программирования FLASH –памяти с встроенным генератором накачки под управлением прикладной программы. Прежде всего, отметим два обстоятельства:
● если для хранения перепрограммируемых констант в МК встроена память EEPROM, то попрограммирование нескольких бит FLASH –памяти при эксплуатации готового изделия не имеет смысла. При необходимости лучше сразу использовать режим репрограммирования;
● не следует программу программирования FLASH –памяти хранить в самой FLASH –памяти, так как переход в режим программирования приведет к невозможности дальнейшего ее считывания. Программа программирования должна располагаться в другом модуле памяти.
Для реализации технологии программирования в системе выбирается один из оследовательных портов МК, обслуживание которого осуществляет специальная программа монитора связи, расположенная в резидентном масочном ПЗУ МК. Через последовательный порт персональный компьютер загружает в ОЗУ МК программу программирования и прикладную программу, которая затем заносится в память FLASH. Так как резидентное ОЗУ МК имеет незначительный объем, то прикладная программа загружается отдельными блоками (порциями). Если в МК установлен модуль масочной памяти с программой программирования, в ОЗУ загружается только прикладная программа.
Микроконтроллеры, реализующие технологию программирования в системе, часто имеют в своем составе четыре типа памяти:
FLASH –память программ, Mask ROM –память монитора связи, EEPROM –память для хранения изменяемых констант и ОЗУ промежуточных данных.
Технология программирования в системе в настоящее время все шире используется для занесения прикладных программ в микроконтроллеры, расположенные на плате конечного изделия. Ее достоинство — отсутствие программатора и высокая надежность программирования, обусловленная стабильностью заданных внутренних режимов МК.
В качестве примера приведем показатели резидентной FLASH –памяти МК семейства НС08 фирмы Motorola:
● гарантированное число циклов стирания/программирования — 10 5 ;
● гарантированное время хранения записанной информации — 10 лет, что практически составляет жизненный цикл изделия; модули FLASH –памяти работают и программируются при напряжении питания МК от 1,8 до 2,7 В;
● эквивалентное время программирования 1 байта памяти — 60 мкс.
Память данных.
В качестве резидентной памяти данных используется статическое оперативное запоминающее устройство (ОЗУ), позволяющие уменьшать частоту тактирования до сколь угодно малых значений. Содержимое ячеек ОЗУ (в отличие от динамической памяти) сохраняется вплоть до нулевой частоты. Еще одной особенностью статического ОЗУ является возможность уменьшения напряжения питания до некоторого минимально допустимого уровня, при котором программа управления микроконтроллером не выполняться, но содержимое в ОЗУ сохраняется.
Уровень напряжения хранения имеет значение порядка одного вольта, что позволяет для сохранения данных при необходимости перевести МК на питание от автономного источника (батарейки или аккумулятора). Некоторые МК (например, DS5000 фирмы Dallas Semiconductor) имеют в корпусе автономный источник питания, гарантирующий сохранение данных в ОЗУ на протяжении 10 лет.
Характерной особенностью микроконтроллеров является сравнительной небольшой объем (сотни байт) оперативной памяти (ОЗУ), используемой для хранения переменных. Это можно объяснить несколькими факторами:
● стремлением к упрощению аппаратных средств МК;
● использованием при написании программ некоторых правил, направленных на сокращение объема памяти ОЗУ (например, константы не хранятся как переменные);
● распределением ресурсов памяти таким образом, чтобы вместо размещения данных в ОЗУ максимально использовать аппаратные средства (таймеры, индексные регистры и др.);
● ориентацией прикладных программы на работу без использования больших массивов данных.
Особенности стека.
В микроконтроллерах для организации вызова подпрограмм и обработки прерываний выделяется часть памяти ОЗУ, именуемая стеком. При этих операциях содержимое программного счетчика и основных регистров (аккумулятора, регистра состояния, индексных и других регистров) сохраняется, а при возврате к основной программе восстанавливается. Напомним, что стек работает по принципу: последний пришел — первый ушел (Last In , First Out—LIFO).
В Принстонской архитектуре ОЗУ используется для реализации многих аппаратных функций, включая функции стека. В адресном пространстве памяти выделены отдельные области для команд, регистров общего назначения, регистров специальных функций и др. Это снижает производительность контроллера, так как обращения к различным областям памяти не могут выполняться одновременно.
Микропроцессоры с Гарвардской архитектурой могут параллельно (одновременно) адресовать память программ, память данных (включающую пространство ввода–вывода) и стек.
Например, при активизации команды вызова подпрограммы CALL выполняется несколько действий одновременно.
В Принстонской архитектуре при выполнении команды CALL следующая команда выбирается только после того, как в стек будет помещено содержимое программного счетчика.
Из–за небольшой емкости ОЗУ в микроконтроллерах обеих архитектур могут возникнуть проблемы при выполнении программы:
● если выделен отдельный стек, то после его заполнения происходит циклическое изменение содержимого указателя стека, в результате чего указатель стека начинает ссылаться на ранее заполненную ячейку стека. Поэтому после слишком большого количества команд CALL в стеке окажется неправильный адрес возврата, который был записан вместо правильного адреса;
● если микропроцессор использует общую область памяти для размещения данных и стека, то при переполнении стека произойдет затирание данных. Рассмотрим особенности сохранения в стеке содержимого регистров, обусловленные отсутствием команд загрузки в стек (PUSH) и извлечения из стека (POP). В таких микроконтроллерах вместо команды PUSH и POP используются две команды и индексный регистр, который явно указывает на область стека. Последовательность команд должна быть такой, чтобы прерывание между первой и второй командой не привело к потере данных. Ниже приведена имитация команд PUSH и POP с учетом указанного требования.
PUSH ; Загрузить данные в стек decrement index; Перейти к следующей ячейке стека move [ index], асе ; Сохранить содержимое аккумулятора в стеке POP ; Извлечь данные из стека move асе, [index]; Поместить значение стека в аккумулятор increment index ; Перейти к предыдущей ячейке стека
Если после первой команды программа будет прервана, то после выполнения обработки прерывания содержимое стека не будет потеряно.
Регистровая память.
Микроконтроллеры (как и компьютерные системы) имеют множество регистров, которые используются для управления различными внутренними узлами и внешними устройствами. К ним относятся:
● регистры процессорного ядра (аккумулятор, регистры состояния, индексные регистры);
● регистры управления (регистры управления прерываниями, регистры управления таймером);
● регистры ввода/вывода данных (регистры данных и регистры управления параллельным, последовательным или аналоговым вводом/выводом).
По способу размещения регистров в адресном пространстве можно выделить:
● микроконтроллеры, в которых все регистры и память данных располагаются в одном адресном пространстве, т. е. регистры совмещены с памятью данных. В этом случае устройства ввода–вывода отображаются на память;
● микроконтроллеры, в которых устройства ввода/вывода отделены от общего адресного пространства памяти. Основное достоинство способа размещения регистров ввода–вывода в отдельном пространстве адресов — упрощается схема подключения памяти программ и данных к общей шине. Отдельное пространство ввода–вывода дает дополнительное преимущество процессорам с Гарвардской архитектурой, обеспечивая возможность считывать команду во время обращения к регистру ввода–вывода.
Способы обращения к регистрам оказывают существенное влияние на их производительность. В процессорах с RISC–архитектурой все регистры (часто и аккумулятор) располагаются по явно задаваемым адресам, что обеспечивает более высокую гибкость при организации работы процессора.
О внешней памяти.
В тех случаях, когда для разрабатываемых приложений не хватает резидентной памяти программ и памяти данных, к микроконтроллеру подключается дополнительная внешняя память. Известны два основных способа:
● подключение внешней памяти с использованием шинного интерфейса (как в микропроцессорных системах). Для такого подключения многие микроконтроллеры имеют специальные аппаратные средства;
● подключение памяти к устройствам ввода–вывода, При этом обращение к памяти осуществляется через эти устройства программными средствами. Такой способ позволяет использовать простые устройства ввода/вывода без реализации сложных шинных интерфейсов. Выбор способа зависит от конкретного приложения.
данных SRAM (ОЗУ), энергонезависимая EEPROM-память данных, а также конфигурационные ячейки, ячейки защиты, калибровочные ячейки и ячейки идентификаторов. Возможность доступа к различным ресурсам памяти приведена в табл.1.
Табл.1. Возможность доступа к различным ресурсам памяти.
Последовательное
программирование при низком напряжении
Параллельное и последовательное
программирование при высоком напряжении
Калибровочные
ячейки и ячейки идентификатора
Память программ FLASH
Коды программ микроконтроллера размещаются в энергонезависимом ПЗУ, выполненной по технологии FLASH. При нормальных условиях эксплуатации, FLASH-память позволяет сохранять свое содержимое в неизменном виде в течение 40 лет и допускает как минимум 10000 циклов стирания/записи.
Рис.5 Организация FLASH памяти программ ATmega8
Организация памяти программ, на примере ATmega8, приведена на рис.5. Размер FLASH-памяти этой модели составляет 8192 байт. Но, поскольку каждая команда занимает 2 или 4 байта, то по отношению к AVR точнее будет говорить об объеме в 4096 слов. Такая размерность определяет максимально возможное число слов команд (кодов операций), доступное при написании программы.
Для адресации памяти программ используется программный счетчик PC (Program Counter) (другое название: регистр или счетчик команд). Он представляет собой регистр, в котором находится текущей адрес команды во FLASH-памяти. Таким образом, счетчик команд адресует 16-разрядные слова, а не байты, и имеет переменную разрядность, которая зависит от размера FLASH. Так у ATmega8 (4096 слов), PC имеет разрядность 12 бит, у ATmega16 (8192 слова) - 13 бит и т.д. В архитектуре AVR, PC является недоступным для программиста регистром.
Помимо своего основного назначения (хранение команд), FLASH-память AVR-микроконтроллеров также позволяет хранить пользовательские данные произвольного типа: константы, таблицы, постоянные коэффициенты и т.д. Минимальный адресуемый элемент в этом случае 1 байт. Доступ к таким данным из прикладной программы производится различными модификациями инструкции lpm.
Как правило, алгоритмы работы микроконтроллера, записанные в памяти программ, не должны изменяться во времени. Однако у AVR все-таки имеется возможность модифицировать содержимое FLASH посредством собственного программного обеспечения. Обсуждению этого вопроса посвящена глава «Самопрограммирование микроконтроллеров AVR». Там же показан и другой способ разделения FLASH на секцию прикладной программы (Application Section) и секцию загрузчика (Boot Loader Section). Изменять содержимое памяти программ можно только из области загрузчика.
В процессе программирования запись во FLASH-память происходит постранично. Размер страницы зависит от объема памяти конкретной модели и может быть равен 32, 64 или 128 слов.
Читайте также: