Type and Speed GPIOs

This commit is contained in:
Romain Goyet
2015-05-03 12:09:59 +02:00
parent c91293ee51
commit 4e1da07e06
2 changed files with 188 additions and 47 deletions

View File

@@ -1,36 +1,29 @@
#include <registers/gpio.h>
#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];
}

View File

@@ -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);