Stm32 с чего начать изучение...

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 670
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Сообщение linux_rulezz »

С интом - как у людей:

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

int endPosition;
if(GetPosition() == 50) endPosition = TRUE;
else endPosition = FALSE;
А с булом - как у б..й!
Windows must die!
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

То есть, вы многих из нас назвали бл@дями? Хм, не очень то вы вежливы, гражданин. За такие слова в реале то можно и в хлеборезку отхватить :)) Эх, это поколение молодых интернетчиков, которые общаются исключительно через чаты и мессенджеры, потому и за базаром не следят.

В общем, bool - вещь правильная, достойная. Для тех, кто понимает, как и зачем им пользоваться. Остальных же просим не напрягаться.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 670
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Сообщение linux_rulezz »

Не надо красивый, простой и логичный С превращать в убогий С++!
Windows must die!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Убогий

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

bool a;
printf("%d", ++a);
ошибкой считает. В отличии от логичного.
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Так никто же не заставляет насильно! Не надо просто гнать пургу и обзывать бл@дями тех, кто использует другие инструменты! Каждый волен делать свой выбор, у нас свободное общество. Но, плиз, избавьте нас от своих оскорблений. Вы наверно очень молоды и кроме чатов и мессенджеров ничего более не видели и нигде в обществе не были.
А мы тут уж сами разберемся, нужен bool или не нужен, и на каком языке писать программы.

Добавлено after 3 minutes 9 seconds:
Не нравится версия C23 - никто не заставляет насильно, оставайтесь на С11 или даже С99. Не нравится bool - пишите int и не парьтесь. Но зачем так истерить то? int или char ведь не отменили.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4790788#p4790788"]Нет. Если бы это было так, то uint8_t[10] занимала бы не 10 (12) байт, а 40![/uquote]а давеча мне доказали, что всё зависит от того, как линкер всё распихает... выходит, и 40 может?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 670
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Сообщение linux_rulezz »

ARV, не может! Массив из uint8_t не будет разбрасываться почленно по uint32_t!
А вот границу массива компилятор выравняет, если не указано иное. Как и границу структуры.
Поля внутри структуры тоже будут выравниваться, если не указать packed. Но, если указать packed, скажем, на STM32F0, легко нарваться на хардфолт.
Windows must die!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1324
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

ARV писал(а):а давеча мне доказали
Никто ничего вам не доказывал. До вас пытаются донести, что в программировании как и в сексе результат зависит от усилий двоих, в данном случае от компилятора и линковщика.
ARV писал(а):всё зависит от того, как линкер всё распихает...
Пихают бездумно молодые и глупые, а линковщик размещает в памяти объекты данных, созданные компилятором, с указаниями, написанными в его скрипте. Если для сегмента включено выравнивание на 4 байта и ваш массив на 10 байт единственный объект, размещаемый в этом сегменте, то размер сегмента будет 12 байт. Если же будут ещё данные, то они будут размещаться за этим массивом без зазоров, но итоговый размер сегмента будет выровнен до int32. Если вы включите выравнивание сегмента на 40 байт, то полезными в нём будут только первые 10 байт, а 30 байт просто не будут использоваться.
Разберитесь уже, кто и что делает, а то вы не понимаете, что такое размер данных, что такое выравнивание, и что сколько в итоге занимает места.
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Насколько мне известно, нельзя в массиве, объявленном как uint8_t array[10] сделать "дырки". Атрибутом aligned(n) можно задать выравнивание начала массива по границе n байт, но сам массив будет непрерывным из элементов uint8_t. Если нужны дырки в массиве, сделайте массив из структуры, в которой одно поле - данные, а остальные поля создают этот самый промежуток. Хотя на практике вряд ли кому этот вариант нужен. Чисто академическая задачка
Вымогатель припоя
Сообщения: 556
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4790861#p4790861"]Не надо красивый, простой и логичный С превращать в убогий С++![/uquote]
Поздно, на C теперь даже трейты можно эмулировать )

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

#define is_bool(x) _Generic((typeof(x)){0}, bool: 1, default: 0)

bool a;
static_assert(is_bool(a));
В целом тенденция такова, что в C сейчас массово перетаскивают фичи из C++, хотя бывает и наоборот, #embed, например, перекочевал в обратном направлении.
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Как бы вот давно назрела необходимость модифицировать язык Си. Хотя, как самый простой, он в целом вполне норм, не требует больших знаний и легко осваивается.
С другой стороны, лично мне в нем не хватало namespace и того самого bool, а так же перегрузки функции по различию её параметров.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 333
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="Rapra",url="/forum/viewtopic.php?p=4791022#p4791022"]мне в нем не хватало перегрузки функции по различию её параметров.[/uquote]

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

#include <stdbool.h>

void send_int(int val)   { /* реализация для int */ }
void send_float(float val) { /* реализация для float */ }
void send_bool(bool val)  { /* реализация для bool */ }

#define usb_send(x) _Generic((x), \
    int:   send_int,              \
    float: send_float,            \
    bool:  send_bool,             \
    default: send_int             \
)(x)

int the_send() {
    int   a = 10;
    float b = 3.14f;
    bool  c = true;

    usb_send(a); // Вызовет send_int
    usb_send(b); // Вызовет send_float
    usb_send(c); // Вызовет send_bool
    
    return 0;
}
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Сделали в С? Как-то кривовато конечно, через макросы чтоль? Впрочем, уже поздняк метаться, давно перешел и возвращаться обратно на С уже бессмысленно.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 333
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="Rapra",url="/forum/viewtopic.php?p=4791127#p4791127"]Как-то кривовато конечно[/uquote]
где-то видите ошибки?
через макросы чтоль
предложите вариант без макросов.
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Имею ввиду не ошибки, а общую концепцию в С. Чето она как-то не особо, судя по этому вашему примеру.

Без макросов и прочих телодвижений есть в С++:
void Foo(int a);
void Foo(uint8_t a);

И вообще даже так:
template<typename T> void Foo(T a);
где T - вообще любой тип, в том числе и пользовательский (структура, класс)

и можно задать отдельные реализации для разных типов:
template<> void Foo(uint16_t a);
template<> void Foo(MyClass a);
Вымогатель припоя
Аватара пользователя
Сообщения: 670
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Сообщение linux_rulezz »

Rapra, вот еще не хватало подобную дичь в С тащить! И дженериков достаточно!
А для микроконтроллерщиков-лентяев даже #embed добавили. Чтобы куски чужих бинарников втыкать в свои ☺
Как я уже говорил, этот "комитет" явно в сторону ЛГБТ разворачивается… Нет бы constexpr добавить в С, они всякую муть мутят!
Да и черт с этим комитетом: полным-полно "гццзмов", которыми многие пользуются, а в стандарт они не входят. Ну, хоть бы разработчики gcc включили этот констэкспр в компилятор С! Сколько можно куски кода для МК генерировать каждый раз, как в протокол что-то добавляешь?
Windows must die!
Контактная информация:
Вымогатель припоя
Сообщения: 556
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4791138#p4791138"]Нет бы constexpr добавить в С, они всякую муть мутят![/uquote]
Так добавили уже, но не для функций пока )
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

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

Добавлено after 7 minutes 23 seconds:
Про втыкание бинарников. Это не обязательно исполняемый код. Это могут быть какие-то константные данные, которые либо не могут быть представлены в текстовом виде, либо их удобнее загрузить именно в бинарном виде, чтобы не тратить время на компиляцию.
Вымогатель припоя
Сообщения: 556
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

[uquote="Rapra",url="/forum/viewtopic.php?p=4791147#p4791147"]Про втыкание бинарников. Это не обязательно исполняемый код. Это могут быть какие-то константные данные, которые либо не могут быть представлены в текстовом виде, либо их удобнее загрузить именно в бинарном виде, чтобы не тратить время на компиляцию.[/uquote]
У меня #embed такие текстовые файлы грузит:
Спойлер

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

PA0  TIM2_CH1:1 TIM5_CH1:2 TIM8_ETR:3 TIM15_BKIN:4 SPI6_NSS:5 SPI3_RDY:6 USART2_CTS/USART2_NSS:7 UART4_TX:8 SAI2_SD_B:A ETH_CRS:B TIM2_ETR:E EVENTOUT:F
PA1  TIM2_CH2:1 TIM5_CH2:2 TIM15_CH1N:4 LPTIM1_IN1:5 OCTOSPI1_DQS:6 USART2_DE/USART2_RTS:7 UART4_RX:8 OCTOSPI1_IO3:9 SAI2_MCLK_B:A ETH_REF_CLK/ETH_RX_CLK:B EVENTOUT:F
PA2  TIM2_CH3:1 TIM5_CH3:2 TIM15_CH1:4 LPTIM1_IN2:5 USART2_TX:7 SAI2_SCK_B:8 ETH_MDIO:B EVENTOUT:F
PA3  TIM2_CH4:1 TIM5_CH4:2 OCTOSPI1_CLK:3 TIM15_CH2:4 I2S2_WS/SPI2_NSS:5 SAI1_SD_B:6 USART2_RX:7 ETH_COL:B EVENTOUT:F
PA4  TIM5_ETR:2 LPTIM2_CH1:3 I2S1_WS/SPI1_NSS:5 I2S3_WS/SPI3_NSS:6 USART2_CK:7 SPI6_NSS:8 DCMI_HSYNC/PSSI_DE:D EVENTOUT:F
PA5  TIM2_CH1:1 TIM8_CH1N:3 I2S1_CK/SPI1_SCK:5 SPI6_SCK:8 ETH_TX_EN:B PSSI_D14:D TIM2_ETR:E EVENTOUT:F
PA6  TIM1_BKIN:1 TIM3_CH1:2 TIM8_BKIN:3 I2S1_SDI/SPI1_MISO:5 OCTOSPI1_IO3:6 USART11_TX:7 SPI6_MISO:8 TIM13_CH1:9 DCMI_PIXCLK/PSSI_PDCK:D EVENTOUT:F
PA7  TIM1_CH1N:1 TIM3_CH2:2 TIM8_CH1N:3 I2S1_SDO/SPI1_MOSI:5 USART11_RX:7 SPI6_MOSI:8 TIM14_CH1:9 OCTOSPI1_IO2:A ETH_CRS_DV/ETH_RX_DV:B FMC_SDNWE:C FMC_NWE:D EVENTOUT:F
PA8  RCC_MCO_1:0 TIM1_CH1:1 TIM8_BKIN2:3 I2C3_SCL:4 SPI1_RDY:5 USART1_CK:7 USB_SOF:A UART7_RX:B FMC_NOE:C DCMI_D3/PSSI_D3:D EVENTOUT:F
PA9  TIM1_CH2:1 LPUART1_TX:3 I2C3_SMBA:4 I2S2_CK/SPI2_SCK:5 USART1_TX:7 ETH_TX_ER:B FMC_NWE:C DCMI_D0/PSSI_D0:D EVENTOUT:F
PA10 TIM1_CH3:1 LPUART1_RX:3 LPTIM2_IN2:4 UCPD1_FRSTX:6 USART1_RX:7 FDCAN2_TX:9 SDMMC1_D0:C DCMI_D1/PSSI_D1:D EVENTOUT:F
PA11 TIM1_CH4:1 LPUART1_CTS:3 I2S2_WS/SPI2_NSS:5 UART4_RX:6 USART1_CTS/USART1_NSS:7 FDCAN1_RX:9 USB_DM:A EVENTOUT:F
PA12 TIM1_ETR:1 LPUART1_DE/LPUART1_RTS:3 I2S2_CK/SPI2_SCK:5 UART4_TX:6 USART1_DE/USART1_RTS:7 SAI2_FS_B:8 FDCAN1_TX:9 USB_DP:A EVENTOUT:F
PA13 JTMS/SWDIO:0 EVENTOUT:F
PA14 JTCK/SWCLK:0 EVENTOUT:F
PA15 JTDI:0 TIM2_CH1:1 LPTIM3_IN2:2 CEC:4 I2S1_WS/SPI1_NSS:5 I2S3_WS/SPI3_NSS:6 SPI6_NSS:7 UART4_DE/UART4_RTS:8 UART7_TX:B FMC_NBL1:C DCMI_D11/PSSI_D11:D TIM2_ETR:E EVENTOUT:F
PB0  TIM1_CH2N:1 TIM3_CH3:2 TIM8_CH2N:3 OCTOSPI1_IO1:6 USART11_CK:7 UART4_CTS:8 ETH_RXD2:B LPTIM3_CH1:E EVENTOUT:F
PB1  TIM1_CH3N:1 TIM3_CH4:2 TIM8_CH3N:3 OCTOSPI1_IO0:6 ETH_RXD3:B LPTIM3_CH2:E EVENTOUT:F
PB2  RTC_OUT2:0 SAI1_D1:2 TIM8_CH4N:3 SPI1_RDY:4 LPTIM1_CH1:5 SAI1_SD_A:6 I2S3_SDO/SPI3_MOSI:7 OCTOSPI1_CLK:9 OCTOSPI1_DQS:A SDMMC1_CMD:C LPTIM5_ETR:D EVENTOUT:F
PB3  JTDO/SWO:0 TIM2_CH2:1 I2C2_SDA:4 I2S1_CK/SPI1_SCK:5 I2S3_CK/SPI3_SCK:6 UART12_CTS:7 SPI6_SCK:8 CRS_SYNC:A UART7_RX:B LPTIM6_ETR:E EVENTOUT:F
PB4  NJTRST:0 TIM16_BKIN:1 TIM3_CH1:2 OCTOSPI1_CLK:3 LPTIM1_CH2:4 I2S1_SDI/SPI1_MISO:5 I2S3_SDI/SPI3_MISO:6 I2S2_WS/SPI2_NSS:7 SPI6_MISO:8 UART7_TX:B DCMI_D7/PSSI_D7:D EVENTOUT:F
PB5  TIM17_BKIN:1 TIM3_CH2:2 OCTOSPI1_NCLK:3 I2C1_SMBA:4 I2S1_SDO/SPI1_MOSI:5 I2C4_SMBA:6 I2S3_SDO/SPI3_MOSI:7 SPI6_MOSI:8 FDCAN2_RX:9 ETH_PPS_OUT:B FMC_SDCKE1:C DCMI_D10/PSSI_D10:D UART5_RX:E EVENTOUT:F
PB6  TIM16_CH1N:1 TIM4_CH1:2 I3C1_SCL:3 I2C1_SCL:4 CEC:5 I2C4_SCL:6 USART1_TX:7 LPUART1_TX:8 FDCAN2_TX:9 OCTOSPI1_NCS:A FMC_SDNE1:C DCMI_D5/PSSI_D5:D UART5_TX:E EVENTOUT:F
PB7  TIM17_CH1N:1 TIM4_CH2:2 I3C1_SDA:3 I2C1_SDA:4 I2C4_SDA:6 USART1_RX:7 LPUART1_RX:8 FDCAN1_TX:9 FMC_NL:C DCMI_VSYNC/PSSI_RDY:D EVENTOUT:F
PB8  TIM16_CH1:1 TIM4_CH3:2 I3C1_SCL:3 I2C1_SCL:4 SPI4_RDY:5 I2C4_SCL:6 SDMMC1_CKIN:7 UART4_RX:8 FDCAN1_RX:9 ETH_TXD3:B SDMMC1_D4:C DCMI_D6/PSSI_D6:D EVENTOUT:F
PB9  TIM17_CH1:1 TIM4_CH4:2 I3C1_SDA:3 I2C1_SDA:4 I2S2_WS/SPI2_NSS:5 I2C4_SDA:6 SDMMC1_CDIR:7 UART4_TX:8 FDCAN1_TX:9 SDMMC1_D5:C DCMI_D7/PSSI_D7:D EVENTOUT:F
PB10 TIM2_CH3:1 LPTIM3_CH1:2 LPTIM2_IN1:3 I2C2_SCL:4 I2S2_CK/SPI2_SCK:5 USART3_TX:7 OCTOSPI1_NCS:9 ETH_RX_ER:B EVENTOUT:F
PB12 TIM1_BKIN:1 OCTOSPI1_NCLK:3 I2C2_SDA:4 I2S2_WS/SPI2_NSS:5 UCPD1_FRSTX:6 USART3_CK:7 FDCAN2_RX:9 ETH_TXD0:B UART5_RX:E EVENTOUT:F
PB13 TIM1_CH1N:1 LPTIM3_IN1:2 LPTIM2_CH1:3 I2C2_SMBA:4 I2S2_CK/SPI2_SCK:5 USART3_CTS/USART3_NSS:7 FDCAN2_TX:9 SDMMC1_D0:C UART5_TX:E EVENTOUT:F
PB14 TIM1_CH2N:1 TIM12_CH1:2 TIM8_CH2N:3 USART1_TX:4 I2S2_SDI/SPI2_MISO:5 USART3_DE/USART3_RTS:7 UART4_DE/UART4_RTS:8 LPTIM3_ETR:E EVENTOUT:F
PB15 RTC_REFIN:0 TIM1_CH3N:1 TIM12_CH2:2 TIM8_CH3N:3 USART1_RX:4 I2S2_SDO/SPI2_MOSI:5 USART11_CTS/USART11_NSS:7 UART4_CTS:8 OCTOSPI1_CLK:A ETH_TXD1:B DCMI_D2/PSSI_D2:D UART5_RX:E EVENTOUT:F
PC0  TIM16_BKIN:1 SAI1_MCLK_A:6 SPI2_RDY:7 SAI2_FS_B:8 FMC_A25:9 OCTOSPI1_IO7:A FMC_SDNWE:C EVENTOUT:F
PC1  TRACED0:0 SAI1_D1:2 I2S2_SDO/SPI2_MOSI:5 SAI1_SD_A:6 USART11_DE/USART11_RTS:7 SAI2_SD_A:8 OCTOSPI1_IO4:A ETH_MDC:B EVENTOUT:F
PC2  PWR_CSLEEP:0 TIM17_CH1:1 TIM4_CH4:2 I2S2_SDI/SPI2_MISO:5 OCTOSPI1_IO5:6 OCTOSPI1_IO2:9 ETH_TXD2:B FMC_SDNE0:C EVENTOUT:F
PC3  PWR_CSTOP:0 SAI1_D3:2 LPTIM3_CH1:3 I2S2_SDO/SPI2_MOSI:5 OCTOSPI1_IO6:6 OCTOSPI1_IO0:9 ETH_TX_CLK:B FMC_SDCKE0:C EVENTOUT:F
PC4  TIM2_CH4:1 SAI1_CK1:2 LPTIM2_ETR:3 I2S1_MCK:5 USART3_RX:7 ETH_RXD0:B FMC_SDNE0:C EVENTOUT:F
PC5  TIM1_CH4N:1 SAI1_D3:2 PSSI_D15:4 SAI1_FS_A:6 UART12_DE/UART12_RTS:7 OCTOSPI1_DQS:A ETH_RXD1:B FMC_SDCKE0:C EVENTOUT:F
PC6  TIM3_CH1:2 TIM8_CH1:3 I2S2_MCK:5 SAI1_SCK_A:6 USART6_TX:7 SDMMC1_D0DIR:8 FMC_NWAIT:9 OCTOSPI1_IO5:B SDMMC1_D6:C DCMI_D0/PSSI_D0:D EVENTOUT:F
PC7  TRGIO:0 TIM3_CH2:2 TIM8_CH2:3 I2S3_MCK:6 USART6_RX:7 SDMMC1_D123DIR:8 FMC_NE1:9 OCTOSPI1_IO6:B SDMMC1_D7:C DCMI_D1/PSSI_D1:D EVENTOUT:F
PC8  TRACED1:0 TIM3_CH3:2 TIM8_CH3:3 USART6_CK:7 UART5_DE/UART5_RTS:8 FMC_NCE/FMC_NE2:9 FMC_INT:A FMC_ALE:B SDMMC1_D0:C DCMI_D2/PSSI_D2:D EVENTOUT:F
PC9  RCC_MCO_2:0 TIM3_CH4:2 TIM8_CH4:3 I2C3_SDA:4 AUDIOCLK:5 UART5_CTS:8 OCTOSPI1_IO0:9 FMC_CLE:B SDMMC1_D1:C DCMI_D3/PSSI_D3:D EVENTOUT:F
PC10 LPTIM3_ETR:2 I2S3_CK/SPI3_SCK:6 USART3_TX:7 UART4_TX:8 OCTOSPI1_IO1:9 ETH_TXD0:B SDMMC1_D2:C DCMI_D8/PSSI_D8:D EVENTOUT:F
PC11 LPTIM3_IN1:2 I2S3_SDI/SPI3_MISO:6 USART3_RX:7 UART4_RX:8 OCTOSPI1_NCS:9 SDMMC1_D3:C DCMI_D4/PSSI_D4:D EVENTOUT:F
PC12 TRACED3:0 TIM15_CH1:2 SPI6_SCK:5 I2S3_SDO/SPI3_MOSI:6 USART3_CK:7 UART5_TX:8 SDMMC1_CK:C DCMI_D9/PSSI_D9:D EVENTOUT:F
PC13 EVENTOUT:F
PC14 EVENTOUT:F
PC15 EVENTOUT:F
PD0  TIM8_CH4N:3 UART4_RX:8 FDCAN1_RX:9 UART9_CTS:B FMC_D2/FMC_DA2:C EVENTOUT:F
PD1  UART4_TX:8 FDCAN1_TX:9 FMC_D3/FMC_DA3:C EVENTOUT:F
PD2  TRACED2:0 TIM3_ETR:2 TIM15_BKIN:4 UART5_RX:8 SDMMC1_CMD:C DCMI_D11/PSSI_D11:D LPTIM4_ETR:E EVENTOUT:F
PD3  I2S2_CK/SPI2_SCK:5 USART2_CTS/USART2_NSS:7 FMC_CLK:C DCMI_D5/PSSI_D5:D EVENTOUT:F
PD4  USART2_DE/USART2_RTS:7 OCTOSPI1_IO4:A FMC_NOE:C EVENTOUT:F
PD5  TIM1_CH4N:1 SPI2_RDY:5 USART2_TX:7 FDCAN1_TX:9 OCTOSPI1_IO5:A FMC_NWE:C EVENTOUT:F
PD6  SAI1_D1:2 I2S3_SDO/SPI3_MOSI:5 SAI1_SD_A:6 USART2_RX:7 OCTOSPI1_IO6:A FMC_NWAIT:C DCMI_D10/PSSI_D10:D EVENTOUT:F
PD7  I2S1_SDO/SPI1_MOSI:5 USART2_CK:7 OCTOSPI1_IO7:A FMC_NCE/FMC_NE1:C LPTIM4_OUT:E EVENTOUT:F
PD8  USART3_TX:7 FMC_D13/FMC_DA13:C EVENTOUT:F
PD9  USART3_RX:7 FDCAN2_RX:9 FMC_D14/FMC_DA14:C EVENTOUT:F
PD10 LPTIM2_CH2:3 USART3_CK:7 FMC_D15/FMC_DA15:C EVENTOUT:F
PD11 SAI1_CK1:2 LPTIM2_IN2:3 I2C4_SMBA:4 USART3_CTS/USART3_NSS:7 UART4_RX:8 OCTOSPI1_IO0:9 SAI2_SD_A:A FMC_A16/FMC_CLE:C EVENTOUT:F
PD12 LPTIM1_IN1:1 TIM4_CH1:2 LPTIM2_IN1:3 I2C4_SCL:4 I3C1_SCL:5 SAI1_D1:6 USART3_DE/USART3_RTS:7 UART4_TX:8 OCTOSPI1_IO1:9 SAI2_FS_A:A FMC_A17/FMC_ALE:C DCMI_D12/PSSI_D12:D EVENTOUT:F
PD13 LPTIM1_CH1:1 TIM4_CH2:2 LPTIM2_CH1:3 I2C4_SDA:4 I3C1_SDA:5 OCTOSPI1_IO3:9 SAI2_SCK_A:A UART9_DE/UART9_RTS:B FMC_A18:C DCMI_D13/PSSI_D13:D LPTIM4_IN1:E EVENTOUT:F
PD14 TIM4_CH3:2 UART8_CTS:8 UART9_RX:B FMC_D0/FMC_DA0:C EVENTOUT:F
PD15 TIM4_CH4:2 UART8_DE/UART8_RTS:8 UART9_TX:B FMC_D1/FMC_DA1:C EVENTOUT:F
PE0  LPTIM1_ETR:1 TIM4_ETR:2 LPTIM2_CH2:3 LPTIM2_ETR:4 SPI3_RDY:6 UART8_RX:8 FDCAN1_RX:9 SAI2_MCLK_A:A FMC_NBL0:C DCMI_D2/PSSI_D2:D EVENTOUT:F
PE2  TRACECLK:0 LPTIM1_IN2:1 SAI1_CK1:2 SPI4_SCK:5 SAI1_MCLK_A:6 USART10_RX:7 UART8_TX:8 OCTOSPI1_IO2:9 ETH_TXD3:B FMC_A23:C DCMI_D3/PSSI_D3:D EVENTOUT:F
PE3  TRACED0:0 TIM15_BKIN:4 SAI1_SD_B:6 USART10_TX:7 FMC_A19:C EVENTOUT:F
PE4  TRACED1:0 SAI1_D2:2 TIM15_CH1N:4 SPI4_NSS:5 SAI1_FS_A:6 FMC_A20:C DCMI_D4/PSSI_D4:D EVENTOUT:F
PE5  TRACED2:0 SAI1_CK2:2 TIM15_CH1:4 SPI4_MISO:5 SAI1_SCK_A:6 FMC_A21:C DCMI_D6/PSSI_D6:D EVENTOUT:F
PE6  TRACED3:0 TIM1_BKIN2:1 SAI1_D1:2 TIM15_CH2:4 SPI4_MOSI:5 SAI1_SD_A:6 SAI2_MCLK_B:A FMC_A22:C DCMI_D7/PSSI_D7:D EVENTOUT:F
PE7  TIM1_ETR:1 UART12_DE/UART12_RTS:6 UART7_RX:7 OCTOSPI1_IO4:A FMC_D4/FMC_DA4:C EVENTOUT:F
PE8  TIM1_CH1N:1 UART12_CTS:6 UART7_TX:7 OCTOSPI1_IO5:A FMC_D5/FMC_DA5:C EVENTOUT:F
PE9  TIM1_CH1:1 UART12_RX:6 UART7_DE/UART7_RTS:7 OCTOSPI1_IO6:A FMC_D6/FMC_DA6:C EVENTOUT:F
PE10 TIM1_CH2N:1 UART12_TX:6 UART7_CTS:7 OCTOSPI1_IO7:A FMC_D7/FMC_DA7:C EVENTOUT:F
PE11 TIM1_CH2:1 SPI1_RDY:4 SPI4_NSS:5 OCTOSPI1_NCS:6 SAI2_SD_B:A FMC_D8/FMC_DA8:C EVENTOUT:F
PE12 TIM1_CH3N:1 SPI4_SCK:5 SAI2_SCK_B:A FMC_D9/FMC_DA9:C EVENTOUT:F
PE13 TIM1_CH3:1 SPI4_MISO:5 SAI2_FS_B:A FMC_D10/FMC_DA10:C EVENTOUT:F
PE14 TIM1_CH4:1 SPI4_MOSI:5 SAI2_MCLK_B:A FMC_D11/FMC_DA11:C EVENTOUT:F
PE15 TIM1_BKIN:1 TIM1_CH4N:3 USART10_CK:7 FMC_D12/FMC_DA12:C EVENTOUT:F
PH0  EVENTOUT:F
PH1  EVENTOUT:F
Это преобразованный в другой формат H563Vx.csv, который экспортится в кубе. Потом при инициализации любой периферии все пины проверяются на этапе компиляции. Например, передали PB13 для SPI2 в качества SCK, класс SPI берет свое имя "SPI2", добавляет "_SCK", ищет в тексте сначала строку начинающуюся на "PB13", потом ищет в ней "SPI2_SCK", если находит, то возвращает AF, если не находит, то будет ошибка компиляции:

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

constexpr auto val = find<Pin, Str>();
static_assert(val != AltFunc{ -1 }, ctformat("{} is not valid {} pin!", Pin::toStr(), Str));
Такие достаточно большие текстовые файлы для каждого мк, естественно, проще в виде отдельных файлов хранить...
Мучитель микросхем
Сообщения: 467
Зарегистрирован: Пн фев 16, 2026 17:30:02

Сообщение Rapra »

Если использовали конфигуратор CubeMX, то дополнительные проверки не требуются, поскольку в конфигураторе уже всё проверено.
Ответить

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