Оглавление:

Bare Metal Raspberry Pi 3: мигающий светодиод: 8 шагов
Bare Metal Raspberry Pi 3: мигающий светодиод: 8 шагов

Видео: Bare Metal Raspberry Pi 3: мигающий светодиод: 8 шагов

Видео: Bare Metal Raspberry Pi 3: мигающий светодиод: 8 шагов
Видео: Основы цифровой электроники с Raspberry Pi и Python 2024, Ноябрь
Anonim
Bare Metal Raspberry Pi 3: мигающий светодиод
Bare Metal Raspberry Pi 3: мигающий светодиод

Подписаться Еще от автора:

Кнопка Raspberry Pi со светодиодами из чистого металла
Кнопка Raspberry Pi со светодиодами из чистого металла
Кнопка Raspberry Pi со светодиодами из чистого металла
Кнопка Raspberry Pi со светодиодами из чистого металла
Ящики
Ящики
Ящики
Ящики
Как сделать рельефную резьбу ко Дню ветеранов
Как сделать рельефную резьбу ко Дню ветеранов
Как сделать рельефную резьбу ко Дню ветеранов
Как сделать рельефную резьбу ко Дню ветеранов

О себе:.oO0Oo. Подробнее о Moldypizza »

Добро пожаловать в учебник BARE METAL pi 3 по миганию светодиода!

В этом руководстве мы рассмотрим шаги, от начала до конца, чтобы светодиод мигал, используя Raspberry PI 3, макетную плату, резистор, светодиод и пустую SD-карту.

Так что же такое ГОЛЫЙ МЕТАЛЛ? BARE METAL - это программирование без излишеств. Чистый металл означает, что мы полностью контролируем то, что компьютер будет делать до мелочей. По сути, это означает, что код будет полностью написан на ассемблере с использованием набора инструкций Arm. К концу мы создадим программу, которая будет мигать светодиодом, получая доступ к физическому адресу одного из контактов GPIO Raspberry Pi и настраивая его на вывод, а затем включая и выключая. Попытка реализовать этот проект - отличный способ начать заниматься встроенным программированием и, надеюсь, лучше понять, как работает компьютер.

Что тебе нужно?

Аппаратное обеспечение

  • Малина PI 3
  • SD-карта с предварительно загруженным загрузочным образом
  • Макетная плата
  • Мужской Женский перемычка
  • Штекерные перемычки
  • ВЕЛ
  • Резистор 220 Ом (не обязательно должен быть точно 220 Ом, подойдет почти любой резистор)
  • mini sd карта
  • мини-карта SD с предварительно загруженной операционной системой raspberry pi (обычно входит в комплект поставки pi)

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

  • Компилятор GCC
  • Встроенный набор инструментов GNU
  • Текстовый редактор
  • форматировщик SD-карты

Хорошо, приступим!

Шаг 1: НАСТРОЙКА ВЕЩЕЙ / ОБОРУДОВАНИЕ

НАСТРОЙКА / ОБОРУДОВАНИЕ
НАСТРОЙКА / ОБОРУДОВАНИЕ

Итак … первый шаг - перейти к оборудованию. Вы можете купить детали отдельно, или есть комплект, в котором их более чем достаточно. ССЫЛКА

В этом комплекте есть все необходимое для настройки raspberry pi 3 и других устройств! единственное, чего нет в этом комплекте, так это дополнительной mini sd card. Ждать! Не покупайте еще одну. Если вы не планируете использовать установку linux, предварительно загруженную на карту, просто скопируйте содержимое прилагаемой мини-карты SD на будущее и повторно отформатируйте карту (подробнее об этом позже). ВАЖНОЕ ПРИМЕЧАНИЕ: убедитесь, что вы сохранили файлы на прилагаемой карте, они вам понадобятся на будущее!

Теперь пора настроить программное обеспечение. Это руководство не будет содержать подробных инструкций по установке программного обеспечения. В Интернете есть много ресурсов и руководств по их установке:

ПОЛЬЗОВАТЕЛИ WINDOWS:

Скачайте и установите gcc

Затем загрузите и установите встроенный набор инструментов GNU ARM

LINUX / MAC

  • Дистрибутивы Linux поставляются с предустановленным gcc
  • Загрузите и установите встроенный набор инструментов GNU ARM.

Итак, если все пойдет хорошо, вы сможете открыть терминал (linux / mac) или строку cmd (windows) и попробовать ввести

рука-none-eabi-gcc

Результат должен быть похож на первый рисунок. Это просто для того, чтобы убедиться, что он установлен правильно.

Хорошо, теперь, когда предварительные условия удалены, пора приступить к интересным вещам.

Шаг 2: ЦЕПЬ

СХЕМА
СХЕМА
СХЕМА
СХЕМА
СХЕМА
СХЕМА

Время контура! Схема для этого проста. Мы подключим светодиод к GPIO 21 (контакт 40) на пи (см. Рисунки 2 и 3). Резистор также подключен последовательно, чтобы предотвратить повреждение светодиода. Резистор будет подключен к отрицательному столбцу на макетной плате, который будет подключен к GND (вывод 39) на Pi. При подключении светодиода обязательно подключите короткий конец к отрицательной стороне. Смотрите последнюю картинку

Шаг 3: ЗАГРУЗКА Mini SD

ЗАГРУЗОЧНЫЙ Mini SD
ЗАГРУЗОЧНЫЙ Mini SD
ЗАГРУЗОЧНЫЙ Mini SD
ЗАГРУЗОЧНЫЙ Mini SD
ЗАГРУЗОЧНЫЙ Mini SD
ЗАГРУЗОЧНЫЙ Mini SD

Есть три шага, чтобы ваш Pi 3 распознал вашу пустую мини-SD-карту. Нам нужно найти и скопировать bootcode.bin, start.elf и fixup.dat. Вы можете получить эти файлы на прилагаемой мини-SD-карте, если вы купили canakit, или сделать загрузочную SD-карту для Pi 3 с дистрибутивом Linux. В любом случае эти файлы необходимы, чтобы Pi мог распознать SD-карту как загрузочное устройство. Затем отформатируйте mini sd в fat32 (большинство mini sd-карт отформатированы в fat32. Я использовал дешевую mini sd-карту от sandisk), переместите bootcode.bin, start.elf, fixup.dat на sd-карту. Готово! Хорошо еще раз, и шаги в порядке изображений:

  1. Найдите bootcode.bin, start.elf, fixup.dat.
  2. Убедитесь, что ваша SD-карта отформатирована в fat32.
  3. Переместите bootcode.bin, start.elf и fixup.dat на отформатированную SD-карту.

Вот как я в этом разобрался, ссылка.

Шаг 4: ПРОВЕРЬТЕ Mini SD

ПРОВЕРИТЬ Mini SD
ПРОВЕРИТЬ Mini SD
ПРОВЕРИТЬ Mini SD
ПРОВЕРИТЬ Mini SD

Хорошо, у нас есть загрузочная мини-SD-карта, и, надеюсь, у вас есть Pi 3 на данный момент. Итак, теперь мы должны протестировать его, чтобы убедиться, что Pi 3 распознает мини-SD-карту как загрузочную.

На пи, рядом с портом mini-usb, есть два небольших светодиода. Один красный. Это индикатор питания. Когда пи получает питание, этот индикатор должен гореть. Поэтому, если вы подключаете свой пи прямо сейчас без мини-SD-карты, он должен загореться красным. Хорошо, теперь отключите пи, вставьте загрузочную мини-карту SD, созданную на предыдущем шаге, и подключите пи. Вы видите еще один индикатор? Рядом с красным должен гореть зеленый свет, который указывает на то, что он читает SD-карту. Этот светодиод называется светодиодом ACT. Он загорится, когда вставлена работоспособная SD-карта. Он будет мигать при обращении к вашей мини-SD-карте.

Итак, после того, как вы вставили загрузочную мини-SD-карту и подключили пи, должны были произойти две вещи:

  1. Красный светодиод должен загореться, указывая на прием мощности.
  2. Зеленый светодиод должен загореться, указывая на то, что он загрузился в мини-SD-карту.

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

Ссылка вот хорошая ссылка.

Шаг 5: CODE1

Этот проект написан на ассемблере ARM. В этом руководстве предполагается базовое понимание сборки ARM, но вот несколько вещей, которые вы должны знать:

.equ: присваивает значение символу, т.е. abc. equ 5 abc теперь представляет пять

  • ldr: загружается из памяти
  • str: записывает в память
  • cmp: сравнивает два значения путем вычитания. Устанавливает флаги.
  • b: перейти к метке
  • добавить: выполняет арифметические действия

Если у вас нет опыта сборки Arm, посмотрите это видео. Это даст вам хорошее понимание ассемблера Arm.

Итак, прямо сейчас у нас есть схема, подключенная к нашему Raspberry Pi 3, и у нас есть SD-карта, которую распознает Pi, поэтому наша следующая задача - выяснить, как взаимодействовать со схемой, загружая pi с исполняемой программой. В общем, что нам нужно сделать, это указать пи, чтобы он выводил напряжение с GPIO 21 (контакт, подключенный к красному проводу). Затем нам нужен способ переключения светодиода, чтобы он мигал. Для этого нам нужна дополнительная информация. На данный момент мы не знаем, как сообщить GPIO 21 о выводе, поэтому мы должны прочитать таблицу. У большинства микроконтроллеров есть спецификации, в которых точно указано, как все работает. К сожалению, официальной документации на Pi 3 нет! Однако есть неофициальный паспорт. Вот две ссылки на него:

  1. github.com/raspberrypi/documentation/files…
  2. web.stanford.edu/class/cs140e/docs/BCM2837…

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

Шаг 6: CODE2: Turn_Led_ON

КОД 2: Turn_Led_ON
КОД 2: Turn_Led_ON
КОД 2: Turn_Led_ON
КОД 2: Turn_Led_ON
КОД 2: Turn_Led_ON
КОД 2: Turn_Led_ON

Raspberry Pi 3 53 регистров для управления выходными / входными контактами (периферийными устройствами). Контакты сгруппированы вместе, и каждой группе назначен регистр. Для GPIO нам нужно иметь доступ к регистрам SELECT, регистру SET и регистрам CLEAR. Для доступа к этим регистрам нам нужны физические адреса этих регистров. Когда вы читаете таблицу данных, вам нужно только отметить смещение адреса (нижний байт) и добавить его к базовому адресу. Вы должны сделать это, потому что в таблице перечислены виртуальные адреса Linux, которые в основном являются значениями, присваиваемыми операционными системами. Мы не используем операционную систему, поэтому нам нужно получить доступ к этим регистрам напрямую, используя физический адрес. Для этого вам понадобится следующая информация:

  • Базовый адрес периферийных устройств: 0x3f200000. В pdf (стр. 6) указано, что базовый адрес - 0x3f000000, однако этот адрес не будет работать. Используйте 0x3f200000
  • Смещение FSEL2 (SELECT) не на полный адрес реестра. В pdf указан FSEL2 по адресу 0x7E20008, но этот адрес относится к виртуальному адресу linux. Смещение будет таким же, это то, что мы хотим отметить. 0x08
  • Смещение GPSET0 (SET): 0x1c
  • Смещение GPCLR0 (CLEAR): 0x28

Вы, вероятно, заметили, что в таблице данных перечислены 4 регистра SELECT, 2 регистра SET и 2 регистра CLEAR, так почему я выбрал те, которые сделал? Это потому, что мы хотим использовать GPIO 21 и FSEL2 для управления GPIO 20-29, SET0 и CLR0 для управления GPIO 0-31. Регистры FSEL назначают по три бита на каждый вывод GPIO. Поскольку мы используем FSEL2, это означает, что биты 0-2 управляют GPIO 20, а биты 3-5 управляют GPIO 21 и так далее. Регистры Set и CLR назначают по одному биту на каждый вывод. Например, бит 0 в SET0 и CLR0 управляет GPIO 1. Для управления GPIO 21 вы должны установить бит 21 в SET0 и CLR0.

Итак, мы поговорили о том, как получить доступ к этим регистрам, но что все это означает?

  • Регистр FSEL2 будет использоваться для установки выхода GPIO 21. Чтобы установить вывод для вывода, вам необходимо установить бит нижнего порядка трех битов на 1. Итак, если биты 3-5 управляют GPIO 21, это означает, что нам нужно установить первый бит, бит 3 на 1. Это скажет пи что мы хотим использовать GPIO 21 в качестве выхода. Итак, если мы посмотрим на 3 бита для GPIO 21, они должны выглядеть так после того, как мы установим его на вывод, b001.
  • GPSET0 сообщает пи, чтобы включить контакт (вывести напряжение). Для этого мы просто переключаем бит, который соответствует желаемому выводу GPIO. В нашем случае бит 21.
  • GPCLR0 приказывает пи выключить контакт (без напряжения). Чтобы отключить вывод, установите бит на соответствующий вывод GPIO. В нашем случае бит 21

Прежде чем мы перейдем к миганию светодиода, сначала давайте создадим простую программу, которая просто включит светодиод.

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

  • .section.init сообщает пи, куда поместить код
  • .global _start

Затем нам нужно разметить все адреса, которые мы будем использовать. Используйте.equ, чтобы присвоить значениям читаемые символы.

  • .equ GPFSEL2, 0x08
  • .equ GPSET0, 0x1c
  • .equ GPCLR0, 0x28
  • .equ BASE, 0x3f200000

Теперь мы собираемся создать маски, чтобы установить биты, которые нам нужно установить.

  • .equ SET_BIT3, 0x08 Устанавливает третий бит 0000_1000
  • .equ SET_BIT21, 0x200000

Затем нам нужно добавить наш ярлык _start

_Начните:

Загрузить базовый адрес в регистр

ldr r0, = BASE

Теперь нам нужно установить бит 3 GPFSEL2

  • ldr r1, SET_BIT3
  • str r1, [r0, # GPFSEL2] Эта инструкция предписывает записать бит 0x08 обратно в адрес GPFSEL2.

Наконец, нам нужно включить GPIO 21, установив бит 21 в регистре GPSET0.

  • ldr r1, = SET_BIT21
  • str r1, [r0, # GPSET0]

Конечный продукт должен выглядеть примерно так, как показано на рисунке.

Следующим шагом является компиляция кода и создание файла.img, который может запускать Pi.

  • Загрузите прилагаемый make-файл, kernel.ld и, если вам нужен исходный код turn_led_on.s.
  • Поместите все файлы в одну папку.
  • Если вы используете свой собственный исходный код, отредактируйте make-файл и замените code = turn_led_on.s на code =.s
  • Сохраните make-файл.
  • Используйте терминал (linux) или окно cmd (windows), чтобы перейти к папке, содержащей файлы, введите make и нажмите Enter.
  • Файл make должен сгенерировать файл с именем kernel.img.
  • Скопируйте kernel.img на свою мини-SD-карту. Содержимое ваших карт должно быть таким, как показано на рисунке (рис. 3): bootcode.bin, start.elf, fixup.dat и kernel.img.
  • Извлеките карту mini sd и вставьте ее в пи
  • Подключите пи к источнику питания
  • Светодиод должен загореться !!!

НЕМНОГО ВАЖНОЕ ПРИМЕЧАНИЕ. Очевидно, у инструктируемых файлов возникла проблема с make-файлом, не имеющим расширения, поэтому я повторно загрузил его с расширением.txt. Удалите расширение при загрузке, чтобы оно работало правильно.

Рекомендуемые: