Вот какую... какое... "сочинил":
CODE
/* Биты конфигурации портов (* - после сброса) */
typedef enum {
MD_IN, MD_GPO, MD_AF, MD_AN // Input(*), Output, Alternate, Analog
} GPIO_MODE_t; // GPIO Mode Type
typedef enum {
OT_PP, OT_OD // Push-Pull*, Open-Drive
} GPIO_OTYPE_t; // GPIO Output Type
typedef enum {
SP_400K, SP_2M, SP_10M, SP_40M // 400kHz(*), 2MHz, 10MHz, 40MHz
} GPIO_OSPEED_t; // GPIO Output Speed Type
typedef enum {
PL_NP, PL_PU, PL_PD // No_Pull(*), Pull-Up, Pull-Down
} GPIO_PUPD_t; // GPIO Pull-Up_Pull-Down Type
typedef enum {
AF_SYSTEM, // AF0 - SYSTEM*
AF_TIM2, // AF1 - TIM2
AF_TIM3, AF_TIM4 = 2, // AF2 - TIM3/4,
AF_TIM9, AF_TIM10 = 3, AF_TIM11 = 3, // AF3 - TIM9/10/11
AF_I2C1, AF_I2C2 = 4, // AF4 - I2C1/2
AF_SPI1, AF_SPI2 = 5, // AF5 - SPI1/2
AF_AF6, // AF6 - _
AF_USART1, AF_USART2 = 7, AF_USART3 = 7, // AF7 - USART1/2/3
AF_AF8, // AF8 - _
AF_AF9, // AF9 - _
AF_USBFS, // AF10 - USBFS
AF_LCD, // AF11 - LCD
AF_AF12, // AF12 - _
AF_AF13, // AF13 - _
AF_RI, // AF14 - RI
AF_EVENTOUT // AF15 - SYSTEM (EVENTOUT)
} GPIO_AFLH_t; // GPIO Alternate Functions
#define GPIO_INIT(PORT, \
MDR0,OTR0,SPR0,PLR0,AFR0, \
MDR1,OTR1,SPR1,PLR1,AFR1, \
MDR2,OTR2,SPR2,PLR2,AFR2, \
MDR3,OTR3,SPR3,PLR3,AFR3, \
MDR4,OTR4,SPR4,PLR4,AFR4, \
MDR5,OTR5,SPR5,PLR5,AFR5, \
MDR6,OTR6,SPR6,PLR6,AFR6, \
MDR7,OTR7,SPR7,PLR7,AFR7, \
MDR8,OTR8,SPR8,PLR8,AFR8, \
MDR9,OTR9,SPR9,PLR9,AFR9, \
MDR10,OTR10,SPR10,PLR10,AFR10, \
MDR11,OTR11,SPR11,PLR11,AFR11, \
MDR12,OTR12,SPR12,PLR12,AFR12, \
MDR13,OTR13,SPR13,PLR13,AFR13, \
MDR14,OTR14,SPR14,PLR14,AFR14, \
MDR15,OTR15,SPR15,PLR15,AFR15); \
GPIO##PORT->MODER = ((uint32_t) \
MDR15<<30|MDR14<<28|MDR13<<26|MDR12<<24|MDR11<<22|MDR10<<20|MDR9<<18|MDR8<<16| \
MDR7<<14|MDR6<<12|MDR5<<10|MDR4<<8|MDR3<<6|MDR2<<4|MDR1<<2|MDR0); \
GPIO##PORT->OTYPER = ((uint32_t) \
OTR15<<15|OTR14<<14|OTR13<<13|OTR12<<12|OTR11<<11|OTR10<<10|OTR9<<9|OTR8<<8| \
OTR7<<7|OTR6<<6|OTR5<<5|OTR4<<4|OTR3<<3|OTR2<<2|OTR1<<1|OTR0); \
GPIO##PORT->OSPEEDR = ((uint32_t) \
SPR15<<30|SPR14<<28|SPR13<<26|SPR12<<24|SPR11<<22|SPR10<<20|SPR9<<18|SPR8<<16| \
SPR7<<14|SPR6<<12|SPR5<<10|SPR4<<8|SPR3<<6|SPR2<<4|SPR1<<2|SPR0); \
GPIO##PORT->PUPDR = ((uint32_t) \
PLR15<<30|PLR14<<28|PLR13<<26|PLR12<<24|PLR11<<22|PLR10<<20|PLR9<<18|PLR8<<16| \
PLR7<<14|PLR6<<12|PLR5<<10|PLR4<<8|PLR3<<6|PLR2<<4|PLR1<<2|PLR0); \
GPIO##PORT->AFR[0] = ((uint32_t) \
AFR7<<28|AFR6<<24|AFR5<<20|AFR4<<16|AFR3<<12|AFR2<<8|AFR1<<4|AFR0); \
GPIO##PORT->AFR[1] = ((uint32_t) \
AFR15<<28|AFR14<<24|AFR13<<20|AFR12<<16|AFR11<<12|AFR10<<8|AFR9<<4|AFR8); \
/* Пример применения */
GPIO_INIT(A,
MD_GPO, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA0
MD_AF, OT_PP, SP_400K, PL_PU, AF_USART2, // PA1
MD_AF, OT_PP, SP_400K, PL_PU, AF_TIM2, // PA2
MD_IN, OT_PP, SP_400K, PL_PD, AF_SYSTEM, // PA3
MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA4 - ADC4
MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA5 - ADC5
MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA6 - ADC6
MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA7 - ADC7
MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM, // PA8 - MSO
MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA9
MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA10
MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA11
MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA12
MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM, // PA13 - JTMS-SWDAT
MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM, // PA14 - JTCK-SWCLK
MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM); // PA15 - JTDI