#include <stdint.h>
#define PERIPHERAL_BASE (0x40000000U)
#define AHB4_BASE (PERIPHERAL_BASE + 0x18020000U)
#define GPIOI_BASE (AHB4_BASE + 0x2000U)
#define RCC_BASE (AHB4_BASE + 0x4400U)
#define RCC_AHB4ENR_OFFSET (0xE0U)
#define RCC_AHB4ENR ((volatile uint32_t*) (RCC_BASE + RCC_AHB4ENR_OFFSET))
#define RCC_AHB4ENR_GPIOIEN (0x08U)
#define GPIO_MODER_OFFSET (0x00U)
#define GPIOI_MODER ((volatile uint32_t*) (GPIOI_BASE + GPIO_MODER_OFFSET))
#define GPIO_MODER_MODER5 (10U)
#define GPIO_MODER_MODER13 (26U)
#define GPIO_MODER_MODER12 (24U)
#define GPIO_ODR_OFFSET (0x14U)
#define GPIOI_ODR ((volatile uint32_t*) (GPIOI_BASE + GPIO_ODR_OFFSET))
#define LED1_PIN 12
#define LED2_PIN 13
void main()
{
*RCC_AHB4ENR |= (1 << RCC_AHB4ENR_GPIOIEN);
// do two dummy reads after enabling the peripheral clock
volatile uint32_t dummy;
dummy = *(RCC_AHB4ENR);
dummy = *(RCC_AHB4ENR);
*GPIOI_MODER = (1 << GPIO_MODER_MODER12) | (1 << GPIO_MODER_MODER13);
*GPIOI_ODR ^= (1 << LED2_PIN);
while(1)
{
*GPIOI_ODR ^= (1 << LED1_PIN);
*GPIOI_ODR ^= (1 << LED2_PIN);
for (uint32_t i = 0; i < 2000000; i++);
}
}