Для чего предназначена flash память в мк atmega8

Обновлено: 06.07.2024

Теперь пришло время рассмотреть более подробно последнюю архитектуру AVR. Пожалуй, это сегодня самая популярная архитектура у любителей благодаря Arduino. Но в ее основе все таки лежат обычные микроконтроллеры, которые выпускает Atmel. Точнее выпускала, так теперь это принадлежит Microchip.

AVR устроены немного проще, чем две уже рассмотренные архитектуры. Но своих хватает и здесь. Да, AVR тоже бывают разные. Как минимум, большинство вспомнят ATtiny и ATmega. Но между ними нет столь принципиальных различий, как между PIC. Если говорить про архитектуру памяти. Поэтому я буду просто упоминать различия в ходе изложения.

Общие замечания по архитектуре AVR

В Atmel очень хотели сделать микроконтроллер достаточно универсальным и при этом простым. И это им удалось. Классическая Гарвардская архитектура сочетается с не столь строгими ограничениями в RISC подходе. Это еще не позволяет отнести микроконтроллер к CISC, но зато делает его "продвинутым RISC" (advanced RISC, как говорит сама Atmel). В общем, популярность AVR заслужена.

Здесь нет единого адресного пространства, как в STM8. И нет многоуровневого конвейера. А команды нельзя выполнять из ОЗУ. Зато здесь процессор имеет гораздо больше регистров, так что их даже можно (хоть и чрезвычайно условно, с большой натяжкой) назвать подобием кэш памяти данных. Хотя это, собственно говоря, просто расширение понятия регистр-аккумулятор.

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

Регистры процессора AVR

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

Регистр адреса команды PC

Как и во всех микроконтроллерах является указателем в адресном пространстве команд и содержит адрес команды, которая будет выбираться в следующем машинном цикле.

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

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

Указатель стека SP

Сам стек в AVR располагается в памяти данных, обычно, в самом ее конце . А регистр SP является указателем на вершину стека . Собственно говоря, регистр SP является регистровой парой SPH:SPL , причем SPH может отсутствовать в микроконтроллерах с малым объемом ОЗУ. Просто количество бит регистра SP может быть разным, в зависимости от доступного объема памяти данных.

Для работы со стеком существуют команды POP и PUSH.

Регистры общего назначения

Индексные регистры

Часть регистров общего назначения выполняют и специальные функции - индексных регистров. Всего есть три 16-битных индексных регистра .

Регистры R26 и R27 образуют регистровую пару R27:R26, которая соответствует паре XH:XL соответствующей индексному регистру X.

Регистры R28 и R29 образуют регистровую пару R29:R28, которая соответствует паре YH:YL соответствующей индексному регистру Y.

Регистры R30 и R31 образуют регистровую пару R31:R30, которая соответствует паре ZH:ZL соответствующей индексному регистру Z.

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

Адресное пространство ввода-вывода

В микроконтроллерах AVR есть команды IN и OUT, которые работают в адресном пространстве ввода вывода. Всего в этом пространстве может быть до 64 регистров внешних устройств .

При этом здесь же располагаются и уже упомянутые выше регистры процессора (SREG, SP). А это уже не логично. Но и это еще не все. Однако, для этого мы должны посмотреть на адресное пространство данных.

Адресное пространство данных (на самом деле объединенное)

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

Распределение адресного пространства данных микроконтроллеров AVR с необходимым количеством регистров оборудования не превышающих 64. Иллюстрация моя Распределение адресного пространства данных микроконтроллеров AVR с необходимым количеством регистров оборудования не превышающих 64. Иллюстрация моя

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

Обратите внимание, что здесь воедино соединены сразу три сущности! Во первых, регистры общего назначения. Во вторых, адреса ввода-вывода, но со смещением 20h. В третьих, собственно память данных (включая стек) начиная с адреса 60h .

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

Более того, есть два способа получения доступа и к регистрам оборудования. Так регистр SREG имеет адрес 3Fh в пространстве ввода-вывода. И к нему можно обратиться например так

Но одновременно, он же доступен по адресу 3Fh+20h= 5Fh. А значит, возможно и такое

Но и это еще не все! Микроконтроллеры получали все новые встроенные модули и адресного пространства ввода-вывода стало не хватать. Поэтому часть регистров оборудования в некоторых моделях микроконтроллеров вынесли в отдельный блок "расширения регистров ввода-вывода". И разместился этот блок с адреса 60h .

Распределение адресного пространства данных микроконтроллеров AVR с необходимым количеством регистров оборудования больше 64. Иллюстрация моя Распределение адресного пространства данных микроконтроллеров AVR с необходимым количеством регистров оборудования больше 64. Иллюстрация моя

Всего может быть до 160 дополнительных регистров оборудования. И доступ к ним командами IN и OUT уже невозможен. А собственно память данных (включая стек) теперь начинается с адреса 100h .

Как определить, есть в микроконтроллере этот дополнительный блок регистров, или нет? Посмотрев в документации, это самый надежный способ. Дело в том, что название начинающееся с ATmega еще ни о чем не говорит, в данном случае. Так у ATmega32A дополнительного блока нет и данные можно размещать с адреса 60h. А вот ATmega328 или ATmega 644 такой блок имеют, а значит и данные могут размещаться только с адреса 100h.

Ничего данная организация памяти не напоминает? Нет, я не про STM8 с его единым адресным пространством и выделенным под регистры оборудования диапазоном. Я про PIC. Если убрать лишнее (по своей сути) пространство ввода-вывода, то мы получим тот же принцип размещения регистров и данных в едином пространстве!

Режимы адресации операндов в памяти данных

Я опущу описания неявной адресации, равно как и непосредственной (константа или литерал). Здесь нет никаких отличий от уже многократно рассмотренных случаев.

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


Область статической памяти SRAM (Static Random Access Memory) начинается с адреса 0x060. Более подробно о SRAM можно прочитать . В микроконтроллерах ATmega8 размер статической памяти составляет 1 kb, но при необходимости он может быть увеличен до 64kb с помощью внешних блоков памяти (порты A и С при этом окажутся занятыми - они будут применяться для передачи данных и адресов). Для этого необходимо установить сельмой разряд регистра MCUCR в лог 1. SRAM используется для хранения данных, которые не уместились в рабочих регистрах, а также для организации программного стека (особой области памяти, используемой процессором для хранения адресов возврата из подпрограмм, промежуточных вычисление и т.д)

Область регистров общего назначения (рабочих регистров) используется для хранения переменных и указателей. В микроконтроллере mega8 область рабочих регистров состоит из 32-х восьмиразрядных регистров (диапазон адресов 0x000-0x01F). Если прошивка микроконтроллера пишется на языке С, то обращаться к этим регистрам обычно не требуется (хотя к ним можно обратиться при помощи ассемблерных вставок в С-программу).

Регистры ввода/вывода микроконтроллера mega8 включают в себя 64 регистра, которые используются для управления переферийными устройствами, а также для хранения данных переферийных устройств. К этим регистрам можно обращаться по имени (самый распространённый вариант в при разработке на языке C), по адресу ввода/вывода, по адресу в SRAM.

Имя регистра Адрес ввода/вывода Адрес SRAM Описание
ACSR Регист управления и состояния аналогового компоратора
UBRR Регист скорости передачи данных через UART
UCR Регистр управления приёмопередатчиком UART
USR Регистр состояния приёмопередатчиком UART
UDR Регистр данных приёмопередатчиком UART
SPCR Регистр управления интерфейсом SPI
SPSR Регистр состояния интерфейса SPI
SPDR Регистр ввода/вывода данных интерфейса SPI
PIND Состояние выводов порта D
DDRD Регистр направления передачи данных порта D
PORTD Регистр данных порта D
PINC Состояние выводов порта С
DDRC Регистр направления передачи данных порта C
PORTC Регистр данных порта С
PINB Состояние выводов порта B
DDRB Регистр направления передачи данных порта B
PORTB Регистр данных порта B
PINA Состояние выводов порта А
DDRA Регистр направления передачи данных порта A
PORTA Регистр данных порта A
EECR Регистр управления памяти EEPROM
EEDR Регистр данных памяти EEPROM
EEARL Регистр адреса памяти EEPROM (младший байт)
EEARH Регистр адреса памяти EEPROM (старший байт)
WDTCR Регистр управления сторожевым таймером
ICR1L Регистр захвата таймера/счётчика T/C1 (младший байт)
ICR1H Регистр захвата таймера/счётчика T/C1 (старший байт)
OCR1BL Регистр сравнения B таймера T/C1 (младший байт)
OCR1BH Регистр сравнения B таймера T/C1 (старший байт)
OCR1AL Регистр сравнения A таймера T/C1 (младший байт)
OCR1AH Регистр сравнения A таймера T/C1 (старший байт)
TCNT1L Счётный регистр таймера/счётчика T/C1 (младший байт)
TCNT1H Счётный регистр таймера/счётчика T/C1 (старший байт)
TCCR1B Регистр управления B таймера/счётчика T/C1
TCCR1A Регистр управления А таймера/счётчика T/C1
TCNT0 Счётный регистр таймера/счётчика T/C0
TCCR0 Регистр управления таймера/счётчика T/C0
MCUCR Регист управления микроконтроллером
TIFR Регистр флагов прерывания от таймеров/счётчиков
TIMSK Регист маскирования прерываний от таймеров
GIFR Общий регистр флагов прерываний
GIMSK Общий регистр маскирования прерываний
SPL Указатель стека (младший байт)
SPH Указатель стека (старший байт)
SREG Регистр состояния

Если у вас есть какие-то замечания по этому документу или что-то осталось непонятно, то вы можете оставить свой отзыв или вопрос

Микроконтроллеры семейства Mega AVR (ATmega8)

Viktor2312 Пн Мар 28 2016, 10:37

ATmega8, ATmega8L

Отличительные особенности:

• Энергонезависимая память программ и данных
8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)
Обеспечивает 1000 циклов стирания/записи
Дополнительный сектор загрузочных кодов с независимыми битами блокировки
Обеспечен режим одновременного чтения/записи (Read-While-Write)
512 байт EEPROM
Обеспечивает 100000 циклов стирания/записи
1 Кбайт встроенной SRAM
Программируемая блокировка, обеспечивающая защиту программных средств пользователя

• Специальные микроконтроллерные функции
Сброс по подаче питания и программируемый детектор кратковременного снижения напряжения питания
Встроенный калиброванный RC-генератор
Внутренние и внешние источники прерываний
Пять режимов пониженного потребления: Idle, Power-save, Power-down, Standby и снижения шумов ADC

• Рабочие напряжения
2,7 - 5,5 В (ATmega8L)
4,5 - 5,5 В (ATmega8)

• Рабочая частота
0 - 8 МГц (ATmega8L)
0 - 16 МГц (ATmega8)

Блок-схема:

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139cb1_145bc8a2_orig

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139cb2_7e48a46_orig

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139cb3_9b5cd780_orig

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139cb4_435c79c3_orig

Последний раз редактировалось: Viktor2312 (Пн Мар 28 2016, 13:26), всего редактировалось 1 раз(а)

Изучаем семейство микроконтроллеров Mega AVR

Viktor2312 Пн Мар 28 2016, 12:27


  • FLASH-память программ объёмом от 8 до 256 Кбайт (число циклов стирания/записи не менее 10000);
  • оперативная память (статическое ОЗУ) объёмом от 512 байт до 8 Кбайт;
  • память данных на основе ЭСППЗУ (EEPROM) объёмом от 256 байт до 4 Кбайт (число циклов стирания/записи не менее 100000);
  • возможность защиты от чтения и модификации памяти программ и данных;
  • возможность программирования непосредственно в системе через последовательные интерфейсы SPI и JTAG;
  • возможность самопрограммирования;
  • возможность внутрисхемной отладки в соответствии со стандартом IEEE 1149.1 (JTAG), а также наличие собственного однопроводного интерфейса внутрисхемной отладки Debug Wire (не во всех моделях);
  • разнообразные способы синхронизации: встроенный RC-генератор с внутренней или внешней времязадающей RC-цепочкой, встроенный генератор с внешним кварцевым или пьезокерамическим резонатором, внешний сигнал синхронизации;
  • наличие нескольких режимов энергопотребления;
  • наличие детектора пониженного напряжения питания (Brown-Out-Detector - BOD);
  • возможность программного снижения частоты тактового генератора (не во всех моделях).

  • полностью статическая архитектура, минимальная тактовая частота равна нулю;
  • арифметико-логическое устройство (АЛУ) подключено непосредственно к регистрам общего назначения (32 регистра);
  • большинство команд выполняются за один период тактового сигнала;
  • векторная система прерываний, поддержка очереди прерываний;
  • большое число источников прерываний (до 45 внутренних и до 32 внешних);
  • наличие аппаратного умножителя.
Характеристики подсистемы ввода/вывода.

  • программное конфигурирование и выбор портов ввода/вывода;
  • выводы могут быть запрограммированы как входные или как выходные независимо друг от друга;
  • входные буферы с триггером Шмитта на всех выводах;
  • имеется возможность полного отключения цифрового порта ввода/вывода от физического вывода микросхемы (в новых моделях);
  • на всех входах имеются индивидуально отключаемые внутренние подтягивающие резисторы сопротивлением 20. 50 кОм.

Ядро микроконтроллеров AVR семейства Mega выполнено по усовершенствованной RISC-архитектуре (enhansed RISC), см. рис. ниже, в которой используется ряд решений, направленных на повышение быстродействия микроконтроллеров.
Арифметико-логическое устройство АЛУ, выполняющее все вычисления, подключено непосредственно к 32 рабочим регистрам, объединённым в регистровый файл. Благодаря этому, АЛУ может выполнять одну операцию (чтение содержимого регистров, выполнение операции в АЛУ, и запись результата обратно в регистровый файл) за такт. Кроме того, практически каждая из команд (за исключением команд, у которых одним из операндов является 16-битный адрес) занимает одну ячейку памяти программ.

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139cdb_4c55f69d_L


В микроконтроллерах AVR реализована Гарвардская архитектура, характеризующаяся раздельной памятью программ и данных, каждая из которых имеет собственные шины доступа. Такая организация позволяет одновременно работать как с памятью программ, так и с памятью данных. Разделение информационных шин позволяет использовать для каждого типа памяти шины различной разрядности, причём способы адресации и доступа к каждому типу памяти также различаются. В сочетании с двухуровневым конвейером команд такая архитектура позволяет достичь производительности в 1 MIPS на каждый МГц тактовой частоты.

Архитектура микроконтроллеров семейства Mega

Viktor2312 Пн Мар 28 2016, 18:37

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139dce_656900de_XL

В микроконтроллерах AVR семейства Mega реализована Гарвардская архитектура, в соответствии с которой разделены не только адресные пространства памяти программ и памяти данных, но также и шины доступа к ним. Способы адресации и доступа к этим областям памяти также различны. Такая структура позволяет центральному процессору работать одновременно как с памятью программ, так и с памятью данных, что существенно увеличивает производительность. Каждая из областей памяти данных (ОЗУ и EEPROM) также расположена в своём адресном пространстве.
Обобщённая карта памяти микроконтроллеров AVR семейства Mega представлена ниже:

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139f9e_24eb6a5a_XL

Память программ может использоваться не только для хранения кода программы, но также и для хранения различных констант. Для пересылки байта из памяти программ в память данных существуют две специальных команды - LPM и ELPM (последняя есть только в моделях, имеющих память программ 128 Кбайт и более). При использовании команды LPM адрес, по которому производится чтение, определяется содержимым индексного регистра Z. При этом старшие 15 битов содержимого регистра будут определять адрес слова (0. 32К), младший бит будет определять, какой из байтов будет прочитан: 0 - младший байт, 1 - старший байт. Для наглядности смотрим рисунок ниже:

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139fac_5546d36b_L

Команда ELPM, в отличие от команды LPM способна адресовать до 16 Мбайт памяти. При использовании этой команды адрес слова будет определяться содержимым регистра ввода/вывода RAMPZ совместно со старшими 15 битами содержимого регистра Z. Младший бит регистра Z будет по-прежнему определять, какой из байтов слова будет прочитан. Смотрим рисунок ниже:

Микроконтроллеры семейства Mega AVR (ATmega8) 0_139fae_12fba6a5_L

Почитав наш форум, стало ясно, что не все понимают разницу между прошивкой и исходником, FLASH и EEPROM. Чтобы данных вопросов больше не возникало, решил написать этот краткий обзор. Возьмем, к примеру, МК ATMega16. Внутри данного контроллера имеются 2 основные области памяти: ПЗУ, она же память программ или flash-память, и ОЗУ, она же память данных или SRAM. В довесок ко всему этому идет память для хранения данных (EEPROM).

Память программ

Память программ используется для хранения так называемой прошивки. Прошивка представляет из себя набор инструкций (команды и операнды) в машинных кодах, понятных контроллеру, в соответствии с которыми контроллер выполняет требуемую последовательность действий. Прошивку получают посредством компилятора. Компилятор – это программа, которая выполняет преобразование текста, написанного на каком-либо языке программирования (исходник), в код машинных инструкций (прошивка, hex-файл). Каждая инструкция имеет длину 16 или 32 бита (в основном 16 бит), а также имеет адрес, под которым она хранится во flash-памяти.

flash-память, и ОЗУ

Так как объем flash-памяти контроллера составляет 16 кбайт (16384 байта), то в него можно впихнуть 8192 16-ти битных инструкции (8К х 16). Кроме основной программы во flash-памяти могут быть размещены различные константы, значения которых используются при выполнении программы и которые не могут быть изменены, а также может быть секция бутлоадера (сморим статью про fuse-биты). Число циклов перепрограммирования flash-памяти составляет 10000. Т.е. после 10000 (или около того) циклов возможно будет запись с ошибками, либо вообще программа не запишется. Пугаться не стоит, если немного посчитать, то получается чтобы дойти до этого надо шить контроллер каждую минуту в течение примерно семи дней без отрыва на сон, перекуры, распитие пива и прочие радости холостой или семейной (у кого как) жизни.

Память данных

память данных состоит из: регистрового файла

Возьмем, к примеру, порты ввода/вывода (самый простой пример). Для каждого порта есть 3 РВВ:

1) регистр, определяющий направление передачи данных через выводы порта (вход или выход);

2) регистр, считывающий состояние выводов порта, если выводы настроены на прием (вход) информации;

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

Следует заметить, что блок РОН можно разделить на 2 группы: РОН младшей половины регистрового файла (R0…R15) и РОН старшей половины регистрового файла (R16…R31). Разница заключается в том, что не все команды, относящиеся к старшей половине регистров, можно применить к младшей половине, то есть регистры R0…R15 получаются немного урезанными по набору команд.

И теперь само ОЗУ. Это оперативная память, как в компьютере, предназначенная для хранения различных переменных, сохранение которых не требуется после отключения питания. Выделение места под переменные (задается в программе) идет он начала к концу ОЗУ. Также ОЗУ нужно для такой штуковины как стек, который является частью ОЗУ и служит для сохранения различных данных, а также для сохранения адресов при вызове подпрограмм и прерываний. Стек работает по принципу «первым зашел – последним вышел» и растет от конца ОЗУ к началу.


При использовании ОЗУ под переменные и стек необходимо следить за тем, чтобы одно не наехало на другое.

EEPROM

электрически стираемая программируемая постоянная память

Тут все просто – электрически стираемая программируемая постоянная память размером 512 байт. В отличии от flash-памяти здесь адресация побайтная.

Сюда можно сохранять всякие константы, данные, которые используются при работе программы, либо необходимо сохранить перед отключением питания и т.п. В EEPROM данные можно писать непосредственно при выполнении программы либо путем прошивки через прошивальщик (eep-файл). Если чтение из EEPROM в процессе работы МК осуществляется очень быстро, то запись в него происходит очень долго, несколько миллисекунд. Тут надо быть осторожным, чтоб при процессе записи в EEPROM не выскочило прерывание, а то запишем в итоге какую-либо бяку. Так что тут надо быть внимательней. Число циклов запись/стирание в EEPROM составляет 100000. Автор материала: skateman.

Originally posted 2019-09-26 04:47:30. Republished by Blog Post Promoter

Читайте также: