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

  1. Подготовка среды разработки

    Хочется сказать, что у компании производителя есть свой форум и некая база знаний в которых можно найти достаточно много полезной информации. Покапавшись в этих "архивах" было принято решение проводить разработку в keil, так как, судя по "отзывам" в нее достаточно просто интегрировать Миландровские детища. Для изи-интеграции необходим software pack для Keil, найти его и инструкции по установке можно туц.

  2. Подтягивание драйверов

    Существует, написанный добрым человеком загрузчик UART – «1986BE1UARTWSD». Легко находится на просторах интернета в комплекте с дровами. Использовать его достаточно удобно и отказываться большого смысла нет. Для его корректной работы нужен драйвер.

    Будем использовать OpenOCD и, естественно, gcc-none-eabi-gdb.

    Для работы болгарина под OpenOCD нужно обновить драйвера. Поможет программа. Вкратце: Открыв программу «Zadig» в выпадающем списке нужно выбрать JTAG эмулятор и жмякнуть «Install Driver». Тоже самое необходимо провернуть для «Interface1».

  3. Создание первого проекта

    Система готова, можно приступать к работе. Создание hello worldпод 1986BE описывать не буду, хорошо описано туц. Так, собственно, и делаем.

    Настройка проекта в Keil (до пункта «Debug», так как использовать будем не очень-то нативный эмулятор) описана туц.

    После выполнения всех шагов, указанных в статьях выше, имеем готовый для прошивки hex файл.

  4. Прошивка флеши

    Прошьем флешку готовой программой через UART загрузчик на примере отладочной платы от LDM-SYSTEM LDM-HELPER-K1986BE1QI.

    Подключаем USB к порту ПК и разъему X1 на отладке (usb разъем один – ошибиться будет трудно).

    Открываем программу «1986WE1WSD». В левом нижнем углу указываем корректный COM-порт, В поле “baud rate” ставим классические 115200, чекбоксы «Erase», «Program», «Verify» выставляем в true. С помощью кнопки “Browse…” находим новоиспеченный hex-файл прошивки.

    Программа для прошивки флеши МК 1986ВЕ
    Программа для прошивки флеши МК 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».

  5. Подтягивание отладчик��

    Начинается самое вкусное. Отладка. Если инфу по предыдущим пунктам найти не так сложно, разве что она немного разнесена по интернетам, то по подключению отладчика от 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