Память
В данном разделе описываются различные виды памяти ATmega128. В соответствии с гарвардской архитектурой память AVR-микроконтроллера разделена на две области: память данных и память программ. Кроме того, ATmega128 содержит память на ЭСППЗУ для энергонезависимого хранения данных. Все три области памяти являются линейными и равномерными.
Внутрисистемно программируемая флэш-память программ
ATmega128 содержит 128 кбайт внутренней внутрисистемно перепрограммируемой флэш-памяти для хранения программы. Поскольку все AVR-инструкции являются 16 или 32-разр., то флэш-память организована как 64 кбит х 16. Для программной защиты флэш-память программ разделена на два сектора: сектор программы начальной загрузки и сектор прикладной программы.
Флэш-память характеризуется износостойкостью не менее 10000 циклов запись/стирание. Программный счетчик РС у ATmega128 является 16-разр., поэтому, позволяет адресоваться к 64 кбайт памяти программ. Работа сектора программы начальной загрузки и связанных с ним бит защиты программы детально описана в разделе “Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи”. В разделе “Программирование памяти” детально описывается параллельное программирование флэш-памяти и последовательное программирование через интерфейсы SPI, JTAG.
Таблицы констант могут располагаться в пределах всего пространства памяти программ (см. описание инструкции чтения из памяти программ LPM и расширенного чтения из памяти программ ELPM).
Временные диаграммы выборки и исполнения инструкций представлены в разделе “Временная диаграмма выполнения инструкции”.
Рисунок 8- Карта памяти программ
Статическое ОЗУ памяти данных
ATmega128 поддерживает две различные конфигурации статического ОЗУ памяти данных (см. табл. 1).
Таблица 1 – Конфигурации памяти
Конфигурация |
Встроенное статическое ОЗУ памяти данных |
Внешнее статическое ОЗУ памяти данных |
Нормальный режим |
4096 |
до 64 кбайт |
Режим совместимости с ATmega103 |
4000 |
до 64 кбайт |
Рисунок 9 иллюстрирует организацию памяти на статическом ОЗУ у ATmega128.
ATmega128 – сложный микроконтроллер с большим числом периферийных устройств, которые управляются через 64 ячейки памяти, зарезервированных в кодах операций инструкций IN и OUT. Для расширенной области ввода-вывода в статическом ОЗУ по адресам $60 - $FF необходимо использовать только инструкции ST/STS/STD и LD/LDS/LDD. Область расширенного ввода-вывода не существует при переводе ATmega128 в режим совместимости с ATmega103.
В нормальном режиме первые 4352 ячейки памяти данных относятся к файлу регистров, памяти ввода-вывода, расширенной памяти ввода-вывода и встроенному статическому ОЗУ данных. В первых 32 ячейках расположен файл регистров, следующие 64 ячейки занимает стандартная память ввода-вывода, а за ними следуют 160 ячеек расширенной памяти ввода-вывода. Замыкают внутреннюю память данных 4096 ячеек внутреннего статического ОЗУ данных.
В режиме совместимости с ATmega103 первые 4096 ячеек памяти данных относятся к файлу регистров, памяти ввода-вывода и внутреннему статическому ОЗУ данных. В первых 32 ячейках расположен файл регистров, затем в 64 ячейках расположена стандартная память ввода-вывода и следующие 4000 ячейки занимает внутреннее ОЗУ данных.
Совместно с ATmega128 по выбору может использоваться статическое ОЗУ. Это статическое ОЗУ будет занимать оставшуюся часть от адресного пространства размером 64 кбайт. Данная часть начинается с адреса следующего за внутренним статическим ОЗУ. Файл регистров, память ввода-вывода, память расширенного ввода-вывода и внутреннее статическое ОЗУ занимают младшие 4352 байта в нормальном режиме и младшие 4096 байта в режиме совместимости с ATmega103. (отсутствует память расширенного ввода-вывода). Таким образом, при использовании внешней памяти размером 64 кбайт (65536 байт) из них будет доступно 61184 байта в нормальном режиме и 61440 байта в режиме совместимости с ATmega103. См. раздел “Интерфейс внешней памяти” для детального изучения методов использования внешней памяти.
Доступ к внешнему статическому ОЗУ осуществляется автоматически с помощью тех же инструкций, что и для внутреннего ОЗУ, если указанное значение адреса находится за пределами внутренней памяти данных. При адресации внутренней памяти сигналы чтения и записи внешней памяти (выводы PG0 и PG1) неактивны в процессе всего цикла доступа. Работа внешнего статического ОЗУ разрешается путем установки бита SRE в регистре MCUCR.
Доступ к внешнему статическому ОЗУ требует еще одного машинного цикла на байт по сравнению с доступом к внутреннему статическому ОЗУ. Это означает, что на выполнение команд LD, ST, LDS, STS, LDD, STD, PUSH и POP потребуется один дополнительный цикл. Если стек будет размещен во внешнем статическом ОЗУ, то, соответственно, вызов и возврат из подпрограмм и процедур обработки прерываний будет длиться на три машинных цикла дольше за счет помещения в стек и извлечения из стека двухбайтного счетчика программы и не использования во время доступа к внешней памяти преимущества конвейерного доступа к внутренней памяти. Если интерфейс внешнего статического ОЗУ используется с состояниями ожидания (со сниженным быстродействием), то однобайтный внешний доступ потребует 2, 3 или 4 дополнительных машинных цикла для 1, 2 и 3 состояний ожиданий, соответственно. Таким образом, вызов и возврат из прерываний и подпрограмм потребует еще 5, 7 и 9 машинных циклов (в отличие от значений приведенных в описании набора инструкций) для 1, 2 и 3 состояний ожидания, соответственно.
Реализовано пять различных способов адресации для охвата всей памяти: прямая, косвенная со смещением, косвенная, косвенная с предварительным декрементом и косвенная с последующим инкрементом. Регистры R26…R31 из файла регистров используются как регистры-указатели для косвенной адресации.
Прямая адресация позволяет адресоваться ко всей памяти данных.
Косвенная адресация со смещением позволяет адресовать 63 ячейки, начиная с адреса указанного в регистрах Y или Z.
При использовании инструкции косвенной адресации с предварительным декрементом и последующим инкрементом значения адресных регистров X, Y и Z, соответственно декрементируются до или инкрементируются после выполнения инструкции.
32 рабочих регистров общего назначения, 64 регистра ввода-вывода и 4096 байт внутреннего статического ОЗУ данных в ATmega128 доступны с помощью всех этих режимов адресации. Файл регистров описывается в разделе “Файл регистров общего назначения”.
Рисунок 9 – Карта памяти данных
Временная диаграмма доступа к памяти
В данном разделе описывается общая концепция доступа к внутренней памяти.
Доступ к внутреннему статическому ОЗУ выполняется за два машинных цикла в соответствии с рисунком 10.
Рисунок 10 – Временная диаграмма доступа к встроенному статическому ОЗУ данных
Память данных на ЭСППЗУ
ATmega128 содержит 4 кбайт памяти данных на ЭСППЗУ. Она организована как отдельная область памяти данных, в которой один байт может быть записан и считан. ЭСППЗУ характеризуется износостойкостью 100000 циклов чтения/записи.
В разделе “Программирование памяти” содержится детальное описание программирование ЭСППЗУ через интерфейсы SPI, JTAG или параллельное программирование.
Чтение и запись ЭСППЗУ
Доступ к ЭСППЗУ осуществляется через специальные регистры, расположенные в пространстве ввода-вывода.
Время записи в ЭСППЗУ приведено в табл. 2. Функция самосинхронизации позволяет программно определить возможность записи следующего байта. Если код программы содержит инструкции записи в ЭСППЗУ, то должны быть приняты следующие меры предосторожности. У источников питания с хорошей фильтрацией напряжение VCC медленно нарастает/спадает при подаче/снятии питания. По этой причине микроконтроллер в течение некоторого периода времени может оказаться под меньшим напряжением питания, чем требуется для заданной тактовой частоты. См. раздел “Предотвращение повреждения данных в ЭСППЗУ” для детального изучения методов разрешения данной проблемы.
В целях предотвращения неумышленной записи в ЭСППЗУ должна быть выполнена специфическая процедура записи. Детально этот вопрос рассматривается при описании Управляющего регистра ЭСППЗУ.
Когда происходит считывание ЭСППЗУ ЦПУ задерживается на 4 машинных цикла до выполнения следующей инструкции. Во время записи в ЭСППЗУ ЦПУ задерживается на два машинных цикла до выполнения следующей инструкции.
Адресные регистры ЭСППЗУ – EEARH и EEARL
Разряды 15..12 – Резерв
Данные зарезервированные разряды считываются как 0. При записи в данных разрядах необходимо указывать нули для совместимости с новыми версиями микроконтроллеров.
Разряды 11..0 – EEAR11..0: Адрес ячейки ЭСППЗУ
Регистры адреса ЭСППЗУ – EEARH и EEARL – определяют адрес ячейки ЭСППЗУ в 4 кбайтном пространстве. Байтные ячейки ЭСППЗУ адресуются линейно в диапазоне адресов 0…4096. Начальное значение EEAR неопределенное. Необходимое значение адреса должно быть записано до начала доступа к ЭСППЗУ.
Регистр данных ЭСППЗУ –EEDR
Разряды 7…0 – EEDR7.0: Данные ЭСППЗУ
Для выполнения записи в ЭСППЗУ в регистр EEDR необходимо указать записываемые данные, которые будут записаны по адресу, указанному в регистре EEAR. После выполнения чтения из ЭСППЗУ в регистре EEDR содержатся считанные данные из ячейки по адресу указанному в EEAR.
Регистр управления ЭСППЗУ – EECR
Разряды 7…4 – Резерв
Данные разряды у ATmega128 зарезервированы и считываются как 0.
Разряд 3 – EERIE: Разрешение прерывания по готовности ЭСППЗУ
Запись в EERIE 1 разрешает прерывание по готовности ЭСППЗУ, если кроме того установлен бит I в регистре SREG. Запись в EERIE нуля отключает это прерывание. Прерывание по готовности ЭСППЗУ генерируется, если бит EEWE сброшен.
Разряд 2 – EEMWE: Главное разрешение записи в ЭСППЗУ
Бит EEMWE разрешает установку бита EEWE, инициирующего запись в ЭСППЗУ. Данные будут записаны в ЭСППЗУ по указанному адресу, если в EEMWE записать 1, а затем в течение 4 машинных циклов записать 1 в EEWE. Если EEMWE=0, то запись в EEWE лог. 1 не вызовет никаких действий. После программной установки бита EEMWE он автоматически сбрасывается аппаратно по истечении четырех машинных циклов.
Разряд 1 – EEWE: Разрешение записи в ЭСППЗУ
Сигнал разрешения записи EEWE является стробирующим сигналом записи для ЭСППЗУ. Для записи в ЭСППЗУ после корректной установки адреса и данных необходимо установить бит EEWE. Перед установкой бита EEWE должен быть установлен бит EEWE, иначе запись в ЭСППЗУ не произойдет. При выполнении операции записи в ЭСППЗУ необходимо руководствоваться следующей последовательностью (порядок шагов 3 и 4 не важен):
- Ожидание пока EEWE станет равным нулю.
- Ожидание равенства нулю бита SPMEN в регистре SPMCSR.
- Запись нового адреса ЭСППЗУ в EEAR (опционально).
- Запись новых данных в регистр EEDR для записи в ЭСППЗУ (опционально).
- Запись лог. 1 в EEMWE, когда в EEWE регистра EECR записан ноль.
- Запись лог. 1 в EEWE в течение четырех машинных циклов после установки EEMWE.
ЭСППЗУ нельзя программировать во время записи флэш-памяти из ЦПУ. С учетом этого, перед началом новой записи в ЭСППЗУ необходимо проверить завершение программирования флэш-памяти. Шаг 2 необходимо выполнять, если в приложении используется программирование из загрузочного сектора. Если программирование флэш-памяти под управлением ЦПУ не предусмотрено, то шаг 2 может быть исключен. См. “Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи” для детального изучения программирования из загрузочного сектора.
Предостережения: Прерывание между шагами 5 и 6 может нарушить цикл записи из-за превышения установленного предела времени на выполнение этих шагов. Если процедура обработки прерывания, осуществляющая доступ к ЭСППЗУ, прерывается другим доступом к ЭСППЗУ, то EEAR или EEDR будут изменены, вызывая сбой прерванного цикла доступа. Во избежание этих проблем рекомендуется сбрасывать флаг общего разрешения прерываний при выполнении последних четырех шагов.
По окончании записи бит EEWE сбрасывается аппаратно. Данный бит может опрашиваться программно для определения возможности записи следующего байта (нулевое значение). После установки EEWE ЦПУ останавливается на два машинных цикла перед выполнением следующей инструкции.
Разряд 0 – EERE: Разрешение чтения из ЭСППЗУ
Сигнал разрешения чтения из ЭСППЗУ EERE является стробом чтения ЭСППЗУ. После записи корректного адреса в регистр адреса EEAR бит EERE должен быть установлен к лог.1 для запуска механизма чтения ЭСППЗУ. Чтение из ЭСППЗУ выполняется одновременно с инструкцией, поэтому, запрашиваемые данные готовы для считывания сразу по ее завершении. После чтения из ЭСППЗУ ЦПУ задерживается на четыре машинных цикла, а только затем выполняет следующую инструкцию.
Пользователь должен опросить флаг EEWE до начала операции чтения. Если осуществляется операция записи, то невозможно не только считать ЭСППЗУ, но и изменить регистр адреса EEAR. Во время доступа к ЭСППЗУ используется калиброванный генератор. В таблице 2 приведено типичное время программирования ЭСППЗУ через ЦПУ.
Таблица 2 – Время программирования ЭСППЗУ
Операция |
Количество периодов калиброванного RC-генератора (1). |
Типичное время программирования |
Запись ЭСППЗУ (через ЦПУ) |
8448 |
8.5 мс |
Прим 1. Используется частота 1 МГц независимо от установки конфигурационного бита CKSEL
Далее представлены примеры кодов функций записи в ЭСППЗУ на языках Ассемблер и Си. В данных примерах предполагается, что прерывания работают таким образом, что ни одно не возникает в процессе выполнения данных функций (например, путем общего отключения прерываний). Кроме того, считается, что из загрузочного сектора не выполняется программирование флэш-памяти. В противном случае функция записи в ЭСППЗУ должна ожидать окончания действия инструкции SPM.
Пример кода на Ассемблере
EEPROM_write:
; Ожидаем окончание предыдущей записи
sbic EECR,EEWE
rjmp EEPROM_write
; Записываем адрес (r18:r17) в адресный регистр ЭСППЗУ
out EEARH, r18
out EEARL, r17
; Записываем данные (r16) в регистр данных ЭСППЗУ
out EEDR,r16
; Записывает лог. 1 в EEMWE
sbi EECR,EEMWE
; Запуск записи в ЭСППУ установкой EEWE
sbi EECR,EEWE
ret
Пример кода на Си
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Ожидаем окончание предыдущей записи */
while(EECR & (1<<EEWE))
;
/* Указание адреса и данных */
EEAR = uiAddress;
EEDR = ucData;
/* Запись лог. 1 в EEMWE */
EECR |= (1<<EEMWE);
/* Запуск записи в ЭСППЗУ путем установки EEWE */
EECR |= (1<<EEWE);
}
В следующих примерах кодов на Си и Ассемблере представлены функции чтения из ЭСППЗУ. При разработке примеров учитывалось управление прерываниями таким образом, что ни одно из них не возникает в процессе выполнения этих функций.
Пример кода на Ассемблере
EEPROM_read:
; Ожидание завершения предыдущей записи
sbic EECR,EEWE
rjmp EEPROM_read
; Установка адреса (r18:r17) в адресном регистре
out EEARH, r18
out EEARL, r17
; Запуск чтения ЭСППЗУ путем установки EERE
sbi EECR,EERE
; Считывание данных из регистра данных ЭСППЗУ
in r16,EEDR
ret
Пример кода на Си
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Ожидание завершения предыдущей записи*/
while(EECR & (1<<EEWE))
;
/* Установка адресного регистра */
EEAR = uiAddress;
/* Разрешение чтения из ЭППЗУ путем установки EERE */
EECR |= (1<<EERE);
/* Возврат данных из регистра данных ЭСППЗУ*/
return EEDR;
}
Запись в ЭСППЗУ в режиме выключения (Power Down)
Если микроконтроллер переводится в режим выключения (Power Down) командой sleep в процессе выполнения операции записи в ЭСППЗУ, то операция записи будет продолжена и завершится по истечении требуемого времени доступа для записи. Однако, по завершении операции записи кварцевый генератор будет продолжать работу, и как следствие, микроконтроллер будет переведен в режим снижения мощности не полностью. С учетом этого, рекомендуется проверять окончание операции записи в ЭСППЗУ перед переводом в режим выключения (Power-down).
Меры предотвращения повреждения данных в ЭСППЗУ
В те моменты, когда напряжение VCC находится на уровне недостаточном для корректной работы ЦПУ и ЭСППЗУ, содержимое ЭСППЗУ может быть нарушено. Данные проблемы аналогичны устройствам, использующих отдельное ЭСППЗУ, поэтому, в данном случае необходимо применить те же меры.
При сниженном напряжении питания может быть две причины нарушения содержимого ЭСППЗУ. Первая причина состоит в возможности корректной регулярной записи в ЭСППЗУ только при определенном напряжении питания. Вторая состоит в возможности некорректного выполнения программы микроконтроллером при чрезмерном низком уровне питания.
Повреждение данных в ЭСППЗУ может быть легко предотвращено, если придерживаться следующих рекомендаций:
Микроконтроллер необходимо удерживать в состоянии сброса (низкий уровень на выводе RESET) при недостаточности уровня питания. Аналогично это можно выполнить, разрешив работу встроенного детектора питания (BOD). Если пороговый уровень встроенного детектора питания не соответствует необходимому порогу, то следует применить внешнюю схему сброса при снижении VCC (супервизор питания). Если сброс возникает во время действия операции записи, то запись будет завершена при условии достаточности уровня питания.
Память ввода-вывода
Существующее пространство ввода-вывода для ATmega128 показано в разделе “Сводная таблица регистров”.
Все порты ввода-вывода и периферийные устройства в ATmega128 размещены в пространстве ввода-вывода. Доступ ко всем ячейкам ввода-вывода может быть осуществлен с помощью инструкций LD/LDS/LDD и ST/STS/STD путем передачи данных между одним из 32-х универсальным рабочим регистром и памятью ввода-вывода. Регистры ввода-вывода с адресами $00 - $1F могут побитно адресоваться с помощью инструкций SBI и CBI. Состояние одного из разрядов в этих регистрах может тестироваться с помощью инструкций SBIS и SBIC. При использовании специфических команд ввода-вывода IN и OUT необходимо использовать адреса $00 - $3F. Если адресоваться к регистрам ввода-вывода как к памяти данных с помощью инструкций LD и ST, то к указанным выше адресам необходимо прибавить $20. ATmega128 является сложным микроконтроллером, для которого 64 адреса, зарезервированных в кодах операций IN и OUT, не достаточно для поддержки всех имеющихся периферийных устройств. Для расширенной области ввода-вывода, которая находится по адресам $60 - $FF в статическом ОЗУ необходимо использовать только инструкции ST/STS/STD и LD/LDS/LDD. Пространство расширенного ввода-вывода заменяется ячейками статического ОЗУ в режиме совместимости с ATmega103.
Если осуществляется доступ к зарезервированным разрядам, то в целях совместимости с последующими микроконтроллерами в них необходимо записывать лог. 0.
Не должна производиться запись в ячейки по зарезервированным адресам в пространстве ввода-вывода.
Некоторые флаги статуса сбрасываются путем записи в них лог. 1. Инструкции CBI и SBI работают только с регистрами по адресам $00…$1F.
Регистры управления вводом-выводом и периферийными устройствами описываются в следующих разделах.
|