Разработка собственной библиотеки для микроконтроллеров "Миландр"
Зачем это понадобилось
Текущая версия официальной библиотеки предоставляет достаточно низкоуровневый доступ для настройки периферии. Это, с одной стороны, дает максимальную гибкость, но с другой стороны, требует написания достаточно больших кусков кода для реализации чего-то осмысленного. Например, для того чтобы настроить тактирование от HSE через PLL, необходимо вызвать достаточно большое количество функций по включению генераторов и PLL, ожидания готовности и прочего. И в каждом новом проекте приходится этот код дублировать, либо создавать свои библиотеки чуть более высокого уровня, чтобы использовать уже сформированные функции. Но каждому пользователю приходится делать это самому, что по отзывам техподдержки не для каждого новичка по силам. Одной из целей нашего проекта является реализация функций "под ключ", то есть вызов одну функции обеспечивает настройку тактирования. При этом доступ к низкоуровневому управлению по прежнему сохраняется. Это относится к инициализации и прочих блоков.
Реализация периферийных блоков, в частности блоков тактирования, очень сильно изменилась в микроконтроллерах 1986ВЕ8Т, 1923ВК014, "Электросила" по сравнению со всеми предыдущими. Разбираться в деталях реализаций можно очень долго, что сильно тормозит реализацию простейших задач. Поэтому хочется иметь
общий API, реализующий некий уровень
HAL (Hardware Abstract Level) позволяющий один код запускать на всех микроконтроллерах, пусть хотя бы с минимальными изменениями. В данном случае высокоуровневые функции настройки "под ключ" будут явно полезнее мелких функций, позволяющих переключать лишь определенные поля и биты.
Высокоуровневые функции позволяют поднять "читабельность" кода, поскольку настройка каждого блока размером с пол экрана снижает восприятие последовательности осмысленных действий. Вызов функции должен ясно отражать, что она делает и к каким последствиям приводит. Это избавляет от необходимости опускаться в реализацию каждой функции и вникать, что происходит при ее вызове. Например, часто встречающийся вызов типа ClockInit() в проектах никак не позволяет понять, какая частота будет настроена. Если бы вызов выглядел ClockInit_PLL_HSE(x8), то сразу становится очевидно, откуда будет тактирование и какая частота. Т.е. нет необходимости отвлекаться на изучение реализации ClockInit, чтобы понять что происходит. При таком подходе код сводится к нескольким строчкам настроек, и далее идет собственно реализация функционала задачи. Правильно структурированный проект не требует пролистывания 15-ти экранов текста чтобы разобраться, что он, собственно, делает.
Использование осмысленных перечислений ENUM взамен всеядного uint32_t. Тяжело перемещаться по коду в поисках того, какое значение следует задать в переменную типа uint32_t, в каком *.h файле объявлены значения и какие значения допустимы. Поэтому, по возможности, все параметры заводятся через перечисления, прыжок через "Find Declaration" к типу переменной приводит к значениям, которые можно задать в интересующем параметре. Компилятор при этом выдает предупреждение, если значение, заданное в переменную, не будет соответствовать типу переменной. К сожалению, компилятор выдает подобные предупреждения не во всех случаях, но даже это позволяет увидеть множество ошибок в параметрах еще на этапе компиляции.
Компилятор ARM v6 отслеживает больше потенциальных ошибок и засыпает предупреждениями там, где могут быть проблемы. Поэтому код библиотеки будет проверяться для данного компилятора, совместно с ARM v5. Позднее планируется адаптировать библиотеку под компилятор GCC, но это задача на далекое будущее или на возникновение крайней необходимости.
Поддержка микроконтроллеров, на которые нет официального пака -
"Электросила", 1923ВК014, 1986ВК214, 1986ВК234. Потенциально Pack должен будет поддерживать все микроконтроллеры под единым
API, т.е. это 1901ВЦ1, 1986ВЕ1Т, 1986ВЕ3Т, 1986ВЕ4У, 1986ВЕ91Т, 1986ВЕ92У, 1986ВЕ93У, 1986ВЕ94Т, 1986ВК214, 1986ВК234, 1986ВЕ8Т (81), 1923ВК014, "Электросила".
Ссылки на код
На текущий момент, июнь 2019, нами совместно с Миландр был реализован пилотный проект Pack для микросхем электросчетчиков - 1986ВК214 и 1986ВК234. Пак поддерживает так-же все перечисленные выше микроконтроллеры, кроме 1986ВЕ8Т (81), 1923ВК014, "Электросила", но только в объеме тех периферийных блоков, что есть в 1986ВК214 и 1986ВК234.
Сейчас идет внедрение поддержки 1986ВЕ8Т (81), 1923ВК014, "Электросила" в этот Pack, что привело к масштабным изменениям в API, поскольку во многом эти МК отличаются от предыдущих. К сожалению это привело к тому, что большинство примеров, реализованных в составе Пака, сейчас не собираются.
Доступ к рабочей версии Pack, до внедрения изменений под новые МК, сохранен в ветке Pack_VK214 репозитория на GitHub, branch - Pack_VK214. Для работы с этим паком необходимо скачать отсюда Milandr.MDR1986VExx.2.0.pack и установить в Keil стандартным образом (DoubleClick). В версии Milandr.MDR1986VExx.2.x.pack добавился лишь драйвер и пример работы с памятью 1636РР52 по SPI. Эта память есть на платах электросчетчиков.
Внедрение поддержки под новые МК идет в ветке GitHub, Master. Пользоваться этой веткой пока нет никакого смысла, все может сильно меняться. Но чтобы не забыть о нюансах, сюда
планируется публиковать описание библиотеки, так сказать, пока свежи воспоминания.
Оглавление
Примеры