#include #include #include struct RCC { uint32_t cr; uint32_t pllcfgr; uint32_t cfgr; uint32_t cir; uint32_t ahb1rstr; uint32_t ahb2rstr; uint32_t ahb3rstr; uint32_t reserved0; uint32_t apb1rstr; uint32_t apb2rstr; uint32_t reserved1; uint32_t reserved2; uint32_t ahb1enr; uint32_t ahb2enr; uint32_t ahb3enr; uint32_t reserved3; uint32_t apb1enr; uint32_t apb2enr; uint32_t reserved4; uint32_t reserved5; uint32_t ahb1lpenr; uint32_t ahb2lpenr; uint32_t ahb3lpenr; uint32_t reserved6; uint32_t apb1lpenr; uint32_t apb2lpenr; uint32_t reserved7; uint32_t reserved8; uint32_t bdcr; uint32_t csr; uint32_t reserved9; uint32_t reserved10; uint32_t sscgr; uint32_t plli2scfgr; }; // static_assert(sizeof(struct RCC) == 0x88, "RCC register size is incorrect."); volatile struct RCC * const rcc = (struct RCC *) 0x40023800; #define RCC_AHB1ENR_GPIOAEN 0b0 #define RCC_AHB1ENR_GPIOBEN 0b10 #define RCC_APB1ENR_TIM2EN 0b0 #define RCC_APB1ENR_TIM3EN 0b1 #define RCC_APB1ENR_TIM4EN 0b10 #define RCC_APB1ENR_TIM5EN 0b100 #define RCC_APB1ENR_TIM6EN 0b1000 #define RCC_APB1ENR_TIM7EN 0b10000 #define RCC_APB1ENR_TIM12EN 0b100000 #define RCC_APB1ENR_TIM13EN 0b1000000 #define RCC_APB1ENR_TIM14EN 0b1000000 #define RCC_APB1ENR_UART4EN 0b1000000000000000000 struct GPIO { uint32_t moder; uint32_t otyper; uint32_t ospeedr; uint32_t pupdr; uint32_t idr; uint32_t odr; uint32_t bsrr; uint32_t lckr; uint32_t afrl; uint32_t afrh; }; // static_assert(sizeof(struct GPIO) == 0x28, "RCC register size is incorrect."); volatile struct GPIO * const gpiob = (struct GPIO *) 0x40020400; volatile struct GPIO * const gpioa = (struct GPIO *) 0x40020000; #define GPIOB_MODER_0_OUT 0b01 #define GPIOB_MODER_7_OUT 0b0100000000000000 #define GPIOB_MODER_14_OUT 0b010000000000000000000000000000 #define GPIOB_ODR_0 0b1 #define GPIOB_ODR_7 0b10000000 #define GPIOB_ODR_14 0b100000000000000 int main(void) { rcc->ahb1enr |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN; rcc->apb1enr |= RCC_APB1ENR_UART4EN; gpiob->moder |= GPIOB_MODER_0_OUT | GPIOB_MODER_7_OUT | GPIOB_MODER_14_OUT; gpiob->odr |= GPIOB_ODR_0 | GPIOB_ODR_7 | GPIOB_ODR_14; }