Как стать автором
Обновить

Assembler Editor Plus: Использование модулей

Время на прочтение6 мин
Количество просмотров3.4K

Продолжение цикла статей про редактор ассемблера для ARM микроконтроллеров под компилятор GNU AS

предыдущая статья Assembler Editor Plus: Первый проект

под катом будет скорее всего много картинок!

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

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

Поэтому нам нужно добавить модуль работы RCC в наш проект, для этого запускаем добавление модуля в проект (см. предыдущую статью если не знаете как)

RCC находится в блоке PERIPH микроконтроллера, поэтому идем по дереву "PERIPH" - "Reset and clock control (RCC)" и тут появляются варианты:

  • можно добавить просто файл определений RCC где будут описаны все регистры RCC и их возможные значения

  • можно добавить уже готовый модуль настройки тактирования GPIO, который нам добавит модуль RCC и одновременно предоставит интерфейс включения/выключения GPIO

При нажатии установить у вас будет запрошен путь и имя для сохранения файла модуля настройки тактирования, поскольку это периферия, то для того чтобы избежать неизбежной энтропии вселенной, лучше этот файл настройки сохранить по какому нить осмысленному пути, я выбрал путь src\periph\rcc

в модуле видим строки включения и выключения периферии портов ввода вывода

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

у меня это сегодня отладочная плата Open407I-C, как уже писал в предыдущих статьях, в варианте Easy пакета редактора, посмотреть даташиты на различные отладочные платы можно в каталоге ArmAsmEdit\Add\MCUDoc\DevBoards или скачать с сайта производителя вашей платы

у меня 2 варианта: GPIOH и GPIOI

буду использовать светодиоды подключенные к GPIOH

Для этого ищем в добавленном модуле строку включения GPIOH:

  1. встаем курсором на запись DISABLE для выбранного GPIO

  2. нажимаем кнопку "F4 Изменить"

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

Настройка будет исправлена на выбранную

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

Идем в main.asm и после инициализации тактирования микроконтроллера пишем .include (без пробела после него)

У меня в редакторе включен режим автоформатирования текста, поэтому директива после набора будет распознана, переведена в ВЕРХНИЙ регистр и помещена с начала строки

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

Можно "будущим поколениям" оставить примечание о том что же все таки мы здесь вставили

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

Как видно из списка, можно добавить как просто определения GPIO, так и уже готовые модули настройки, причем для некоторых GPIO (А, B, C) существуют индивидуальные модули настройки так как они имеют свои значения по умолчанию, в которые и устанавливаются после сброса микроконтроллера.

Мой GPIOH в списке индивидуальных не числится поэтому выбираем "Модуль конфигурирования одного порта GPIO", и как и в случае с RCC при установке модуля указываем путь и имя файла настройки, про опасность энтропии я уже писал, поэтому я сохраню этот файл в папке src\periph\gpio

И теперь самые догадливые наверное уже тянут руки к клавише "F4" на клавиатуре, или двигают указатель мыши к кнопке "F4 Изменить", и правильно ! только не забудьте сначала встать на значение настройки :-)

  • первое, нужно указать какой порт настраиваем

И далее, вспомнив к каким именно пинам у нас подключены светодиоды (см. свой даташит, у меня это пины 2 и 3), обратив внимание что они подключены катодом на землю - значит управляться будут выходным сигналом с пина GPIO без инверсии, настраиваем их, так же через нажатие кнопки "F4"

MODER пинов выставляем на "Выход", в нашем случае вам даже не надо особо запоминать как называется это значение, все есть в описании

АFR и OTYPER не трогаем (ну если особо интересно, можно через F4 посмотреть какие там варианты есть)

Скорость нам здесь особо не важна, но если очень желается можем задать максимально возможную

Вот в общем то и все по настройке GPIO, согласитесь это было хоть и не так как в привычном всем Кубе, но тем не менее тоже не особо сложно

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

Осталось зажечь нужный нам светодиод

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

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

  • нужно в один из регистров микроконтроллера загрузить адрес регистра, для этого будем использовать команду загрузки значения LDR, регистр пусть будет R0, введем с клавиатуры, [LDR R0,=] регистр вводимых символов не важен, компилятор их поймет в любом виде (еще раз обращаю внимание, если включено автоформатирование то команда ассемблера автоматически будет преобразована к верхнему регистру (если в настройках это выбрано), и позиционирована в строке, имена регистров у меня тоже преобразовываются к верхнему регистру)

Теперь нужно указать адрес регистра, я их не особо запоминаю, просто нажмем кнопку "F5 Символы" и в открывшемся окне выберем вкладку "Дерево символов" (можно нажатием на клавиатуре комбинации Ctrl+3)

Нам показаны символы и метки доступные из текущего местоположения (файла программы), для удобства они сгруппированы:

  • .GLOBAL - глобальные символы, видимые из любого файла проекта

  • MODULE - символы определенные в текущем местоположении (файле), ту да же попадают определения и метки вложенных директивой .include файлов

  • SWITCH - или любые другие группы настроек без определенной привязки, у нас это настройки одного из вложенных файлов (настройки тактирования GPIO)

  • STM32F4 - доступные определения по микроконтроллеру, они зависят от видимых из текущего положения инклудов обычно размещаемых в папке src\inc проекта

Раскроем ветку STM32F4, в ней найдем узел AHB1PERIPH_BASE (это устройства подключенные к шине), там нам интересен GPIO, и наконец наш GPIOH, и регистр настройки GPIO_ODR

Этот регистр, согласно Reference Manual RM0090 и отвечает за выдаваемое значение на пин

Базовый адрес GPIOH содержится в определенном символе GPIOH, его и загрузим в R0, для это просто выбрав его в дереве сделаем двойной клик или нажмем кнопку "Выбрать"

Определим записываемое значение в регистре R1 командой MOV и запишем значение в регистр GPIOODR, определенный как базовый адрес всех регистров GPIOH, в регистре R0, и смещение GPIO_ODR (последние опять таки можно вставлять по F5)

Теперь можно откомпилировать проект (про настройки компиляции, и сам процесс было описано в предыдущей статье)

Пора сходить за отладочной платой, подключить ее программатор к компьютеру и записать прошивку в устройство

по итогу мы должны увидеть горящий светодиод после программирования и сброса

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

Модуль установится в папку src\core\stk

в описании к модулю есть порядок его инициализации и использования:

  • добавить инициализацию можно в файле main.asm после инициализации тактирования, набираем команду BL, и дальше жмем F5 чтобы там выбрать нужный нам глобальный символ, или можно набрать после BL первые буквы SYS чтобы после нажатия F5 сразу увидеть подходящие по имени метки и символы

  • добавить запись значения в регистр R0 - который, согласно описанию на модуль и определяет задержку в мс и вызвать ожидание командой BL SYSTICK_DELAY. Дополнительно, помните я использовал R0 для определения адреса GPIOH ? - теперь мы наверное поменяем регистр на R2 чтобы не присваивать значение заново, и напишем простой индуский код нашей мигалки:

Дальше как всегда, компиляция, прошивка, сброс микроконтроллера

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

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

Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+4
Комментарии1

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань