#pragma once

#define GPIO_PIN_0  0x00000000UL
#define GPIO_PIN_1  0x00000001UL
#define GPIO_PIN_2  0x00000002UL
#define GPIO_PIN_3  0x00000003UL
#define GPIO_PIN_4  0x00000004UL
#define GPIO_PIN_5  0x00000005UL
#define GPIO_PIN_6  0x00000006UL
#define GPIO_PIN_7  0x00000007UL
#define GPIO_PIN_8  0x00000008UL
#define GPIO_PIN_9  0x00000009UL
#define GPIO_PIN_10 0x0000000AUL
#define GPIO_PIN_11 0x0000000BUL
#define GPIO_PIN_12 0x0000000CUL
#define GPIO_PIN_13 0x0000000DUL
#define GPIO_PIN_14 0x0000000EUL
#define GPIO_PIN_15 0x0000000FUL

#define GPIO_PORT_A 0x00000000UL
#define GPIO_PORT_B 0x00000010UL
#define GPIO_PORT_C 0x00000020UL
#define GPIO_PORT_D 0x00000030UL
#define GPIO_PORT_E 0x00000040UL
#define GPIO_PORT_F 0x00000070UL
#define GPIO_PORT_G 0x00000080UL
#define GPIO_PORT_H 0x00000090UL
#define GPIO_PORT_I 0x000000A0UL
#define GPIO_PORT_J 0x000000B0UL
#define GPIO_PORT_K 0x000000C0UL

#define GPIO_PUSHPULL  0x00000000UL
#define GPIO_OPENDRAIN 0x00000100UL

#define GPIO_RESET 0x00000000UL
#define GPIO_SET   0x00000200UL

#define GPIO_INPUT  0x00000000UL
#define GPIO_OUTPUT 0x00001000UL
#define GPIO_ALTER  0x00002000UL
#define GPIO_ANALOG 0x00003000UL

#define GPIO_OSPEED_LOW    0x00000000UL
#define GPIO_OSPEED_MEDIUM 0x00010000UL
#define GPIO_OSPEED_FAST   0x00020000UL
#define GPIO_OSPEED_HIGH   0x00030000UL

#define GPIO_NOPUPD   0x00000000UL
#define GPIO_PULLUP   0x00100000UL
#define GPIO_PULLDOWN 0x00200000UL

#define GPIO_AF0  0x00000000UL
#define GPIO_AF1  0x01000000UL
#define GPIO_AF2  0x02000000UL
#define GPIO_AF3  0x03000000UL
#define GPIO_AF4  0x04000000UL
#define GPIO_AF5  0x05000000UL
#define GPIO_AF6  0x06000000UL
#define GPIO_AF7  0x07000000UL
#define GPIO_AF8  0x08000000UL
#define GPIO_AF9  0x09000000UL
#define GPIO_AF10 0x0A000000UL
#define GPIO_AF11 0x0B000000UL
#define GPIO_AF12 0x0C000000UL
#define GPIO_AF13 0x0D000000UL
#define GPIO_AF14 0x0E000000UL
#define GPIO_AF15 0x0F000000UL

void GPIO_InitPin(unsigned long I_Pin);
