Программирование микроконтроллеров Миландр в среде CooCox IDE 1.7

Довелось мне как-то поработать с российским микроконтроллером Миландр 1986ВЕ91Т (ближайший аналог STM32F103), что побудило меня к написанию этой статьи. Хочу заметить, что для неподготовленного человека работа с микроконтроллерами Миландр  сопровождается рядом трудностей, связанных с отсутствием отладочных средств и средств разработки. В наличие у меня имелось два отладчика: китайский ST-Link и китайский клон J-Link v8, - которые успешно работают с микроконтроллерами STM32. Программное обеспечение данных отладчиков не поддерживает МК фирмы Миландр. На момент написания статьи известно две платных среды разработки, в которые можно добавить поддержку МК Миландр – это Keil и IAR. Если пошерстить форум http://forum.milandr.ru, то можно более детально разобраться как это делается.

Вкратце, для Keil скачиваем пакет Keil.MDR1986BExx_v1.5.0.pack (или другие версии), который содержит алгоритмы программирования Flash, файлы описания регистров, драйвер CMSIS,а также драйвера периферии Standard Peripherals Library от производителя (которые, как мне показалось, являются переработанными драйверами от ST). Пакет устанавливается через Pack Installer и в принципе на этом все. Дальше в проекте производятся настройки отладчика и выбор алгоритма программирования.

Добавить поддержку МК Миландр в IAR тоже достаточно просто, но процесс не автоматизирован как в среде Keil. Пользователю необходимо скачать архив примерно с таким же набором файлов и скопировать в нужные директории, где установлена среда IAR.

Почему я выбрал среду разработки CooCox IDE, когда уже есть готовые решения? Во-первых, она бесплатна. Во-вторых, она построена на базе Eclipse, к которому я очень сильно привык и этой мой любимый редактор. В третьих, данная среда имеет простой интерфейс и минимум настроек. В четвертых, текстовые редакторы в средах Keil и IAR морально устарели и очень неудобны (кто работал в Eclipse или QtCreator меня поймут).

В интернете есть прекрасная статья «Спариваем CoIDE и российский Cortex M3»

В принципе можно сделать все как описано в указанной статье: добавить bat-файл, который будет переписывать содержимое конфигурационного файла config\devices\ARM\M3.xml, из которого IDE понимает какой объем FLASH и RAM памяти у МК, начальные адреса данных областей памяти, а также алгоритмы отладки и программирования. И добавить алгоритм программирования в директорию flash. Копирование конфигурационного файла необходимо при каждой компиляции, потому как IDE его всегда перезаписывает параметрами по умолчанию для процессора ARM Cortex-M3.

Я пошел по другому пути. Он немного лучше первого, но пока имеет свои недостатки, которые в дальнейшем можно исправить (я опишу немного позже идею как это сделать, а в будущем возможно и ее решение). У меня возник закономерный вопрос: если IDE постоянно перезаписывает файл M3.xml, то где-то она должна брать данные для этого. Сначала возникло подозрение, что данные среда достает из архива data.zip, который лежим в папке установки IDE. Но предположение оказалось ошибочным. Хотя данный архив еще нам пригодится. И, забегая наперед, скажу, что при запуске проекта среда его распаковывает и берет необходимые файлы – файлы описания регистров МК. Я пришел к выводу, что данные загружаются не из обычного текстового файла, а из базы данных. И с помощью встроенного в Total Commander поисковика нашел файл базы данных SQLite. Это файл хранится здесь: bin\ICoodat.dll

Разработчики зачем-то замаскировали его под динамическую библиотеку *.dll. Во второй версии среды этого файла уже нет и данные хранились на сервере разработчика, который теперь тоже уже не существует.

В базе данных хранится много информации, например: производители контроллеров, семейства, серии, вся информация по каждому микроконтроллеру, а также программные компоненты общие и индивидуальные для каждого МК.  

Сначала я изучил структуру таблиц базы данных и связь между ними с помощью программы SQLiteStudio и вручную прописал микроконтроллер 1986ВЕ91Т. Позже я написал утилиту, которая помогает автоматизировать этот процесс и будет полезна людям, которые не умеют работать с базами данных либо хотят быстро без лишних заморочек добавить поддержку нужного ARM-процессора в среду CooCox IDE. Данную утилиту я предоставляю для свободного скачивания. Пока она умеет добавлять микроконтроллеры в базу CooCox IDE. В будущем, если программа вызовет интерес, я добавлю возможность подключения программных компонентов для МК. Ссылка для скачивания находится в конце статьи.

Итак, поехали. Будем считать, что CooCox IDE уже установлена. Запускаем утилиту, которую я назвал «Конфигуратор CooCox IDE» (далее конфигуратор).

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

Если путь указан правильно и программа найдет базу данных, то произойдет автоматическое переключение на вкладку «Микроконтроллеры», а в поле «Производитель» появится список доступных производителей. В противном случае все списки на вкладке «Микроконтроллеры» будут пусты. Считаем, что с этим пунктом разобрались и переда нами такая картина:,

C помощью кнопок «+» добавим по порядку производителя, семейство, серию и микроконтроллер. Важное замечание! Все имена должны быть прописаны латинскими буквами и не начинаться с цифр. Имя 1986ВЕ1 – некорректно, потому как начинается с цифры и содержит русские символы.

«Cortex M3» нужно писать с пробелом, именно так как у меня. Иначе параметр cpu, передаваемый компилятору, будет не «-mcpu=cortex-m3;», а «-mcpu=cortex-m0;»

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

В качестве алгоритма отладки выбираем cortex-m3.xml

Если планируется работа с отладчиком J-Link, то нет необходимости добавлять алгоритм программирования, потому как программирование осуществляется с помощью программного обеспечения SEGGER и, даже если задать алгоритм программирования, он не будет использоваться. Жмем «Сохранить изменения».

При работе с отладчиком ST-Link алгоритм программирования понадобится. Я не стал изобретать велосипед и просто взял elf-файл из архива _CoIDE_patch.zip, скачанного с сайта изиэлектроникс.

Файл MDR.elf необходимо скопировать в директорию flash. После этого жмем кнопку «Обновить» и переходим на вкладку «Алгоритмы».

В колонке «Новые алгоритмы программирования» появится наш алгоритм. Чтобы его прописать в базу данных нужно нажать кнопку «<<».

Далее на вкладе «Микроконтроллеры» снова жмем кнопку «Обновить» и наш алгоритм появляется в выпадающем списке.

Выбираем его и жмем кнопку «Сохранить изменения»

Все, на этап добавления микроконтроллера в базу данных завершен. Переходим к созданию проекта.

Ура, в списке чипов появился наш родной Миландр!)) И оказывается у него очень крутые характеристики))

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

В startup-файле я внес изменение, без которого при отладке в RAM-памяти происходит некорректный переход по векторам прерываний в область флеш-памяти. Эти строчки необходимо добавить в обработчик сброса Default_Reset_Handler перед вызовом функции SystemInit:

//Если программа работает из RAM, то таблица векторов перываний
//тоже находится в RAM и мы должны сообщить об это процессору
if ((unsigned long) g_pfnVectors >= 0x20000000)
{
	*((unsigned long*) (0xE000ED08)) |= 0x20000000;
}

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

Ссылка на шаблонный проект будет также приведена в конце статьи.

Дальше нам необходимо наладить процесс программирования Flash-памяти.

Если планируется использовать отладчик ST-Link, то он просто выбирается в списке отладчиков и готов к работе. Нужно только убедиться перейдя на вкладку Download, что появился указанный нами алгоритм MDR.elf в поле Programming Algorithm.

Лично у меня возникли проблемы при работе с китайским ST-Link’ом следующего характера: флеш прошивается успешно, отладка запускается, но я не вижу данных в RAM-памяти и соответственно содержимое регистров периферии. С чем это связано не знаю. Если кто-то знает решение этой проблемы, то поделитесь им пожалуйста со мной и другими читателями в комментариях.

Из-за проблем с ST-Link я был вынужден работать с отладчиком J-Link. С ним тоже не все так просто оказалось:

  1. У меня китайский клон J-Link v8 и в нем периодически слетает прошивка. Восстановить прошивку можно по следующей методике: https://delfer.ru/2011/12/03/китайский-j-link-v8/
  2. Последняя версия прошивки J-link, которая обновляется без проблем, работает с SEGGER 4.92. При работе с софтом SEGGER более поздних версии предлагается обновление прошивки, после чего J-Link превращается в кирпич. В версии SEGGER 4.92 невозможно добавить свой МК для программирования. Если я не ошибаюсь такая возможность появилась начиная с 6-й версии SEGGER. Хотя, покопавшись в интернете, я выяснил, что информация о всех поддерживаемых МК хранится в файле JLinkARM.dll, отредактировать который невозможно. Но есть утилита от разработчика Segger RamCode SDK, позволяющая написать свой алгоритм прошивки и создать проект для JFlash на основе этого алгоритма.  На форуме segger разработчики говорят, что могут выслать на E-mail данную утилиту всем желающим по запросу. Реально же на мой запрос никто не ответил. Если у кого-то есть эта утилита, поделитесь пожалуйста ею).

Решение было найдено следующее:

  1. Обновить прошивку до версии Segger 5.0. Сделал я это по следующей методике https://gronlier.fr/blog/2015/07/unbrick-and-update-an-j-link-v8-clone/

Просто зашивается прошивка с серийным номером -1, что и позволяет обновиться до 5-й версии segger. Прошивка также находится в архиве с остальными файлами. Ссылка на архив в конце статьи.

  1. Установить последнюю версию SEGGER 6.42b (последняя на момент написания).
  2. Добавить поддержку микроконтроллеров Миландр в версии софта SEGGER 6.42

Таким образом 5-я версия SEGGER будет использовать для отладки. Будет использоваться в частности GDB-сервер. А 6-й версия для программирования Flash-памяти. Практика показала, что GDB-сервер 6-й версии SEGGER работает криво с китайским клоном, обновленным до 5-й версии.

Архив с алгоритмами программирования, а также файл с описанием микроконтроллеров Миландр я скачал здесь: http://forum.milandr.ru/viewtopic.php?p=19783

Название архива: MilandrDBforSegger.rar

Один из участников форума предложил свою утилиту JLinkFlash.ZIP. Ее можно использовать для зашивки флеш-памяти отдельно от среды разработки. В дальнейшем возможно ее я попытаюсь прикрутить к CooCox IDE.

Из архива MilandrDBforSegger.rar папку Milandr добавляем в папку c:\Program Files (x86)\SEGGER\JLink_V642b\Devices\

Файл JLinkDevices.xml из архива открываем любым текстовым редактором и копируем содержимое между тегами <DataBase>…</DataBase> в такой же файл в папке c:\Program Files (x86)\SEGGER\JLink_V642b\Devices\JLinkDevices.xml

На ютубе есть видео, где человек объясняет на пальцах как это сделать:

https://www.youtube.com/watch?v=C-SSlbwnGnM

После этих операций запускам программу JFlash из каталога, куда установлен segger 6.42.

В поле Target Device выбираем производителя Milandr.

Интерфейс отладки можно выбрать любой.

Дальше (важно!) необходимо сохранить проект из JFlash в каталог Samples\JFlash\ProjectFiles\Milandr\ под именем MDR32F9Q1.jflash

Дальше необходимо написать bat-файл, который будет вызывать утилиту JFlash в фоновом режиме. Содержимое файла может быть следующим:

@echo OFF

set SEGGER_JLINK_DIR=c:\Program Files (x86)\SEGGER\JLink_V642b\
set SEGGER_JFLASH_PRJ_DIR=Samples\JFlash\ProjectFiles\
set MCU_MANUFACTURER=Milandr
set JFLASH_PROJ_NAME=MDR32F9Q1.jflash
set JFLASH_PROJ_PATH=%SEGGER_JLINK_DIR%%SEGGER_JFLASH_PRJ_DIR%%MCU_MANUFACTURER%\%JFLASH_PROJ_NAME%

set SEGGER_PARTITION=%SEGGER_JLINK_DIR:~0,2%

set PROJECT_OUT_FILE_PATH=%1
set OUT_FILE=%PROJECT_OUT_FILE_PATH%\%2.hex
set PROG_LOG_FILE=jflash.log

set PROJECT_PARTITION=%PROJECT_OUT_FILE_PATH:~0,2%

cd /d %SEGGER_PARTITION%
cd %SEGGER_JLINK_DIR%

start /wait JFlash.exe -openprj%SEGGER_JFLASH_PRJ_DIR%%MCU_MANUFACTURER%\%JFLASH_PROJ_NAME% -open%OUT_FILE% -connect -erasechip -program -programverify -exit -hide -jflashlog%PROJECT_OUT_FILE_PATH%\%PROG_LOG_FILE% 

cd /d %PROJECT_PARTITION%
cd %PROJECT_OUT_FILE_PATH%
echo %CD%
type %PROG_LOG_FILE% 
echo.

В переменной SEGGER_JLINK_DIR необходимо указать путь, где у вас установлен пакет программ Segger 6.42, в JFLASH_PROJ_NAME указать имя файла проекта, который мы только что создали в JFlash. В конце статьи так же прилагается готовый bat-файл, который просто нужно будет скопировать в папку проекта.

Когда бат-файл готов переходим к настройкам проекта View->Configuration.

На вкладке User находим поле After Build/Rebuild/Run#1, ставим галочку и вписываем строчку следующего содержания:

${project.path}/mdr_program.bat ${project.bin} ${target.name}

mdr_program.bat – так должен называться bat-файл. Если имя другое, то его также нужно скорректировать в данной строчке.

На вкладке Link выбираем режим отладки во Flash-памяти – Debug in flash.

На вкладке Adapter выбираем отладчик JLink, а в поле GDBServer cmdline tool указываем путь к GDB-серверу 5-й версии Segger: C:\Program Files (x86)\SEGGER\JLink_V500\JLinkGDBServerCL.exe

И пробуем скомпилировать проект CTRL+R. После успешной компиляции должен начаться процесс программирования памяти контроллера, а в окне Console должен появиться лог процесса программирования.

Теперь прошивка флеш-памяти будет осуществляться после каждой компиляции. Если в этом нет необходимости, то нужно снять галочку возле поля Run#1.

Когда флеш-память зашита, смело давим на жука и запускаем режим отладки. В момент первого запуска можно увидеть такое окно:

Т.к. старый JFlash не знает устройства MDR32F91T, то он предлагает его найти в списке вручную. Жмем кнопку No и JFlash работает как с процессором Cortex-M3.

Хорошо было бы конечно в CooCox IDE добавить возможность выбора алгоритма программирования для JLink как это было сделано для ST-Link, чтобы не привязываться к программе JFlash от SEGGER (как это сделано в Keil или IAR), но для этого нужно переписать пару плагинов на Java, что мне не по силам. Если кто-то знает о чем речь идет, то могу в комментариях сказать названия плагинов, которые отвечают за работу с отладчиками.

Теперь скажу еще об одной неприятности и ее не совсем красивом решении.

Когда вы захотите увидеть в режиме отладки содержимое регистров периферии МК, а сделать это можно через меню View->Peripherals, то в списке сможете увидеть только общий набор регистров, присущий каждому МК на ядре Cortex-M3. Ответ кроется в файле описания регистров. По моим наблюдениям, когда пользователь создает новый проект и выбирает МК, файл описания регистров вытаскивается из архива data.zip. В данном архиве находятся файлы с расширением *.xml и *.svd. svd – это широко распространенный формат описания регистров (http://www.keil.com/pack/doc/CMSIS/SVD/html/), а  то, что в xml-файлах – это особый формат описания регистров от разработчиков среды CooCox IDE. Казалось бы достаточно забросить в архив svd-файл описания регистров МК Миланд и проблема решится. На деле оказалось, что  в CooCox IDE есть баг, из-за которого он не подгружает svd-файлы. Если программа находит файл с именем chip_<имя_контроллера>.xml, тогда она копирует его в каталог data. В противном же случает подгружается общий файл описания регистров из каталога data. В данном случает это файл M3.svd.

Что сделал я? Я нашел svd-файл регистров для микроконтроллера 1986ВЕ91Т в пакете Keil.MDR1986BExx_v1.5.0.pack, скопировал из него описание регистров периферии и вставил в файл data\M3.svd вдобавок к тем регистрам, которые там уже были описаны. Теперь в списке Peripherals я вижу полный набор регистров МК 1986ВЕ91Т. Метод плох тем, что при выборе другого МК семейства Cortex-M3, для которого нет xml-файла описания регистров, подгружается список регистров для МК 1986ВЕ91Т. В дальнейшем в конфигуратор планируется добавить возможность конвертировать файл формата svd в xml. Если кто-то хочет помочь с этим, то только буду рад.

  • Конфигуратор CooCoxConfigurator.zip
  • Шаблон проекта (с bat-файлом программирования внутри) MilandrProjectTemplate.zip
  • Алгоритмы программирования и файл описания устройств для SEGGER MilandrDBforSegger.rar
  • Bat-файл для программирования, алгоритм программирования для ST-Link, svd-файл описания регистров и прошивка JLink с серийным номером -1: Patсh_CooCox_Milandr.zip

Обновление 22.02.2019

Написал программу, которая перегоняет файл описания регистров SVD в формат описания CooCox IDE.

Пользоваться программой просто. Скачиваем архив и распаковываем. В архиве находится файл svd2xml.exe и несколько динамических библиотек. Программа запускается из командной строки. В качестве аргументов программе можно передать имя svd-файла, имя микроконтроллера, которое пользователь желает прописать в файле (так же от него зависит выходное имя XML-файла) и серию контроллера. Имя и серия должны быть такими же, которые задавались при создании в конфигураторе.

Формат команды:

svd2xml [svdFile] [-nChipName] [-sSerie]

Программу можно запустить вообще без параметров. В этом случае она будет искать svd-файл в своем каталоге и преобразует его в xml-файл с именем микроконтроллера, которое прописано в SVD-файле.

После того, как xml-файл будет создан в каталоге программы, его необходимо добавить в файл data.zip, который находится в каталоге установки среды CooCox IDE: d:\IDE\CooCox\CoIDE\data.zip

SVD-файлы можно стащить, например, из пакета драйверов для Keil. Я брал отсюда: c:\Keil_v5\ARM\Pack\Keil\MDR1986BExx\1.5\IDE\keil\SVD\

Если вы будете брать файлы из пакета Keil, то нужно поправить ошибку, из-за которой они не парсятся программой: не хватает кавычки после строки CMSIS-SVD_Schema_1_1.xsd. Не забудьте только снять флажок с файла "Только чтение".

Если все сделаете правильно, то после создания проекта в каталоге data вы увидете свой файл: d:\IDE\CooCox\CoIDE\data\chip_ИМЯ_ЧИПА.xml, а открыв меню View->Peripherals сможете увидеть полный список регистров микроконтроллера. Если вдруг возникнут ошибки в работе программы, то пишите в комментах. Я сталкивался с такой ошибкой, что svd-файл не содержал поля description некоторых регистров и это приводило к ошибке загрузки в CooCox IDE. Пришлось заполнять это поле произвольными данными в случае его отсутствия. Я так понял CooCox IDE очень чувствителен к таким вещам.

Качаем программу здесь: CooCoxSVDConverter.zip

Спасибо за внимание! Жду ваших комментариев!

Комментарии

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

Давно ищу способ добавления используемых мной stm32f3xx в CoIdE. В данный момент понадобился stm32f303R8. И вот проблема, у меня программа не принимает путь с программой "C:\CooCox\CoIDE" соответственно и вкладка "микроконтроллеры" пуста. Пробовал на разных ПК, версия CoIde 1.7.8. В чем может быть дело?

Добрый День! Прочитал статью скачал все что надо и начал работать. И на первом шаге столкнулся с проблемой конфигуратор не видит файла базы данных. пишет ошибка база данных не найдена, хотя ICoodat.dll присутствует и это действительно он во всяком случаи его читает просмотрщик. SQLite format 3. Так, в чем здесь дело?