Во первых строках сего письма хочется сказать, что идея написать эту статью пришла из-за того, что волею судьбы мне пришлось работать с микроконтроллерами компании Миландр. Помимо того, что информации по сети не так много, она еще и достаточно разрознена. И все бы ничего - кто ищет, тот найдет. Но пришлось (за неимением ничего другого под рукой) отлаживать программы при помощи эмулятора от 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-файл прошивки.
Программа для прошивки флеши МК 1986ВЕ Подготовили ПК. Теперь необходимо подготовить контроллер. В даташите написано о «загрузочном» положении переключателя. Для отладки 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