STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Пожалуйста?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Сказочники
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Сказочники. Си появился в 1972, Си++ в 1983. Последний так и не протоптал толком дорожку в эмбед. За сорок лет почти. Но такой хороший, что аж капец. Но не протоптал.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3903922#p3903922"]Но не протоптал.[/uquote]IAR EWARM - C++17, ARM Compiler - C++17, GCC ARM - почти C++20. Совсем не протоптал.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3903919#p3903919"]Методы показывай.[/uquote]
Один из основных методов в упрощенном виде, без реверсной оптимизации:

Код: Выделить всё

template<PinShift ShiftType, typename... Ps>
static uint32_t readWrite(uint32_t value, TypeList<Ps...> pins)
{
	if constexpr (!empty(pins))
	{
		using Pin = decltype(head(pins));
		static constexpr int shift = calcShift<ShiftType, Pin>();
		static constexpr uint32_t mask = getMaskForShift<shift, ShiftType>(pins);

		if constexpr (shift >= 0)
			return (value & mask) << shift | readWrite<ShiftType>(value, getListExceptShift<shift, ShiftType>(pins));
		else
			return (value & mask) >> -shift | readWrite<ShiftType>(value, getListExceptShift<shift, ShiftType>(pins));
	}

	return 0;
}
Его взывает тот же write:

Код: Выделить всё

static void write(uint32_t value)
{
    foreach(ports_, [=](auto port) { GpioT<port.value, getPinsMask<port.value>(pins_)>::write(readWrite<PinShift::Write>
        (value, getIndexedPins<port.value>(pins_))); });
}
Где ports_ это:

Код: Выделить всё

static constexpr auto ports_ = transform(unique(pins_, [](auto p1, auto p2) { return IsPinDummy<decltype(p1)> || p1.gpio == p2.gpio; }), 
    [](auto pin) { return ValueBox<pin.gpio>{}; });
И т.д., там много всего. С виду код высокоуровневый, но он практически весь выполняется на этапе компиляции.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Вот заняться то не чем людям. Подключил бы лучше FSMC и DMA чем говнолибы строчить тормозные на все случаи. Бредом занимаешься. Это же надо сидеть и программировать такую чушь.
Разные у нас с вами подходы к программированию. :tea: Я такие говнолибы не пишу.
Последний раз редактировалось Oxford Пт окт 09, 2020 02:50:54, всего редактировалось 15 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3903926#p3903926"]IAR EWARM - C++17, ARM Compiler - C++17, GCC ARM - почти C++20. Совсем не протоптал.[/uquote]
Да-да. Жопу с пальцем.
Системные библиотеки AVR -- это чистый си. STM8 -- си. STM32 -- си. NRF5 -- си. MSP430 -- си. РТОСы всяки и иже -- си. Все, с чем я когда-либо имел дело было на си. Из плюсов вспоминается только ардуина. Но оно и понятно, почему.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

a5021 Да хрень просто городит программно FSMC делает. Говнолибу никому не нужную типо как на AVR ногодрыгом
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ишь, "эксперты", раскудахтались. :) Кроме как какахами метаться сами то умеете чего?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18768
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Кроме как какахами метаться сами то умеете чего?
писькамитактами меряться
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3903940#p3903940"]Да хрень просто городит программно FSMC делает.[/uquote]
Забиваю весь дисплей размером 320x240 текстом(итого 800 символов). Разогнанный F303 справляется за 23ms, это 43 fps, мало? Нужно обязательно вместо 48-ми пинового мк взять 100-ногий, чтобы там был FSMC? Кстати, не так давно в теме про осцилл я тестит скорость отрисовки как раз на разогнанном F3 и тоже получал 23ms при выполнении из флеша и лишь 13ms при выполнении из CCM...
Говнолибу никому не нужную типо как на AVR ногодрыгом
Можно и мк с LTDC взять, я недавно H750 к монитору подключал. Вот список пинов для RGB565:

Код: Выделить всё

PA3, PA4, PA6, PA10, PA11, PB0, PB1, PB8, PB9, PB10, PB11, PC0, PC6, PC7, PD3, PD10, PE11, PE15
Пять портов, у большинства пинов AF14, но местами AF9/10, не покажешь как профи в таком случае режим настраивают?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вчера это было из мелкокалиберного. Вот вам пятничная тяжёлая артиллерия. Контроллер 100-ногий STM32F427VIT6. Ethernet, USB, RS-485 и объекты управления. Показываю код конфигурации ног на пяти портах (GPIOA-GPIOE). Вручную не записано ни одной константы ни в один регистр. Всё автоматически просчитает компилятор.

Переобзываем ноги согласно схеме. Для USB, ETH и т.д в этом нет необходимости, так как контроллер сам ими рулит и нигде в коде они не понадобятся.
Спойлер

Код: Выделить всё

// Концевики оптопереключателей
using S1_2 = PD_5;
using S1_3 = PD_4;
using S2_2 = PB_8;
using S2_3 = PB_7;
using S3_2 = PB_4;
using S3_3 = PD_6;
using S4_2 = PD_1;
using S4_3 = PD_0;
using S5_2 = PE_6;
using S5_3 = PE_0;
using S6_2 = PE_2;
using S6_3 = PE_1;
// Ключи управления оптопереключателями
using C1_1 = PD_2;
using C1_2 = PD_3;
using C2_1 = PB_6;
using C2_2 = PB_9;
using C3_1 = PB_3;
using C3_2 = PB_5;
using C4_1 = PC_11;
using C4_2 = PC_12;
using C5_1 = PE_5;
using C5_2 = PD_7;
using C6_1 = PE_3;
using C6_2 = PE_4;

using RF_ON = PC_7;
using PWR_ON = PD_15;
using U3_RW = PD_12;  // RS-485 RW
А теперь пользуясь возможностями автодополнения в IDE задаём конфигурацию всех ног. При этом совершенно не думая о регистрах, что, как и в какой последовательности в них писать. Не царское это дело. Только описываем режимы.
Спойлер

Код: Выделить всё

// Ноги SWD
using CSWD_PINS = ConfigList<PinMode::AF_PushPull_LowSpeed_PullDown<0x0>, PA_14,     // PA14=SWCLK
                             PinMode::AF_PushPull_VeryHighSpeed_PullUp<0x0>, PA_13>; // PA13=SWDIO
// Ноги Ethernet
using CETH_PINS = ConfigList<PinMode::AF_PushPull_HighSpeed<11>,
                               PA_2, PC_1, PB_11, PB_12, PB_13,  // PA2=RMII_MDIO, PC1=RMII_MDC, PB11= TX_EN, PB12=TXD0, PB13=TXD1
                               PA_1, PA_7, PC_4, PC_5 >;         // PA1=REF_CLK, PA7=CRS_DV, PC4=RXD0, PC5=RXD1
// Ноги USB
using CUSB_PINS = ConfigList< PinMode::AF_PushPull_HighSpeed<10>, PA_11, PA_12,      // PA11=USBDM, PA12=USBDP
                              PinMode::Input_Floating, PA_9>;                        // PA9=VBUS
// Ноги оптопереключателей
using COPTO_PINS = ConfigList<PinMode::Input_PullUp,
                                S1_2, S1_3, S2_2, S2_3, S3_2, S3_3, S4_2, S4_3, S5_2, S5_3, S6_2, S6_3,
                              PinMode::PushPull_LowSpeed<0>,
                                C1_1, C1_2, C2_1, C2_2, C3_1, C3_2, C4_1, C4_2, C5_1, C5_2, C6_1, C6_2 >;

// Запускаем собственно процесс конфигурации                                
ConfigList< CSWD_PINS, CETH_PINS, CUSB_PINS, COPTO_PINS,
           PinMode::PushPull_LowSpeed<1>, PA_15,           // PA15=LED_HDD
           PinMode::PushPull_LowSpeed<0>,
             RF_ON, U3_RW, PWR_ON,                         // PD12=U3_RW=RS-485-RW
           PinMode::AF_PushPull_LowSpeed<7>, PB_10, PD_9,  // PB10=USART3_TX, PD9=USART3_RX
           PinMode::Input_Floating, CfgCmd::AllUnusedPins
          >::pwr_config();
Нажимаем кнопочку Build и через несколько секунд получаем результат. Рядовые Си-программисты не то что не получают такой эффективности, но даже не стремятся к ней. Напоминаю, 100-ногий чип, 5 портов GPIO.
Спойлер

Код: Выделить всё

MOVS     R3,#+36
LDR.N    R1,??__low_level_init_0+0x30  ;; 0x40020000
LDR.N    R2,??__low_level_init_0+0x34  ;; 0x6a808028
LDR.W    R12,??__low_level_init_0+0x38  ;; 0xe808028
STR      R2,[R1, #+0]
STRB     R3,[R1, #+15]
STR      R12,[R1, #+8]
MOV      R3,#+696320
LDR.N    R2,??__low_level_init_0+0x3C  ;; 0xb0000bb0
STR      R2,[R1, #+32]
STR      R3,[R1, #+36]
MOV      R2,#-2147450880
STR      R2,[R1, #+24]
MOVW     R2,#+2568
LDR.N    R3,??__low_level_init_0+0x40  ;; 0x1404a08
STR      R3,[R1, #+2048]
STRH     R2,[R1, #+2056]
LDR.N    R3,??__low_level_init_0+0x44  ;; 0xbb00b0
LDR.N    R2,??__low_level_init_0+0x48  ;; 0xaa41440
STR      R3,[R1, #+2080]
STR      R2,[R1, #+1024]
MOV      R2,#+176160768
LDR.N    R3,??__low_level_init_0+0x4C  ;; 0x14100
STR      R3,[R1, #+1036]
STR      R2,[R1, #+1032]
LDR.N    R3,??__low_level_init_0+0x50  ;; 0xbbb700
LDR.N    R2,??__low_level_init_0+0x54  ;; 0x41084050
STR      R3,[R1, #+1060]
STR      R2,[R1, #+3072]
MOVW     R3,#+5381
STRH     R3,[R1, #+3084]
MOVS     R2,#+112
STRB     R2,[R1, #+3108]
MOV      R3,#+1344
LDR.N    R1,??__low_level_init_0+0x58  ;; 0x40021000
STRH     R3,[R1, #+0]
MOVW     R2,#+4117
STRH     R2,[R1, #+12]
Ох, так и вижу как на той стороне слюна брызжет. :)

Добавлено after 17 minutes 9 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=3904002#p3904002"]Можно и мк с LTDC взять, я недавно H750 к монитору подключал. Вот список пинов для RGB565:

Код: Выделить всё

PA3, PA4, PA6, PA10, PA11, PB0, PB1, PB8, PB9, PB10, PB11, PC0, PC6, PC7, PD3, PD10, PE11, PE15
Пять портов, у большинства пинов AF14, но местами AF9/10, не покажешь как профи в таком случае режим настраивают?[/uquote]Не знаю как C++ хейтеры, а я бы уже законфигурил. Осталось отсортировать перечисленные пины по номеру AF.
Спойлер

Код: Выделить всё

// Режимы для ног LTDC удобно отдельно описать
using CLTDC = ConfigList<PinMode::AF_PushPull_HighSpeed<9>, 
                           PA_3, // и другие пины AF9
                         PinMode::AF_PushPull_HighSpeed<10>,
                           PA_4, // и другие пины AF10
                         PinMode::AF_PushPull_HighSpeed<14>,
                           PA_6, // и другие пины AF14
                        >;

// И затем добавить в общую конфигурацию чипа                     
ConfigList< CLTDC,
            PinMode::Analog, CfgCmd::AllUnusedPins
          >::pwr_config();
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3904012#p3904012"]а я бы уже законфигурил.[/uquote]
Даже не знаю... Разве если для каждого регистра каждого порта хотя бы по пол экрана кода написать, как a5021 делает, не будет нагляднее? :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS, то, чем ты постоянно хвалишься, работает ТОЛЬКО у тебя!
Вот выложил бы ты на гитхаб под лицензией GPL свое творчество - можно было бы и обсуждать. А так — толку от этой писькомерки?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3903948#p3903948"]Кроме как какахами метаться сами то умеете чего?[/uquote]
Предыдущие неск. дней месье прямо из летаргии сюда строчил? Не приходя в сознание?
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Настроить порты это не сложно библиотеки не нужны.
Все это на си прогается легко при чем без каких либо оберток.
Последний раз редактировалось Oxford Пт окт 09, 2020 12:28:40, всего редактировалось 3 раза.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3904029#p3904029"]Разве если для каждого регистра каждого порта хотя бы по пол экрана кода написать, как a5021 делает, не будет нагляднее? :)[/uquote]
Нагляднее, читабельнее и проще в поддержке.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3904037#p3904037"]VladislavS, то, чем ты постоянно хвалишься, работает ТОЛЬКО у тебя![/uquote]Странно. Пользуюсь тем же языком программирования, теми же компиляторами что и все, а работает только у меня. Как так то?

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3904037#p3904037"]Вот выложил бы ты на гитхаб под лицензией GPL свое творчество - можно было бы и обсуждать.[/uquote]Пинкод от банковской карты туда же положить?

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3904037#p3904037"]А так — толку от этой писькомерки?[/uquote]Чтобы люди видели как оно может быть и не верили бездумно клише "C++ это оверхед", "C++ в эмбедде не место, им никто не пользуется" и прочей зомбочуши.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Она и есть чушь, чтобы настроить порты вам нужно писать либу. Спасибо не надо. Как и все остальное дерьмо.
Тут один уже хвалился либой для программного fsmc, то что делается на си без каких либо говнолиб.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3904050#p3904050"]Она и есть чушь, чтобы настроить порты вам нужно писать либу.[/uquote]Зачем? Она же уже написана. Ей нужно просто пользоваться.

[uquote="Oxford",url="/forum/viewtopic.php?p=3904050#p3904050"]Спасибо не надо.[/uquote]Ну вам не надо, а за других не вам решать.

[uquote="Oxford",url="/forum/viewtopic.php?p=3904050#p3904050"]Как и все остальное дерьмо. Тут один уже хвалился либой для программного fsmc, то что делается на си без каких либо говнолиб.[/uquote]Если вокруг вас всё кажется дерьмом, рекомендую оглянуться - не обосрались ли...
Ответить

Вернуться в «ARM»