Хотел поднять одну тему, правда немного холиварную, но на мой взгляд актуальную (опять же, в некотором приближении).
Сначала краткая предыстория
Я программирствую контроллеры на ядре Cortex от Миландра. Если точнее, то 1986ВЕ91Т, 1986ВЕ94Т и сейчас немного мучаю 1986ВЕ1Т.
Сами камни неплохие, но с софтом есть некоторые проблемы, если точнее, проблемы со стандартной библиотекой периферии. В ней довольно много ошибок, и нет официальной её поддержки от производителя камней. Написала эту библиотеку компания "Фитон", которая тоже забила на её поддержку и в итоге сейчас десятки её вариантов, отличающихся лишь количество исправленных ошибок. Вообщем, каждый пилит её для себя. И если вдруг придётся кому-нибудь столкнутся с использованием этих контроллеров, то также придётся искать ещё наименее глючный вариант библиотеки для выбранного камня. Или настраивать периферию напрямую через регистры, что тоже, на мой взгляд не есть хорошо.
И вот, что я хочу сделать. Хочу написать библиотеку периферии для этих контроллеров со своими светодиодами и программистками . Чтобы просто стянул библиотеку с гитхаба (или тупо поставил из ppa), указал какой проц, и всё, всё настраивается, всё работает. И в процессе её написания сделать на каждый блок периферии статейку, как его заюзать, какие ошибки в камнях и исходник приимера ещё приложить. По моему, должно быть круто, когда знаешь, где точно взять рабочую библиотечку, и посмотреть, как настроить тот или иной блок. Сейчас думаю, или добавить поддержку этих камней в opencm3 или написать свою.
В пользу opencm3, то она довольно монструозная, с кучей поддерживаемых камушков, но на мой взгляд, не такая удобная как хотелось бы.
В пользу самописной, то если хорошо продумать её дизайн, то может получится действительно удобная библиотека.
И наконец-то к сути вопроса:) Какой стиль настройки периферии на ваш взгляд наиболее удобный? Точнее, как бы вы хотели инициализировать периферию?
Для начала, приведу пару примеров (настраивается пин 0 порта А, как порт чтобы конечно мигать светодиодом
Это Standard Peripheral Library
Код: Выделить всё
#include <MDR32F9Qx_rst_clk.h>
#include <MDR32F9Qx_port.h>
/** настраивается порт */
PORT_InitTypeDef gpio;
PORT_StructInit(&gpio);
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA, ENABLE);
PORT_DeInit(MDR_PORTA);
gpio.PORT_FUNC = PORT_FUNC_PORT;
gpio.PORT_MODE = PORT_MODE_DIGITAL;
gpio.PORT_SPEED = PORT_SPEED_MAXFAST;
gpio.PORT_OE = PORT_OE_OUT;
gpio.PORT_Pin = PORT_Pin_0;
PORT_Init(MDR_PORTA, &gpio);
/** и мигается светодиод */
while (1) {
PORT_SetBits(MDR_PORTA, PORT_Pin_0);
PORT_ResetBits(MDR_PORTA, PORT_Pin_0);
}а вот так это в opencm3
Код: Выделить всё
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
/** настраивается порт */
rcc_periph_clock_enable(RCC_GPIOA);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO0);
/** и мигается светодиод */
while (1) {
gpio_toggle(GPIOA, GPIO0);
}вот, у меня, после бессоной ночи, пока что появляются в голове есть ещё такие вот варианты
как нибудь типа так
Код: Выделить всё
rcc_peripheral_clock_enable(RCC_GPIOA);
gpio_set_mode(GPIOA, GPIO_MODE_DIGITAL_OUTPUT_MAXFAST, PIN0);
gpio_set_output_parametrs(GPIOA,
GPIO_OUTPUT_PUSHPULL,
GPIO_OUTPUT_MAXPOWER,
GPIO_OUTPUT_FILTER_ENABLE,
PIN0);
gpio_set_function(GPIOA, GPIO_FUNCTION_PORT, PIN0);
while (1) {
gpio_inverse_bit(GPIOA, GPIO0);
}или так
Код: Выделить всё
rcc.gpioa.clock_enable();
gpioa.function.pin0.port();
gpioa.direction.pin0.output();
gpioa.mode.pin0.digital();
gpioa.speed.pin0.maxfast();
gpioa.power.pin0.maxpower();
gpioa.init();
while(1) {
gpioa.pin0.inverse_bit();
}Вообщем, вариантов много, но т.к. я работаю лишь с кортексами, то и мозг у меня мыслит как-то однобоко:(
И ещё такой момент: также планирую помимо камней добавить библиотеки для работы с разными штуками, типа DDS, приёмопередатчики МКИО, дисплеи всякие и прочие ништяки, благо часть этого добра уже написано.
Вцелом, вопрос открытый, как лучше сделать? Буду рад услышать любые советы/мнения/критику и т.д.
P.S. Я в любом случае, буду пилить либо opencm3, либо свою либо, т.к. это для меня важно, как чуваку, специализирующийся на ARM-контроллерах.