
Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-23 15:05

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






О себе:.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



Есть три шага, чтобы ваш 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-карту. Готово! Хорошо еще раз, и шаги в порядке изображений:
- Найдите bootcode.bin, start.elf, fixup.dat.
- Убедитесь, что ваша SD-карта отформатирована в fat32.
- Переместите bootcode.bin, start.elf и fixup.dat на отформатированную SD-карту.
Вот как я в этом разобрался, ссылка.
Шаг 4: ПРОВЕРЬТЕ Mini SD


Хорошо, у нас есть загрузочная мини-SD-карта, и, надеюсь, у вас есть Pi 3 на данный момент. Итак, теперь мы должны протестировать его, чтобы убедиться, что Pi 3 распознает мини-SD-карту как загрузочную.
На пи, рядом с портом mini-usb, есть два небольших светодиода. Один красный. Это индикатор питания. Когда пи получает питание, этот индикатор должен гореть. Поэтому, если вы подключаете свой пи прямо сейчас без мини-SD-карты, он должен загореться красным. Хорошо, теперь отключите пи, вставьте загрузочную мини-карту SD, созданную на предыдущем шаге, и подключите пи. Вы видите еще один индикатор? Рядом с красным должен гореть зеленый свет, который указывает на то, что он читает SD-карту. Этот светодиод называется светодиодом ACT. Он загорится, когда вставлена работоспособная SD-карта. Он будет мигать при обращении к вашей мини-SD-карте.
Итак, после того, как вы вставили загрузочную мини-SD-карту и подключили пи, должны были произойти две вещи:
- Красный светодиод должен загореться, указывая на прием мощности.
- Зеленый светодиод должен загореться, указывая на то, что он загрузился в мини-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 нет! Однако есть неофициальный паспорт. Вот две ссылки на него:
- github.com/raspberrypi/documentation/files…
- web.stanford.edu/class/cs140e/docs/BCM2837…
Хорошо, на этом этапе вам следует потратить несколько минут, прежде чем перейти к следующему шагу, чтобы просмотреть таблицу данных и посмотреть, какую информацию вы можете найти.
Шаг 6: CODE2: 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. Удалите расширение при загрузке, чтобы оно работало правильно.
Рекомендуемые:
Мигающий светодиод с использованием Arduino (TinkerCAD): 5 шагов

Мигающий светодиод с использованием Arduino (TinkerCAD): Привет! Это руководство будет довольно простым. Здесь я собираюсь показать, как использовать TinkerCAD для мигания светодиода с помощью Arduino. TinkerCAD - довольно полезное программное обеспечение, когда дело доходит до быстрого тестирования вашего кода, и оно очень удобно для тех, кто
Мигающий светодиод STM32L100 с использованием Atollic TrueSTUDIO и STM32CubeMX: 5 шагов

Светодиод мигания STM32L100 с использованием Atollic TrueSTUDIO и STM32CubeMX: В этом проекте я расскажу вам о том, как мигать светодиодом с помощью 32L100discovery. Итак, здесь я собираюсь рассказать вам о принципе работы этого учебника с мигающим светодиодом, а также о том, какой тип программного и аппаратного обеспечения вам нужен
Мигающий светодиод с использованием ESP8266 NodeMCU Lua WiFi Учебное пособие: 6 шагов

Мигающий светодиод с использованием ESP8266 NodeMCU Lua WiFi Учебное пособие: ОПИСАНИЕ NodeMCU - это платформа IoT с открытым исходным кодом. Он включает в себя прошивку, которая работает на ESP8266 WiFi SoC от Espressif, и оборудование, основанное на модуле ESP-12. Термин "NodeMcu" по умолчанию относится к фильму, а не к т
Пульсирующий / затухающий / мигающий светодиод с таймером 555: 7 шагов

Пульсирующий / затухающий / мигающий светодиод с таймером 555: Эта крошечная схема представляет собой простой способ сделать затухающий светодиод без необходимости программирования микросхем или написания кода. Всего несколько простых компонентов, и вы готовы исчезать весь день. Конечным результатом является постоянное нарастание и затухание, как у Mac в режиме ожидания. Пытаться
Мигающий светодиод с использованием модуля ESP32 NodeMCU WiFi и Bluetooth Учебное пособие: 5 шагов

Мигающий светодиод при использовании ESP32 NodeMCU WiFi & Bluetooth Module Учебное пособие: Описание NodeMCU - это платформа IoT с открытым исходным кодом. Он программируется с использованием языка сценариев Lua. Платформа основана на проектах с открытым исходным кодом eLua. Платформа использует множество проектов с открытым исходным кодом, таких как lua-cjson, spiffs. Этот ESP32 NodeMc