Во первых строках сего письма хочется сказать, что идея написать эту статью пришла из-за того, что волею судьбы мне пришлось работать с микроконтроллерами компании Миландр. Помимо того, что информации по сети не так много, она еще и достаточно разрознена. И все бы ничего - кто ищет, тот найдет. Но пришлось (за неимением ничего другого под рукой) отлаживать программы при помощи эмулятора от Olimex. Тут стало тяжелее и было решено хоть как-то систематизировать знания для таких же зеленых бедолаг, как я, которые, возможно, столкнутся с подобными проблемами.
-
Подготовка среды разработки
Хочется сказать, что у компании производителя есть свой форум и некая база знаний в которых можно найти достаточно много полезной информации. Покапавшись в этих "архивах" было принято решение проводить разработку в keil, так как, судя по "отзывам" в нее достаточно просто интегрировать Миландровские детища. Для изи-интеграции необходим software pack для Keil, найти его и инструкции по установке можно туц.
-
Подтягивание драйверов
Существует, написанный добрым человеком загрузчик UART – «1986BE1UARTWSD». Легко находится на просторах интернета в комплекте с дровами. Использовать его достаточно удобно и отказываться большого смысла нет. Для его корректной работы нужен драйвер.
Будем использовать OpenOCD и, естественно, gcc-none-eabi-gdb.
Для работы болгарина под OpenOCD нужно обновить драйвера. Поможет программа. Вкратце: Открыв программу «Zadig» в выпадающем списке нужно выбрать JTAG эмулятор и жмякнуть «Install Driver». Тоже самое необходимо провернуть для «Interface1».
-
Создание первого проекта
Система готова, можно приступать к работе. Создание hello worldпод 1986BE описывать не буду, хорошо описано туц. Так, собственно, и делаем.
Настройка проекта в Keil (до пункта «Debug», так как использовать будем не очень-то нативный эмулятор) описана туц.
После выполнения всех шагов, указанных в статьях выше, имеем готовый для прошивки hex файл.
-
Прошивка флеши
Прошьем флешку готовой программой через UART загрузчик на примере отладочной платы от LDM-SYSTEM LDM-HELPER-K1986BE1QI.
Подключаем USB к порту ПК и разъему X1 на отладке (usb разъем один – ошибиться будет трудно).
Открываем программу «1986WE1WSD». В левом нижнем углу указываем корректный COM-порт, В поле “baud rate” ставим классические 115200, чекбоксы «Erase», «Program», «Verify» выставляем в true. С помощью кнопки “Browse…” находим новоиспеченный hex-файл прошивки.
Подготовили ПК. Теперь необходимо подготовить контроллер. В даташите написано о «загрузочном» положении переключателя. Для отладки LDM-HELPER-K1986BE1QI это устанавливается с помощью физической кнопки «LOAD» на плате.
На плате зажимаем кнопку «LAOD» и, не отпуская ее, нажимаем кнопку «PWROFF». После чего отжимаем “LOAD”. Плата готова к загрузке через UART.
В программе «1986WE1WSD» жмем «Start» и видим следующие сообщения:
«Синхронизация…ОК!»
«baud rate 115200 OK!»
«boot load…OK!»
«Chip erase done!»
«Program XXXX byte done!»
«Verify done!»
Программа прошита в отладку. Запустится по ресету или можно нажать «RUN» в программе «1986WE1WSD».
-
Подтягивание отладчика
Начинается самое вкусное. Отладка. Если инфу по предыдущим пунктам найти не так сложно, разве что она немного разнесена по интернетам, то по подключению отладчика от OLIMEX я мало чего нашел.
Для начала подключим ARM-USB-OCD-H к 1986BE. Тут выводы на каждой плате свои, но, опять же, на отладке LDM-HELPER-K1986BE1QI – это разъем X5. С другой стороны подключаем ARM-USB-OCD-H к ПК.
Запитываем плату.
Запускаем OpenOCD: заходим в командную строку вводим путь до установленной программы openOCD (обычно в распакованном архиве/bin/openocd.exe) и с помощью флагов –f указываем путь до конфигурационных файлов. Нам понадобится «архив/scripts\interface\olimex-arm-usb-ocd-h.cfg» и «архив/scripts\target\1986ве1т.cfg».
Для того, чтобы хоть немного облегчить себе жизнь можно создать bat-ник для старта OpenOcd по типу
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Старт OpenOcd. Подключение отладочного интерфейса
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Кодировка для норм понимания имени файла "1986ве1т.cfg"
chcp 65001
:: Путь до программы openOcd
set OPEN_OCD_PATH="C:\Users\ASePetrov\Desktop\OpenOCD-OLIMEX-WINDOWS\openocd-0.9.0-rc1\bin\openocd.exe"
:: Путь до используемого эмулятора (конф. openOcd)
set INTERFACE_PATH="C:\Users\ASePetrov\Desktop\OpenOCD-OLIMEX-WINDOWS\openocd-0.9.0-rc1\scripts\interface\olimex-arm-usb-ocd-h.cfg"
:: Путь до целевого камня (конф. openOcd)
set TARGET_PATH="C:\Users\ASePetrov\Desktop\OpenOCD-OLIMEX-WINDOWS\openocd-0.9.0-rc1\scripts\target\1986ве1т.cfg"
:: Стартуем!
%OPEN_OCD_PATH% -f %INTERFACE_PATH% -f %TARGET_PATH%
Видим примерно такое:
Значит, что все хорошо и мы запустили OCD. Теперь подтягиваем отладчик.
Снова открываем консоль и вводим:
<PATH_GDB> <PATH_AXF>
,где <PATH_GDB> - путь до arm-none-eabi-gdb.exe,
<PATH_AXF> - путь до исполняемого файла с выхода IDE Keil uVision (Обычно, в директории проекта/Objects/projName.axf)
Результат примерно такой:
Отлично, теперь можно выдавать команды для gdb.
Сначала расскажем ему, куда смотреть:
(gdb) target extended-remote localhost:3333
“localhost:3333” – так как OpenOCD открывает telnet соединения, как ни удивительно, на локальной машине, на порту 3333.
В консоли с gdb видим, что он подключился и, возможно, выдал некоторые отладочные, так сказать, сообщения:
В консоли с openOCD также можно заметить новое подключение:
Отлично, резетим проц:
(gdb) monitor reset halt
В итоге видим сообщения о том, что проц сброшен. Результат консоли gdb и openOCD, соответственно:
Теперь можно загружать исполняемый файл:
(gdb) load
Вуаля! Загружены и готовы к работе! Ставим точку останова при входе в main()
(gdb) b main
И запускаем программу
(gdb) c
Комментарии (14)
ripandtear
10.03.2022 13:47+7Плотно и уже достаточно долго работаю с данным МК, довольно неплох. Освоены все интерфейсы, кроме специфических для авиа-применений (Изначально был выбран из-за наличия ethernet на борту), сам писал USB CDC драйвер, и портировал FreeRTOS вместе с FreeRTOS+TCP.
Самый большой минус - отсутствие регистра указателя на таблицу векторов прерываний, т.е. из ОЗУ ПО не запустить, по факту работа происходит с тактами ожидания чтения из флэша - ядро эти такты простаивает (Там есть ускоритель чтения, но эффективен он только с линейными кусками кода, которые проще всего на ассемблере написать), а так же не функционирующий SysTick, который не заюзать для ОСРВ.
Есть еще специфика работы DMA которое почему-то имеет доступ только ко второй половине ОЗУ (там 32кб и 16кб).
В общем, все это преодолимо и работает в итоге нормально.
Использую последние версии vs code со всякими плюшками, gcc arm, cmake, openocd + j-link.
JozeAlehandro Автор
10.03.2022 22:15Из минусов (он же, наверное и плюс) - это количество пунктов в errata))
А вот насчет "т.е. из ОЗУ ПО не запустить" можно немного подробнее?
ripandtear
11.03.2022 10:06Я наверное изначально не очень понятно выразился - чисто технически здесь вы можете исполнять код из внешней памяти или из ОЗУ, в данном МК этот режим предполагается использовать только для перепрошивки flash, в случае с UART-загрузчиком.
Для полноценной работы данный режим не предназначен, т.к. не будут функционировать прерывания - для этого нужно переносить таблицу векторов прерываний туда, откуда будет исполняться код (Естественно что начало такой памяти должно быть отображаемо на 0x00000000 - об этом обычно заботятся уже производители конкретных МК).
punzik
10.03.2022 14:01+2А что с Миландром, кто нибудь знает?
mctMaks
10.03.2022 17:12дополню список вопросов (может кто-нибудь работает с их производными и имеет информацию из первых рук):
почему сайт внезапно на англицком стал, если производитель отечественный?
на сайте МК найти не смог;
кто торгует ими или где посмотреть прай?
куда пропал Петя?
Margel
11.03.2022 08:50+2Получил письмо от Миландр, что примерно до конца марта остановлены продажи категории ОТК.
Prometheus
11.03.2022 14:01У миландра такая штука работает, он по ip определяет регион, если смог определить что вы из РФ - откроет русскоязычный сайт. Иначе - будет редирект на .com
mctMaks
11.03.2022 15:35странно как-то работает у них определитель. мегафон\ростелеком\мегалинк дают мне не российский ip? digikey/mouser вполне успешно определили что из России идет запрос к ним, а эти не смогли.
edit: я себя по ip вычислил, внезапно я в Ростовской области) так что похоже не работает штука по определению региона пользователя
Lampadov
11.03.2022 16:03Здравствуйте!
От лица компании Миландр сообщаю, что на сайтах компании "Миландр" milandr.ru, support.milandr.ru, forum.milandr.ru проводятся технические работы, по завершении которых сайты milandr.ru и support.milandr.ru возобновят свою работу. Сроки возобновления работы русскоязычной версии сайта не определены, но мы прикладываем все усилия для оперативного решения данного вопроса. Сайт forum.milandr.ru временно работать не будет.Все возникающие вопросы просим адресовать на данную электронную почту отдела технической поддержки компании Миландр support@milandr.ru. Обратите, пожалуйста, внимание, что по телефону техническая поддержка временно осуществляться не будет. Спасибо за понимание.
Mih-mih
Почему бы не взять вместо Кейла няшный, быстрый и очень, очень удобный CodeBlocks, сделать там точно такие же настройки GDB+OpenJCD и спокойно отлаживаться прямо в редакторе? Olimex не подключал, но для J-Link там точно такие же действия.
JozeAlehandro Автор
Когда только приступил к работе с данным комплектом - первым делом чекнул инфу о том, где удобнее и какие инструменты юзать. Судя по форумам и
почтиоффициальной базе знаний понял, что Келич должен неплохо подойти. Грезы о том, что все супер легко встанет развеялись, пришлось разбираться, что, собсна, и послужило поводом для написания. Но с CodeBlocks обязательно попробую, спасибо)