Оглавление:

СБОРКА РУКОЯТКИ GPIO - T.I. НАБОР ДЛЯ ОБУЧЕНИЯ СИСТЕМАМ РОБОТИКИ - ЛАБОРАТОРИЯ 6: 3 шага
СБОРКА РУКОЯТКИ GPIO - T.I. НАБОР ДЛЯ ОБУЧЕНИЯ СИСТЕМАМ РОБОТИКИ - ЛАБОРАТОРИЯ 6: 3 шага

Видео: СБОРКА РУКОЯТКИ GPIO - T.I. НАБОР ДЛЯ ОБУЧЕНИЯ СИСТЕМАМ РОБОТИКИ - ЛАБОРАТОРИЯ 6: 3 шага

Видео: СБОРКА РУКОЯТКИ GPIO - T.I. НАБОР ДЛЯ ОБУЧЕНИЯ СИСТЕМАМ РОБОТИКИ - ЛАБОРАТОРИЯ 6: 3 шага
Видео: Вебинар "Платформа Biamp Tesira: обзор оборудования" 2024, Ноябрь
Anonim
СБОРКА РУКОЯТКИ GPIO - T. I. НАБОР ДЛЯ ОБУЧЕНИЯ СИСТЕМАМ РОБОТИКИ - LAB 6
СБОРКА РУКОЯТКИ GPIO - T. I. НАБОР ДЛЯ ОБУЧЕНИЯ СИСТЕМАМ РОБОТИКИ - LAB 6

Привет, В предыдущем руководстве по изучению сборки ARM с использованием TI-RSLK Texas Instruments (использует микроконтроллер MSP432), также известного как Lab 3, если вы выполняете T. I. Конечно, мы рассмотрели некоторые очень простые инструкции, такие как запись в регистр и условный цикл. Мы пошагово выполнили выполнение с помощью Eclipse IDE.

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

Как-то скучно.

Давайте попробуем немного изменить это сегодня, узнав немного о портах ввода / вывода, в частности, о цифровых контактах GPIO.

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

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

Намного интереснее, чем просто пройти через отладчик.

(Мы все еще идем по шагу - это будет наша функция задержки):-D

Шаг 1. Попробуем записать / прочитать из ОЗУ

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

Начнем с чтения и записи по стандартному адресу памяти. Из предыдущего руководства мы знаем (см. Изображения), что ОЗУ начинается с 0x2000 0000, поэтому давайте воспользуемся этим адресом.

Мы собираемся перемещать данные между регистром ядра (R0) и 0x2000 0000.

Начнем с базовой файловой структуры или содержимого программы сборки. Пожалуйста, обратитесь к этому Руководству, чтобы создать проект сборки с использованием TI Code Composer Studio (CCS), а также некоторые примеры проектов.

.большой палец

.text.align 2.global main.thumbfunc main main:.asmfunc; ---------------------------------- -----------------------------------------------; (наш код будет здесь); ------------------------------------------ ---------------------------------------.endasmfunc.end

Хочу добавить что-то новое в верхний раздел, где есть какие-то объявления (директивы). Позже станет понятнее.

ACONST.set 0x20000000; мы будем использовать это дальше (это константа)

; очевидно, что «0x» означает шестнадцатеричное значение.

Итак, содержимое нашего начального файла теперь выглядит так:

.большой палец

.text.align 2 ACONST.set 0x20000000; мы будем использовать это в дальнейшем (это константа); очевидно, что «0x» означает шестнадцатеричное значение..global main.thumbfunc main main:.asmfunc; --------------------------------------- ------------------------------------------; (наш код будет здесь); ------------------------------------------ ---------------------------------------.endasmfunc.end

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

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

Примечание: помните, что в коде любая строка с точкой с запятой (';') означает, что это все комментарии после этой точки с запятой.

;-----------------------------------------------------------------------------------------------

; ПИШУ;------------------------------------------------ ----------------------------------------------- MOV R0, # 0x55; Основной регистр R0 будет содержать данные, которые мы хотим записать в место ОЗУ.; очевидно, что «0x» означает шестнадцатеричное значение.

Затем давайте посмотрим на утверждения, которые НЕ работают.

; MOV MOV не может использоваться для записи данных в область RAM.

; MOV предназначен только для немедленных данных в регистре; или из одного регистра в другой; то есть MOV R1, R0.; STR должен использовать STR.; STR R0, = ACONST; Плохой термин в выражении ('='); STR R0, 0x20000000; Неверный режим адресации для инструкции магазина; STR R0, ACONST; Недопустимый режим адресации для инструкции магазина

Не вдаваясь в подробности, мы попытались использовать указанное выше «ACONST». По сути, это подстановка или константа вместо использования буквального значения, такого как 0x20000000.

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

; кажется, мы должны использовать другой регистр, содержащий расположение RAM в

; приказ сохранить в этом месте ОЗУ MOV R1, # 0x20000000; установить расположение ОЗУ (не его содержимое, а расположение) в R1.; очевидно, что «0x» означает шестнадцатеричное значение. STR R0, [R1]; записать то, что находится в R0 (0x55) в RAM (0x20000000), используя R1.; мы используем другой регистр (R1), который имеет адрес расположения RAM; для записи в это место ОЗУ.

Другой способ сделать то же самое, но с использованием «ACONST» вместо буквального значения адреса:

; давайте сделаем то же самое снова, но давайте использовать символ вместо буквального значения местоположения RAM.

; мы хотим использовать «ACONST» в качестве замены для 0x20000000.; нам по-прежнему нужно использовать знак «#», чтобы обозначить немедленное значение; поэтому (см. вверху) нам пришлось использовать директиву.set.; чтобы доказать это, давайте изменим шаблон данных в R0. MOV R0, # 0xAA; хорошо, мы готовы записать в ОЗУ, используя символ вместо буквального значения адреса MOV R1, #ACONST STR R0, [R1]

В видео представлены некоторые более подробные сведения, а также пошаговое чтение из области памяти.

Вы также можете просмотреть прикрепленный исходный файл.asm.

Шаг 2: некоторая основная информация о портах

Image
Image
Некоторая основная информация о портах
Некоторая основная информация о портах
Некоторая основная информация о портах
Некоторая основная информация о портах

Теперь, когда у нас есть хорошее представление о том, как писать в / читать из места в ОЗУ, это поможет нам лучше понять, как контролировать и использовать вывод GPIO.

Итак, как мы взаимодействуем с контактами GPIO? Из нашего предыдущего взгляда на этот микроконтроллер и его инструкции ARM мы знаем, как работать с его внутренними регистрами, и мы знаем, как взаимодействовать с адресами памяти (RAM). Но контакты GPIO?

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

Это означает, что нам нужно знать, что это за адреса.

Ниже приведены начальные адреса портов. Кстати, для MSP432 «порт» - это совокупность контактов, а не только один контакт. Если вы знакомы с Raspberry Pi, я считаю, что это отличается от ситуации здесь.

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

Ниже я выделил порты, которые нас интересуют, жирным шрифтом.

  • GPIO P1: 0x4000 4C00 + 0 (четные адреса)
  • GPIO P2: 0x4000 4C00 + 1 (нечетные адреса)
  • GPIO P3: 0x4000 4C00 + 20 (четные адреса)
  • GPIO P4: 0x4000 4C00 + 21 (нечетные адреса)
  • GPIO P5: 0x4000 4C00 + 40 (четные адреса)
  • GPIO P6: 0x4000 4C00 + 41 (нечетные адреса)
  • GPIO P7: 0x4000 4C00 + 60 (четные адреса)
  • GPIO P8: 0x4000 4C00 + 61 (нечетные адреса)
  • GPIO P9: 0x4000 4C00 + 80 (четные адреса)
  • GPIO P10: 0x4000 4C00 + 81 (нечетные адреса)

Мы еще не закончили. Нам нужна дополнительная информация.

Для управления портом нам понадобится несколько адресов. Поэтому в приведенном выше списке мы видим «четные адреса» или «нечетные адреса».

Блоки адресов регистров ввода / вывода

Нам потребуются другие адреса, например:

  • Адрес входного регистра порта 1 = 0x40004C00
  • Адрес выходного регистра порта 1 = 0x40004C02
  • Адрес регистра направления порта 1 = 0x40004C04
  • Порт 1 Выберите 0 Адрес регистра = 0x40004C0A
  • Порт 1 Выберите 1 Адрес регистра = 0x40004C0C

И нам могут понадобиться другие.

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

Очень важное замечание: каждый порт ввода-вывода на плате MSP432 LaunchPad представляет собой набор из нескольких (обычно 8) контактов или линий, и каждый может быть индивидуально настроен как вход или выход.

Это означает, например, что если вы устанавливаете значения для «Адрес регистра направления порта 1», вам нужно заботиться о том, какой бит (или биты) вы устанавливаете или изменяете по этому адресу. Подробнее об этом позже.

Последовательность программирования порта GPIO

Наконец, нам нужен процесс или алгоритм для управления светодиодом.

Одноразовая инициализация:

  • Настройте P1.0 (P1SEL1REG: P1SEL0REG Register) <--- 0x00, 0x00 для нормальной работы GPIO.
  • Установите бит 1 регистра направления P1DIRREG как выходной или HIGH.

Петля:

Запишите HIGH в бит 0 регистра P1OUTREG, чтобы загорелся красный светодиод.

  • Вызов функции задержки
  • Запишите LOW в бит 0 регистра P1OUTREG, чтобы выключить красный светодиод.
  • Вызов функции задержки
  • Повторить цикл

Какая функция ввода / вывода (настройка SEL0 и SEL1)

Многие контакты на LaunchPad можно использовать по-разному. Например, тот же вывод может быть стандартным цифровым GPIO, или он также может использоваться в последовательной связи UART или I2C.

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

Это изображение выше для этого шага, которое пытается объяснить эту концепцию в визуальной форме.

Адреса SEL0 и SEL1 образуют комбинацию пар, которые действуют как своего рода выбор функции / функции.

Для наших целей нам нужен стандартный цифровой GPIO для бита 0. Это означает, что нам нужно, чтобы бит 0 для SEL0 и SEL1 был LOW.

Последовательность программирования порта (снова)

1. Запишите 0x00 в регистр P1 SEL 0 (адрес 0x40004C0A). Это устанавливает LOW для бита 0

2. Запишите 0x00 в регистр P1 SEL 1 (адрес 0x40004C0C). Это устанавливает LOW для бита 0, установку для GPIO.

3. Запишите 0x01 в регистр DIR P1 (адрес 0x40004C04). Это устанавливает HIGH для бита 0, что означает ВЫХОД.

4. Включите светодиод, записав 0x01 в выходной регистр P1 (адрес 0x40004C02).

5. Сделайте какую-то задержку (или просто выполните пошаговую отладку)

6. Выключите светодиод, записав 0x00 в выходной регистр P1 (адрес 0x40004C02).

7. Сделайте какую-то задержку (или просто пошагово выполняйте отладку)

8. Повторите шаги с 4 по 7.

Связанное видео для этого шага проведет нас через весь процесс в живой демонстрации, поскольку мы пошагово рассмотрим каждую инструкцию по сборке и покажем действие светодиода. Извините, пожалуйста, за длину видео.

Шаг 3. Заметили ли вы один недостаток в видео?

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

Спасибо, что нашли время ознакомиться с этим руководством.

Следующий расширяет то, что мы начали здесь.

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