для GPIO сделал вообще по-своему, примерно так сделано в библиотеках для STM8
#define BITBAND(x) ((((uint32_t)(x))&(0x70000000UL))+((((uint32_t)(x))&(0x0FFFFFUL))<<(5))+(0x02000000UL))
///////////////////////////////////////////////////////////
#define PA(n) (BITBAND(GPIOA_BASE)+((n)*4))
#define PB(n) (BITBAND(GPIOB_BASE)+((n)*4))
#define PC(n) (BITBAND(GPIOC_BASE)+((n)*4))
#define PD(n) (BITBAND(GPIOD_BASE)+((n)*4))
#define PE(n) (BITBAND(GPIOE_BASE)+((n)*4))
#define PF(n) (BITBAND(GPIOF_BASE)+((n)*4))
#define PG(n) (BITBAND(GPIOG_BASE)+((n)*4))
///////////////////////////////////////////////////////////
#define POWER_ON PD(2)
#define CHARGE_STATUS PA(8)
...
///////////////////////////////////////////////////////////
typedef struct tagBBGPIOSTRUCT
{
__IO uint32_t CRL[32];
__IO uint32_t CRH[32];
__IO uint32_t IDR[32];
__IO uint32_t ODR[32];
__IO uint32_t BSRR[32];
__IO uint32_t BRR[32];
__IO uint32_t LCKR[32];
}
BBGPIOSTRUCT;
typedef struct tagGPIOINITSTRUCT
{
uint32_t pin;
BYTE mode;
}
GPIOINITSTRUCT;
///////////////////////////////////////////////////////////
#define GPIO_MODE_AIN 0x00
#define GPIO_MODE_IN 0x04
#define GPIO_MODE_INPU 0x18
#define GPIO_MODE_INPD 0x08
#define GPIO_MODE_OUT_PP_10MHZ_LOW 0x01
#define GPIO_MODE_OUT_PP_10MHZ_HIGH 0x11
#define GPIO_MODE_OUT_PP_2MHZ_LOW 0x02
#define GPIO_MODE_OUT_PP_2MHZ_HIGH 0x12
#define GPIO_MODE_OUT_PP_50MHZ_LOW 0x03
#define GPIO_MODE_OUT_PP_50MHZ_HIGH 0x13
#define GPIO_MODE_OUT_OD_10MHZ_LOW 0x05
#define GPIO_MODE_OUT_OD_10MHZ_HIGH 0x15
#define GPIO_MODE_OUT_OD_2MHZ_LOW 0x06
#define GPIO_MODE_OUT_OD_2MHZ_HIGH 0x16
#define GPIO_MODE_OUT_OD_50MHZ_LOW 0x07
#define GPIO_MODE_OUT_OD_50MHZ_HIGH 0x17
#define GPIO_MODE_AF_PP_10MHZ 0x09
#define GPIO_MODE_AF_PP_2MHZ 0x0A
#define GPIO_MODE_AF_PP_50MHZ 0x0B
#define GPIO_MODE_AF_OD_10MHZ 0x0D
#define GPIO_MODE_AF_OD_2MHZ 0x0E
#define GPIO_MODE_AF_OD_50MHZ 0x0F
...
void GPIO_PinInit(uint32_t pin, BYTE mode)
{
int offset = LOBYTE(pin << 2);
__IO uint32_t* pBase = ((__IO uint32_t*)((pin & (~255)) + offset + __offsetof(BBGPIOSTRUCT, CRL)));
pBase[1] = 0;
pBase[0] = 0;
SetPinState(pin, mode & 0x10);
pBase[3] = mode >> 3;
pBase[2] = mode >> 2;
pBase[1] = mode >> 1;
pBase[0] = mode;
}
...
void InitGPIO(const GPIOINITSTRUCT* p, int count)
{
for (int i = 0; i < count; i++, p++)
{
if (!p->pin)
break;
GPIO_PinInit(p->pin, p->mode);
}
}
...
static const GPIOINITSTRUCT gpIni[] =
{
{POWER_ON, GPIO_MODE_OUT_PP_2MHZ_LOW},
{CHARGE_STATUS, GPIO_MODE_INPD},
};
InitGPIO(gpIni, __countof(gpIni));