diff --git a/arch/stm32f429/registers/gpio.c b/arch/stm32f429/registers/gpio.c index e6fff28ff..d70ad983b 100644 --- a/arch/stm32f429/registers/gpio.c +++ b/arch/stm32f429/registers/gpio.c @@ -1,36 +1,29 @@ #include #define GPIOA_BASE 0x40020000 -GPIO_MODER_t * GPIOA_MODER = (void *)(GPIOA_BASE); - #define GPIOB_BASE 0x40020400 -GPIO_MODER_t * GPIOB_MODER = (GPIO_MODER_t *)(GPIOB_BASE); - #define GPIOC_BASE 0x40020800 -GPIO_MODER_t * GPIOC_MODER = (GPIO_MODER_t *)(GPIOC_BASE); - #define GPIOD_BASE 0x40020C00 -GPIO_MODER_t * GPIOD_MODER = (GPIO_MODER_t *)(GPIOD_BASE); - #define GPIOE_BASE 0x40021000 -GPIO_MODER_t * GPIOE_MODER = (GPIO_MODER_t *)(GPIOE_BASE); - #define GPIOF_BASE 0x40021400 -GPIO_MODER_t * GPIOF_MODER = (GPIO_MODER_t *)(GPIOF_BASE); - #define GPIOG_BASE 0x40021800 -GPIO_MODER_t * GPIOG_MODER = (GPIO_MODER_t *)(GPIOG_BASE); - #define GPIOH_BASE 0x40021C00 -GPIO_MODER_t * GPIOH_MODER = (GPIO_MODER_t *)(GPIOH_BASE); - #define GPIOI_BASE 0x40022000 -GPIO_MODER_t * GPIOI_MODER = (GPIO_MODER_t *)(GPIOI_BASE); - #define GPIOJ_BASE 0x40022400 -GPIO_MODER_t * GPIOJ_MODER = (GPIO_MODER_t *)(GPIOJ_BASE); - #define GPIOK_BASE 0x40022800 + +#pragma mark - GPIO port mode registers + +GPIO_MODER_t * GPIOA_MODER = (GPIO_MODER_t *)(GPIOA_BASE); +GPIO_MODER_t * GPIOB_MODER = (GPIO_MODER_t *)(GPIOB_BASE); +GPIO_MODER_t * GPIOC_MODER = (GPIO_MODER_t *)(GPIOC_BASE); +GPIO_MODER_t * GPIOD_MODER = (GPIO_MODER_t *)(GPIOD_BASE); +GPIO_MODER_t * GPIOE_MODER = (GPIO_MODER_t *)(GPIOE_BASE); +GPIO_MODER_t * GPIOF_MODER = (GPIO_MODER_t *)(GPIOF_BASE); +GPIO_MODER_t * GPIOG_MODER = (GPIO_MODER_t *)(GPIOG_BASE); +GPIO_MODER_t * GPIOH_MODER = (GPIO_MODER_t *)(GPIOH_BASE); +GPIO_MODER_t * GPIOI_MODER = (GPIO_MODER_t *)(GPIOI_BASE); +GPIO_MODER_t * GPIOJ_MODER = (GPIO_MODER_t *)(GPIOJ_BASE); GPIO_MODER_t * GPIOK_MODER = (GPIO_MODER_t *)(GPIOK_BASE); GPIO_MODER_t * GPIO_MODER(GPIO_t gpio) { @@ -49,3 +42,66 @@ GPIO_MODER_t * GPIO_MODER(GPIO_t gpio) { }; return gpioModeRegisters[gpio]; } + +#pragma mark - GPIO port output type registers + +GPIO_OTYPER_t * GPIOA_OTYPER = (GPIO_OTYPER_t *)(GPIOA_BASE + 0x4); +GPIO_OTYPER_t * GPIOB_OTYPER = (GPIO_OTYPER_t *)(GPIOB_BASE + 0x4); +GPIO_OTYPER_t * GPIOC_OTYPER = (GPIO_OTYPER_t *)(GPIOC_BASE + 0x4); +GPIO_OTYPER_t * GPIOD_OTYPER = (GPIO_OTYPER_t *)(GPIOD_BASE + 0x4); +GPIO_OTYPER_t * GPIOE_OTYPER = (GPIO_OTYPER_t *)(GPIOE_BASE + 0x4); +GPIO_OTYPER_t * GPIOF_OTYPER = (GPIO_OTYPER_t *)(GPIOF_BASE + 0x4); +GPIO_OTYPER_t * GPIOG_OTYPER = (GPIO_OTYPER_t *)(GPIOG_BASE + 0x4); +GPIO_OTYPER_t * GPIOH_OTYPER = (GPIO_OTYPER_t *)(GPIOH_BASE + 0x4); +GPIO_OTYPER_t * GPIOI_OTYPER = (GPIO_OTYPER_t *)(GPIOI_BASE + 0x4); +GPIO_OTYPER_t * GPIOJ_OTYPER = (GPIO_OTYPER_t *)(GPIOJ_BASE + 0x4); +GPIO_OTYPER_t * GPIOK_OTYPER = (GPIO_OTYPER_t *)(GPIOK_BASE + 0x4); + +GPIO_OTYPER_t * GPIO_OTYPER(GPIO_t gpio) { + GPIO_OTYPER_t * gpioOutputTypeRegisters[11] = { + GPIOA_OTYPER, + GPIOB_OTYPER, + GPIOC_OTYPER, + GPIOD_OTYPER, + GPIOE_OTYPER, + GPIOF_OTYPER, + GPIOG_OTYPER, + GPIOH_OTYPER, + GPIOI_OTYPER, + GPIOJ_OTYPER, + GPIOK_OTYPER + }; + return gpioOutputTypeRegisters[gpio]; +} + +#pragma mark - GPIO port output speed registers + +GPIO_OSPEEDR_t * GPIOA_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOA_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOB_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOB_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOC_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOC_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOD_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOD_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOE_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOE_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOF_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOF_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOG_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOG_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOH_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOH_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOI_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOI_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOJ_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOJ_BASE + 0x8); +GPIO_OSPEEDR_t * GPIOK_OSPEEDR = (GPIO_OSPEEDR_t *)(GPIOK_BASE + 0x8); + +GPIO_OSPEEDR_t * GPIO_OSPEEDR(GPIO_t gpio) { + GPIO_OSPEEDR_t * gpioOutputSpeedRegisters[11] = { + GPIOA_OSPEEDR, + GPIOB_OSPEEDR, + GPIOC_OSPEEDR, + GPIOD_OSPEEDR, + GPIOE_OSPEEDR, + GPIOF_OSPEEDR, + GPIOG_OSPEEDR, + GPIOH_OSPEEDR, + GPIOI_OSPEEDR, + GPIOJ_OSPEEDR, + GPIOK_OSPEEDR + }; + return gpioOutputSpeedRegisters[gpio]; +} + diff --git a/arch/stm32f429/registers/gpio.h b/arch/stm32f429/registers/gpio.h index f2395325e..b1c08bc31 100644 --- a/arch/stm32f429/registers/gpio.h +++ b/arch/stm32f429/registers/gpio.h @@ -1,29 +1,3 @@ -typedef enum { - GPIO_MODE_INPUT = 0, - GPIO_MODE_OUTPUT = 1, - GPIO_MODE_ALTERNATE_FUNCTION = 2, - GPIO_MODE_ANALOG = 3 -} GPIO_MODE_t; - -typedef struct { - GPIO_MODE_t MODER0:2; - unsigned int MODER1:2; - unsigned int MODER2:2; - unsigned int MODER3:2; - unsigned int MODER4:2; - unsigned int MODER5:2; - unsigned int MODER6:2; - unsigned int MODER7:2; - unsigned int MODER8:2; - unsigned int MODER9:2; - unsigned int MODER10:2; - unsigned int MODER11:2; - unsigned int MODER12:2; - unsigned int MODER13:2; - unsigned int MODER14:2; - unsigned int MODER15:2; -} GPIO_MODER_t; - typedef enum { GPIOA = 0, GPIOB = 1, @@ -38,7 +12,33 @@ typedef enum { GPIOK = 10 } GPIO_t; -GPIO_MODER_t * GPIO_MODER(GPIO_t gpio); +#pragma mark - GPIO port mode registers + +typedef enum { + GPIO_MODE_INPUT = 0, + GPIO_MODE_OUTPUT = 1, + GPIO_MODE_ALTERNATE_FUNCTION = 2, + GPIO_MODE_ANALOG = 3 +} GPIO_MODE_t; + +typedef struct { + GPIO_MODE_t MODER0:2; + GPIO_MODE_t MODER1:2; + GPIO_MODE_t MODER2:2; + GPIO_MODE_t MODER3:2; + GPIO_MODE_t MODER4:2; + GPIO_MODE_t MODER5:2; + GPIO_MODE_t MODER6:2; + GPIO_MODE_t MODER7:2; + GPIO_MODE_t MODER8:2; + GPIO_MODE_t MODER9:2; + GPIO_MODE_t MODER10:2; + GPIO_MODE_t MODER11:2; + GPIO_MODE_t MODER12:2; + GPIO_MODE_t MODER13:2; + GPIO_MODE_t MODER14:2; + GPIO_MODE_t MODER15:2; +} GPIO_MODER_t; extern GPIO_MODER_t * GPIOA_MODER; extern GPIO_MODER_t * GPIOB_MODER; @@ -51,3 +51,88 @@ extern GPIO_MODER_t * GPIOH_MODER; extern GPIO_MODER_t * GPIOI_MODER; extern GPIO_MODER_t * GPIOJ_MODER; extern GPIO_MODER_t * GPIOK_MODER; + +GPIO_MODER_t * GPIO_MODER(GPIO_t gpio); + +#pragma mark - GPIO port output type registers + +typedef enum { + GPIO_OTYPE_PUSH_PULL = 0, + GPIO_OTYPE_OPEN_DRAIN = 1 +} GPIO_OTYPE_t; + +typedef struct { + GPIO_OTYPE_t OT0:1; + GPIO_OTYPE_t OT1:1; + GPIO_OTYPE_t OT2:1; + GPIO_OTYPE_t OT3:1; + GPIO_OTYPE_t OT4:1; + GPIO_OTYPE_t OT5:1; + GPIO_OTYPE_t OT6:1; + GPIO_OTYPE_t OT7:1; + GPIO_OTYPE_t OT8:1; + GPIO_OTYPE_t OT9:1; + GPIO_OTYPE_t OT10:1; + GPIO_OTYPE_t OT11:1; + GPIO_OTYPE_t OT12:1; + GPIO_OTYPE_t OT13:1; + GPIO_OTYPE_t OT14:1; + GPIO_OTYPE_t OT15:1; + unsigned int :16; +} GPIO_OTYPER_t; + +extern GPIO_OTYPER_t * GPIOA_OTYPER; +extern GPIO_OTYPER_t * GPIOB_OTYPER; +extern GPIO_OTYPER_t * GPIOC_OTYPER; +extern GPIO_OTYPER_t * GPIOD_OTYPER; +extern GPIO_OTYPER_t * GPIOE_OTYPER; +extern GPIO_OTYPER_t * GPIOF_OTYPER; +extern GPIO_OTYPER_t * GPIOG_OTYPER; +extern GPIO_OTYPER_t * GPIOH_OTYPER; +extern GPIO_OTYPER_t * GPIOI_OTYPER; +extern GPIO_OTYPER_t * GPIOJ_OTYPER; +extern GPIO_OTYPER_t * GPIOK_OTYPER; + +GPIO_OTYPER_t * GPIO_OTYPE(GPIO_t gpio); + +#pragma mark - GPIO port output speed registers + +typedef enum { + GPIO_OSPEED_LOW_SPEED = 0, + GPIO_OSPEED_MEDIUM_SPEED = 1, + GPIO_OSPEED_FAST_SPEED = 2, + GPIO_OSPEED_HIGH_SPEED = 3 +} GPIO_OSPEED_t; + +typedef struct { + GPIO_OSPEED_t OSPEEDR0:2; + GPIO_OSPEED_t OSPEEDR1:2; + GPIO_OSPEED_t OSPEEDR2:2; + GPIO_OSPEED_t OSPEEDR3:2; + GPIO_OSPEED_t OSPEEDR4:2; + GPIO_OSPEED_t OSPEEDR5:2; + GPIO_OSPEED_t OSPEEDR6:2; + GPIO_OSPEED_t OSPEEDR7:2; + GPIO_OSPEED_t OSPEEDR8:2; + GPIO_OSPEED_t OSPEEDR9:2; + GPIO_OSPEED_t OSPEEDR10:2; + GPIO_OSPEED_t OSPEEDR11:2; + GPIO_OSPEED_t OSPEEDR12:2; + GPIO_OSPEED_t OSPEEDR13:2; + GPIO_OSPEED_t OSPEEDR14:2; + GPIO_OSPEED_t OSPEEDR15:2; +} GPIO_OSPEEDR_t; + +extern GPIO_OSPEEDR_t * GPIOA_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOB_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOC_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOD_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOE_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOF_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOG_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOH_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOI_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOJ_OSPEEDR; +extern GPIO_OSPEEDR_t * GPIOK_OSPEEDR; + +GPIO_OSPEEDR_t * GPIO_OSPEED(GPIO_t gpio);