Оглавление:

ЧАСТЬ 2 - СБОРКА GPIO ARM - RGB - ФУНКЦИОНАЛЬНЫЕ ВЫЗОВЫ - Переключатели: 6 шагов
ЧАСТЬ 2 - СБОРКА GPIO ARM - RGB - ФУНКЦИОНАЛЬНЫЕ ВЫЗОВЫ - Переключатели: 6 шагов

Видео: ЧАСТЬ 2 - СБОРКА GPIO ARM - RGB - ФУНКЦИОНАЛЬНЫЕ ВЫЗОВЫ - Переключатели: 6 шагов

Видео: ЧАСТЬ 2 - СБОРКА GPIO ARM - RGB - ФУНКЦИОНАЛЬНЫЕ ВЫЗОВЫ - Переключатели: 6 шагов
Видео: STM32. CMSIS #2. GPIO - создаем проект с нуля в ARM KEIL на CMSIS. 2024, Июль
Anonim
ЧАСТЬ 2 - СБОРКА GPIO ARM - RGB - ФУНКЦИОНАЛЬНЫЕ ВЫЗОВЫ - Переключатели
ЧАСТЬ 2 - СБОРКА GPIO ARM - RGB - ФУНКЦИОНАЛЬНЫЕ ВЫЗОВЫ - Переключатели

В части 1 мы узнали, как переключать один красный светодиод на плате разработки MSP432 LaunchPad от Texas Instruments, используя сборку вместо C / C ++.

В этом руководстве мы сделаем нечто подобное - будем управлять светодиодом RGB, который также находится на той же плате.

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

Шаг 1. Давайте сразу приступим

Действительно, первое видео говорит само за себя. Больше нечего добавить.

Суть этого в том, чтобы донести идею о том, что каждый порт ввода / вывода на MSP432 состоит из блока «регистровых» адресов, которые, в свою очередь, состоят из нескольких битов каждый.

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

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

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

Мы подчеркнули, что нам нужно несколько регистров: регистр DIR, регистр SEL0, регистр SEL1 и регистр OUTPUT. И каждый раз по три бита.

Шаг 2. Улучшение кода - добавление функции

Image
Image

Как вы видели на шаге выше, в основном цикле программы было много повторяющегося кода, а именно, когда мы выключали светодиоды.

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

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

Часть встроенного программирования и микроконтроллеры гораздо больше осведомлены о размере программы.

Видео объясняет.

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

Шаг 3. Добавьте задержку занятого шлейфа

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

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

; код в этой части присваивает имя значению.; вы также могли бы использовать '.equ', но они немного отличаются.; '.equ' (я думаю) не может быть изменен, тогда как '.set' означает, что вы можете; измените значение «DLYCNT» позже в коде, если хотите.; 'DLYCNT' будет использоваться в качестве значения обратного отсчета в подпрограмме задержки. DLYCNT.set 0x30000

Добавьте новую функцию задержки:

задержка:.asmfunc; начало подпрограммы или функции «задержки».

MOV R5, #DLYCNT; загрузить регистр центрального процессора R5 значением, присвоенным 'DLYCNT'. dlyloop; это отмечает начало цикла задержки. ассемблер определяет адрес. SUB R5, # 0x1; вычесть 1 из текущего значения в регистре центрального процессора R5. CMP R5, # 0x0; сравнить текущее значение в R5 с 0. BGT dlyloop; перейти, если значение в R5 больше 0, чтобы пометить (адрес) 'dlyloop'. BX LR; если мы добрались сюда, значит, значение R5 было 0. возврат из подпрограммы..endasmfunc; отмечает конец подпрограммы.

Затем в основном теле в основном цикле вызовите или вызовите эту функцию задержки:

; это фрагмент кода основного тела или основной функции (см. файл main.asm).

; это цикл в «main», и он показывает, как мы вызываем или используем эту новую функцию «delay».; '#REDON' и '#GRNON' также являются объявлениями (константами) (см. верхнюю часть main.asm).; они просто простой способ установить указанный цвет светодиода RGB. loop MOV R0, #REDON; Красный - установить регистр R0 процессора ядра со значением, присвоенным REDON. STRB R0, [R4]; регистр ядра R4 ранее был установлен с выходным адресом GPIO.; запишите, что находится в R0, по адресу, указанному R4. BL delay; переход к новой функции «задержки». BL ledsoff; переход к уже существующей функции ledsoff. BL delay; то же MOV R0, #GRNON; зеленый - то же STRB R0, [R4]; и так далее. BL delay BL ledsoff BL задержка

В видео подробно рассказывается.

Шаг 4: Стандарт вызова процедур архитектуры ARM (AAPCS)

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

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

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

Регистры ядра

Поскольку мы познакомились с регистрами ядра MSP432, давайте попробуем принять некоторые из этих стандартов. Мы будем соответствовать этому, когда напишем следующую функцию (включение / выключение светодиода).

1) Мы должны использовать R0 в качестве параметра функции. Если мы хотим передать значение в функцию (подпрограмму), мы должны использовать для этого R0.

2) Мы должны использовать регистр ссылок по прямому назначению - он содержит адрес, который указывает, куда вернуться после завершения подпрограммы.

Вы увидите, как мы их применяем.

Шаг 5: Функция с параметром - вложенные функции

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

Подробности смотрите в видео. (извините за длину)

Шаг 6: Вход GPIO - добавление переключателей

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

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

По сути: переключатель 1 (SW1 или S1) подключен к P1.1, а переключатель 2 (SW2 или S2) подключен к P1.4.

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

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

Блок адреса регистра порта 1

Помните, что мы рассмотрели это в предыдущем руководстве, но мы должны включить новый:

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

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

Поскольку плата разработки Launchpad подключила два переключателя к земле (НИЗКИЙ при нажатии), это означает, что мы должны использовать подтягивающие резисторы, чтобы убедиться, что у нас есть устойчивый ВЫСОКИЙ, когда они не нажаты.

Подтягивающие / понижающие резисторы

Для подключения этих входов переключателя к подтягивающим резисторам требуются два разных адреса регистра порта 1.

1) Используйте регистр включения резистора порта 1 (0x40004C06), чтобы просто указать, что вам нужны резисторы (для этих двух битов), 2), а затем используйте выходной регистр порта 1 (0x40004C02), чтобы установить резисторы как на повышающие, так и на понижающие. Может показаться странным, что мы используем регистр вывода на входах. Регистр вывода имеет почти двойное назначение.

Итак, чтобы переформулировать другой способ, выходной регистр может либо отправлять HIGH или LOW на выход (например, один красный светодиод), и / или он используется для установки подтягивающих или понижающих резисторов для входов., НО ТОЛЬКО если эта функция была включена через регистр включения резистора.

Важно в вышеизложенном - при отправке / установке НИЗКОГО или ВЫСОКОГО для любого выходного бита вам необходимо одновременно поддерживать подтягивающее / понижающее состояние входных битов.

(видео пытается объяснить)

Чтение входного бита порта

  • Установите SEL0 / SEL1 для работы GPIO
  • Установите регистр DIR как вход для битов переключателя, но как выход для светодиода (одновременно в том же байте)
  • Включить резисторы
  • Установите их как подтягивающие резисторы
  • Прочтите порт
  • Вы можете отфильтровать прочитанное значение, чтобы выделить только те биты, которые вам нужны (переключатель 1 и 2)

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