Nev-terminal.ru

Строительный журнал
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как подключить озу к микроконтроллеру

Мейкерство на максималках. Заводим и разгоняем оперативную память на STM32 и Arduino

Содержание статьи

  • Подготовка
  • Интерфейс памяти
  • Настройка FMC
  • Запускаем SDRAM
  • Правим ldscript
  • Реализуем sbrk
  • Добавляем в main
  • Заключение

Сердцем мира Arduino всегда был и остается крохотный микроконтроллер ATmega328P. Однако сегодня его скромные характеристики (16 МГц, 2 Кбайт ОЗУ и 32 Кбайт ПЗУ) и устаревшая восьмибитная архитектура AVR уже становятся препятствием при работе с аудио, графикой и сетью. К счастью, за эти годы вокруг Arduino успело сложиться огромное сообщество любителей и разработчиков. Общими усилиями в проект была добавлена поддержка самых разных микроконтроллеров, в том числе очень популярное семейство STM32.

Их основой служит 32-разрядное процессорное ядро компании ARM. Параметры конкретной микросхемы зависят от модельной линейки (Value Line, Mainstream, Performance), но даже самые слабые модели уверенно обгоняют ATmega AVR в доступных возможностях и производительности. Если добавить сюда богатую периферию, многочисленные интерфейсы для связи с внешним миром и разумную цену, то совсем неудивительно, что эти микроконтроллеры полюбились сообществу и получили широкое распространение.

В компании ARM инженеры не лишены чувства юмора. Сегодня существуют три семейства процессорных ядер для встраиваемых систем — Cortex-A (application), Cortex-R (real-time) и Cortex-M (microcontroller). Индексы в названиях образуют имя архитектуры — ARM. Знакомые буквы можно найти и в сокращенном названии основного справочного документа — ARM Architecture Reference Manual (PDF). Такие вот шуточки для тех, кто в теме.

В предыдущих статьях («Как реализовать шифрование для самодельного гаджета», «Ищем энтропию на микросхеме, чтобы повысить стойкость шифров») я использовал плату Discovery с микроконтроллером F746NG. Это очень мощное решение на основе Cortex-M7, с частотой в 216 МГц, 320 Кбайт оперативной памяти и мегабайтом флеша. Но что делать, если вдруг и этого мало? К примеру, если попытаться работать с размещенным на этой же плате дисплеем с разрешением 480 на 272 пикселя, то при глубине цвета в 32 бита нам потребуется как минимум 510 Кбайт памяти, чтобы хранить буфер кадра.

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

К счастью, у F746NG есть периферийный блок FMC (Flexible Memory Control) для работы с интерфейсами внешней памяти. А на самой плате уже распаяна микросхема SDRAM на 128 Мбит (не байт!). Но почему-то при портировании в Arduino IDE авторы STM32duino не захотели добавлять ее поддержку в файлах для платы Discovery. Если сделать все грамотно и аккуратно, то после инициализации аппаратного уровня для нашей программы не будет никакой разницы, работать ли с внутренней памятью или с внешней. Я считаю, надо попробовать!

Сейчас порой кажется, что в эпоху AVR микроконтроллеры обладали только стандартным набором периферии и ничего сложного подцепить к ним было нельзя. Однако это не так — к некоторым из них тоже можно было подключить внешнюю память через интерфейс XMEM и отобразить ее в адресное пространство ЦПУ. Например, на МК ATmega8515 можно было увеличить ОЗУ со скромных 512 байт до внушительных 64 Кбайт! Тогда это, конечно, поражало воображение.

Настройка и запуск проекта из ОЗУ

В проекте содержится два набора настроек: для запуска из оперативной памяти и из ПЗУ. Необходимо убедиться, что в Select Target выбран параметр RAM (Оперативная память). Показано на рисунке 1. Выбор любого из параметров автоматически задаёт адреса и прочие настройки, позволяющие запуститься микроконтроллеру из нужной памяти. Однако, в статье всё равно приведены особенности выставления всех необходимых параметров.


Рисунок 1 — Выбор проекта для ОЗУ в Select Target

Следом необходимо перейти в настройки «Options for Target», далее «Device», и выбрать микроконтроллер «MDR1986VK01» из всплывающего меню «Cortex-M4». Настройка показана на рисунке 2. Важно отметить, что микроконтроллер содержит блок FPU (работа с числами с плавающей точкой), и если в будущих разработках потребуется применение данного блока, то подробнее о настройках этого режима описано в статье «Подключение FPU для 1986ВЕ8Т в Keil»


Рисунок 2 — Выбор поднастройки MDR1986VK01 для работы с микроконтроллером «Электросила»

Далее необходимо убедиться в том, что в «Options for Target», вкладка Target, выставлены правильные адреса для ОЗУ. 128 Кбайт ОЗУ разбиты на два банка по 64 Кбайт: первый банк начинается с адреса 0x20000000, второй с 0x20010000. Наглядно показано на рисунке 3.

Читать еще:  Теплые откосы окон пвх


Рисунок 3 — Настройки адресов памяти в IDE Keil для работы с ОЗУ

Для подключения средств отладки будет использоваться JTAG-B. Режим загрузки JTAG-B по выводам MODE — “10001”. Для программирования/отладки был применён программатор J-Link, выбор же программатора необходимо производить согласно информации из статьи «Совместимость средств разработки Keil, IAR, CodeMaster и программаторов».

Из важного, что следует отметить в настроенном проекте, так это файл инициализации, который описан в папке с проектом под названием “0x20000000.ini” – его подключение видно на рисунке 4. Данный файл позволяет запускать проект в режиме отладки из ОЗУ (именно с адреса 0x20000000 в микроконтроллере расположена ОЗУ).

Рисунок 4 — Подключение файла 0x20000000 к проекту для корректного запуска из ОЗУ

Подробнее о запуске кода из ОЗУ написано в статье «Запуск программы из ОЗУ в среде Keil»

Согласно спецификации на данный микроконтроллер, большинство блоков имеют регистр KEY, и при записи в этот регистр значения 0x8555AAA1, разрешается запись других регистров конкретного блока:

CLK_CNTR->KEY = 0x8555AAA1; // разрешаем запись регистров CNTR (Clock Control)
// Настройка регистров разрешения тактирования шин периферийных блоков
CLK_CNTR->PER0_CLK = 0xFFFFFFFF;
CLK_CNTR->PER1_CLK = 0xFFFFFFFF; Фрагмент кода 1

Пояснения к работе и конфигурирование RGB-светодиода при помощи ШИМ:

В проекте настраиваются выводы для работы с RGB-светодиодом (стандартные настройки на выход всех трёх каналов светодиода), а также конфигурируются два таймера: MDR_TIMER2 и MDR_TIMER3. Таймеры включаются для работы с ШИМ, при этом MDR_TIMER2, канал 1, настраивает работу с зеленым каналом RGB-светодиода. MDR_TIMER3, канал 1, настраивает работу с синим каналом RGB-светодиода. MDR_TIMER3, канал 3, настраивает работу с красным каналом RGB-светодиода. О настройке режима ШИМ в таймерах общего назначения можно подробнее узнать из статьи «Таймеры общего назначения». В приведенном примере для пользователя имеется абстракция, и регулировка яркости каждого канала RGB-светодиода производится при помощи директив #define LED_color_MAX_BRIGHT в файле leds.h проекта (соответственно, меняется значение CCR для сравнения и запуска ШИМ).

После компиляции проекта необходимо перейти в режим отладки комбинацией Ctrl+F5.

Остаётся запустить проект кнопкой F5. RGB-светодиод будет статично гореть согласно настройкам в файле leds.h. Поскольку в составе файлов поддержки имеется также файл .SFR, который содержит информацию об адресах регистров микроконтроллера, к которым можно получить доступ к режиме отладки, можно корректировать яркость светодиодов в реальном времени без перепрограммирования микроконтроллера. Для этого необходимо во время выполнения программы нажать на иконку «System Viewer Windows», как это показано на рисунке 5, а далее открыть окно необходимого таймера, например, MDR_TIMER2. После чего откроется отдельное окно в правой части экрана с содержимым всех регистров блока MDR_TIMER2. Здесь, меняя значение поля регистра CCR1, можно регулировать свечение зеленого канала RGB-светодиода. Аналогичную конфигурацию можно выполнить и для двух других каналов RGB-светодиода, тем самым, можно получить любой цвет.


Рисунок 5 — Регулировка каналов RGB-светодиода в режиме отладки

Внешняя память данных микроконтроллеров MCS-51

Внешняя память данных предназначена для временного хранения информации, используемой в процессе выполнения программы. Эта память физически должна быть подключена к микросхеме микроконтроллера при помощи схемы, изображенной на рисунке 1. Максимальный объем этой памяти определяется регистром DPTR и составляет 64 Кбайта. Точно также как и в случае внешней памяти программ, объем внешней памяти данных может быть увеличен за счет использования портов P1 и P3 до 1 Гбайта. Внешняя память данных для своей работы требует использование портов P0, P2 и P3. Это приводит к увеличению габаритов устройства, увеличению уровня помех и, в конечном итоге, увеличения стоимости устройства в целом. Поэтому в современных устройствах внешняя память не используется. Однако, в некоторых микроконтроллерах (например 87с550 фирмы DALLAS) команды обращения к внешней памяти используются для работы с дополнительной внутренней памятью большого объема.

MOVX A, @DPTR (команда чтения) и

MOVX A, @R0 или MOVX A, @R0 (команды чтения)

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

Микропроцессор

С микропроцессором (далее МП) дела обстоят немного иначе. Он содержит в себе арифметико-логическое устройство, блок синхронизации и управления, запоминающие устройство, регистры и шину. То есть МП содержит в себе только то, что непосредственно понадобится для выполнения арифметический и логических операций. Все остальные комплектующие (ОЗУ, ПЗУ, устройства ввода/вывода, интерфейсы) нужно подключать извне.

Читать еще:  Нужны ли наружные откосы у пластикового окна

Структурная схема микропроцессорного устройства

Первые микропроцессоры появились тоже в начале 70-х. Самым популярным на тот момент считался 4004. Это микропроцессор, разработанный компанией Intel и представленный 15 ноября 1971 года. Он имел внушающие на тот период характеристики:

  • 2300 транзисторов;
  • тактовая частота — 740 кГц;
  • разрядность регистров и шины — 4 бита;
  • техпроцесс — 10 мкм;
  • площадь кристалла: — 12 мм².

К слову, 4004 был выполнен в обычном DIP-16 корпусе. Этот МП является самой популярной микросхемой для коллекционирования. Некоторые экземпляры продаются по 400 $ за штуку. Менее раритетные стоят около 250 $.

Уже через пару лет 8-битные МП позволили создавать первые бытовые микрокомпьютеры.

Естественно, тут преимуществом является то, что к МП можно на выбор подключать разную периферию с разными характеристиками (что не во всех случаях можно на МК). Второе основное отличие микропроцессора от микроконтроллера в том, что МП имеют больше вычислительной мощности. Их не имеет смысла ставить в микроволновки и «умные» лампочки. Микропроцессоры применяют там, где вычислительная мощность МК уже не справляется — игровые приставки, сложные вычислительные устройства и приборы, гаджеты.

Получается, чтобы обеспечить работоспособность микропроцессора, нужно подключить ему хотя бы минимальный набор периферии. Минусы:

  1. Размер — если в случае МК всё уже находится в одном корпусе, то минимальный набор элементов для работы МП занимает больше места.
  2. Цена — обычно, вся «сборка» комплектующих для МП выходит гораздо дороже «голых» микроконтроллеров.
  1. Производительность — микропроцессоры обладают большей производительностью, чем микроконтроллеры.
  2. Выбор — в случае МП у вас есть возможность подобрать комплектующие. Это позволит поставить более подходящую под ваши цели периферию.

Языки программирования

Начал выбирать язык программирования и среду в которой можно программировать. Так как я хоть как-то знал Basic, то и задумался, что было бы хорошо прогать на нём. Да, он не очень совершенный и ещё куча недостатков, но для начала подходил как нельзя кстати. Мне повезло, оказалось, что есть язык PIC-Basic. По нему есть учебник, автор Чак Хелибайк и переведённое на русский руководство, собственно до всего доходил дальше по учебнику и руководству. Среда работает из-под ДОС, но можно прикрутить CodeStudio и всё будет работать из-под Windows.

Корпуса

Одна модель микроконтроллера может выпускаться в различных корпусах. Корпус DIP для монтажа в отверстия платы последнее время встречается всё реже. Ниже приведен краткий список наиболее распространенных корпусов микроконтроллеров:

  • DIP – Dual Inline Package;
  • SOIC – Small-Outline Integrated Circuit;
  • SSOP – Shrink Small Outline Package;
  • TQFP – Thin profile plastic flat package;
  • MLF – Micro Lead Frame Package.

Программирование микроконтроллеров может осуществляться на ассемблере или на языке высокого уровня Си.

Arduino.ru

Общие сведения

Платформа Nano, построенная на микроконтроллере ATmega328 (Arduino Nano 3.0) или ATmega168 (Arduino Nano 2.x), имеет небольшие размеры и может использоваться в лабораторных работах. Она имеет схожую с Arduino Duemilanove функциональность, однако отличается сборкой. Отличие заключается в отсутствии силового разъема постоянного тока и работе через кабель Mini-B USB. Nano разработана и продается компанией Gravitech.

Принципиальные схемы и исходные данные

Arduino Nano 3.0 (ATmega328): схемы и файлы Eagle.

Arduino Nano 2.3 (ATmega168): руководство (pdf) и файлы Eagle. Примечание: т.к. свободная версия файлов Eagle не позволяет работать более чем с двумя слоями, а данная версия схем Nano содержит четыре слоя, то схемы публикуются не трассированными.

Краткие характеристики
Питание:

Arduino Nano может получать питание через подключение Mini-B USB, или от нерегулируемого 6-20 В (вывод 30), или регулируемого 5 В (вывод 27), внешнего источника питания. Автоматически выбирается источник с самым высоким напряжением.

Микросхема FTDI FT232RL получает питание, только если сама платформа запитана от USB. Таким образом при работе от внешнего источника (не USB), будет отсутствовать напряжение 3.3 В, генерируемое микросхемой FTDI, при этом светодиоды RX и TX мигаю только при наличие сигнала высокого уровня на выводах 0 и 1.

Память

Микроконтроллер ATmega168 имеет 16 кБ флеш-памяти для хранения кода программы, а микроконтроллер ATmega328, в свою очередь, имеет 32 кБ (в обоих случаях 2 кБ используется для хранения загрузчика). ATmega168 имеет 1 кБ ОЗУ и 512 байт EEPROM (которая читается и записывается с помощью библиотеки EEPROM), а ATmega328 – 2 кБ ОЗУ и 1 Кб EEPROM.

Входы и Выходы

Каждый из 14 цифровых выводов Nano, используя функции pinMode(), digitalWrite(), и digitalRead(), может настраиваться как вход или выход. Выводы работают при напряжении 5 В. Каждый вывод имеет нагрузочный резистор (стандартно отключен) 20-50 кОм и может пропускать до 40 мА. Некоторые выводы имеют особые функции:

  • Последовательная шина: 0 (RX) и 1 (TX). Выводы используются для получения (RX) и передачи (TX) данных TTL. Данные выводы подключены к соответствующим выводам микросхемы последовательной шины FTDI USB-to-TTL.
  • Внешнее прерывание: 2 и 3. Данные выводы могут быть сконфигурированы на вызов прерывания либо на младшем значении, либо на переднем или заднем фронте, или при изменении значения. Подробная информация находится в описании функции attachInterrupt().
  • ШИМ: 3, 5, 6, 9, 10, и 11. Любой из выводов обеспечивает ШИМ с разрешением 8 бит при помощи функции analogWrite().
  • SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Посредством данных выводов осуществляется связь SPI, которая, хотя и поддерживается аппаратной частью, не включена в язык Arduino.
  • LED: 13. Встроенный светодиод, подключенный к цифровому выводу 13. Если значение на выводе имеет высокий потенциал, то светодиод горит.
Читать еще:  Изготовление деревянных откосов для окон

На платформе Nano установлены 8 аналоговых входов, каждый разрешением 10 бит (т.е. может принимать 1024 различных значения). Стандартно выводы имеют диапазон измерения до 5 В относительно земли, тем не менее имеется возможность изменить верхний предел посредством функции analogReference(). Некоторые выводы имеют дополнительные функции:

  • I2C: A4 (SDA) и A5 (SCL). Посредством выводов осуществляется связь I2C (TWI). Для создания используется библиотека Wire (информация на сайте Wiring).

Дополнительная пара выводов платформы:

  • AREF. Опорное напряжение для аналоговых входов. Используется с функцией analogReference().
  • Reset. Низкий уровень сигнала на выводе перезагружает микроконтроллер. Обычно применяется для подключения кнопки перезагрузки на плате расширения, закрывающей доступ к кнопке на самой плате Arduino.
Связь

На платформе Arduino Nano установлено несколько устройств для осуществления связи с компьютером, другими устройствами Arduino или микроконтроллерами. ATmega168 и ATmega328 поддерживают последовательный интерфейс UART TTL (5 В), осуществляемый выводами 0 (RX) и 1 (TX). Установленная на плате микросхема FTDI FT232RL направляет данный интерфейс через USB, а драйверы FTDI (включены в программу Arduino) предоставляют виртуальный COM порт программе на компьютере. Мониторинг последовательной шины (Serial Monitor) программы Arduino позволяет посылать и получать текстовые данные при подключении к платформе. Светодиоды RX и TX на платформе будут мигать при передаче данных через микросхему FTDI или USB подключение (но не при использовании последовательной передачи через выводы 0 и 1).

Библиотекой SoftwareSerial возможно создать последовательную передачу данных через любой из цифровых выводов Nano.

ATmega168 и ATmega328 поддерживают интерфейсы I2C (TWI) и SPI. В Arduino включена библиотека Wire для удобства использования шины I2C. Более подробная информация находится в документации. Для использования интерфейса SPI обратитесь к техническим данным микроконтроллеров ATmega168 и ATmega328.

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

Платформа программируется посредством ПО Arduino. Из меню Tools > Board выбирается «Arduino Diecimila, Duemilanove или Nano w/ ATmega168» или «Arduino Duemilanove или Nano w/ ATmega328» (согласно установленному микроконтроллеру). Подробная информация находится в справочнике и инструкциях.

Микроконтроллеры ATmega168 и ATmega328 поставляются с записанным загрузчиком, облегчающим запись новых программ без использования внешних программаторов. Связь осуществляется оригинальным протоколом STK500.

Имеется возможность не использовать загрузчик и запрограммировать микроконтроллер через выводы блока ICSP (внутрисхемное программирование). Подробная информация находится в данной инструкции.

Автоматическая (программная) перезагрузка

Nano разработана таким образом, чтобы перед записью нового кода перезагрузка осуществлялась самой программой, а не нажатием кнопки на платформе. Одна из линий FT232RL, управляющих потоком данных (DTR), подключена к выводу перезагрузки микроконтроллеров ATmega168 или ATmega328 через конденсатор 100 нФ. Активация данной линии, т.е. подача сигнала низкого уровня, перезагружает микроконтроллер. Программа Arduino, используя данную функцию, загружает код одним нажатием кнопки Upload в самой среде программирования. Подача сигнала низкого уровня по линии DTR скоординирована с началом записи кода, что сокращает таймаут загрузчика.

Функция имеет еще одно применение. Перезагрузка Nano происходит каждый раз при подключении к программе Arduino на компьютере с ОС Mac X или Linux (через USB). Следующие полсекунды после перезагрузки работает загрузчик. Во время программирования происходит задержка нескольких первых байтов кода во избежание получения платформой некорректных данных (всех, кроме кода новой программы). Если производится разовая отладка скетча, записанного в платформу, или ввод каких-либо других данных при первом запуске, необходимо убедиться, что программа на компьютере ожидает в течение секунды перед передачей данных.

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector