#ifndef _STM32F411_H_
#define _STM32F411_H_

/* (todo) boundary check?  */
#define _MMIO_(base, offset) ((volatile unsigned int * const) (base + offset))


/*  AHB1  -------------------------------------------------------------------  */

#define RCC 0x40023800
#define RCC_CR _MMIO_ (RCC, 0x00)
#define RCC_CFGR _MMIO_ (RCC, 0x08)
#define RCC_AHB1ENR _MMIO_ (RCC, 0x30)
#define RCC_APB2ENR _MMIO_ (RCC, 0x44)

#define GPIOC 0x40020800
#define GPIOC_MODER _MMIO_ (GPIOC, 0x00)
#define GPIOC_ODR _MMIO_ (GPIOC, 0x14)

#define GPIOA 0x40020000
#define GPIOA_MODER _MMIO_ (GPIOA, 0x00)
#define GPIOA_ODR _MMIO_ (GPIOA, 0x14)
#define GPIOA_AFRH _MMIO_ (GPIOA, 0x24)


/*  APB2  -------------------------------------------------------------------  */

#define USART1 0x40011000
#define USART1_SR _MMIO_ (USART1, 0x00)
#define USART1_DR _MMIO_ (USART1, 0x04)
#define USART1_BRR _MMIO_ (USART1, 0x08)
#define USART1_CR1 _MMIO_ (USART1, 0x0c)
#define USART1_CR2 _MMIO_ (USART1, 0x10)
#define USART1_CR3 _MMIO_ (USART1, 0x14)
#define USART1_GTPR _MMIO_ (USART1, 0x18)


#endif /* _STM32F411_H_  */
