#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------------------------------------
int main(void) {
// enable clocks for GPIOA, GPIOB, GPIOC, GPIOD
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN;
// configure all pins on GPIOA as output (MODE = 0b11, CNF = 0b00)
GPIOA->CRL = 0x33333333; // PA0–PA7
GPIOA->CRH = 0x33333333; // PA8–PA15
// configure all pins on GPIOB as output (MODE = 0b11, CNF = 0b00)
GPIOB->CRL = 0x33333333; // PB0–PB7
GPIOB->CRH = 0x33333333; // PB8–PB15
// disable JTAG, keep SWD enabled (free PA15, PB3, PB4)
// AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
// disable both JTAG and SWD (NOT recommended)
// AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_DISABLE;
// configure all pins on GPIOC as output (MODE = 0b11, CNF = 0b00)
GPIOC->CRL = 0x33333333; // PC0–PC7
GPIOC->CRH = 0x33333333; // PC8–PC15
// RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// configure PD0–PD1 as output (MODE = 0b11, CNF = 0b00)
// GPIOD->CRL &= ~((0xF << (0 * 4)) | (0xF << (1 * 4)));
// GPIOD->CRL |= ((0x3 << (0 * 4)) | (0x3 << (1 * 4)));
while (1) {
GPIOA->ODR = 0xFFFF; // all high
GPIOB->ODR = 0xFFFF;
GPIOC->ODR = 0xFFFF;
// GPIOD->ODR = 0xFFFF;
for (volatile int i = 0; i < 100000; i++);
GPIOA->ODR = 0x0000; // all low
GPIOB->ODR = 0x0000;
GPIOC->ODR = 0x0000;
// GPIOD->ODR = 0x0000;
for (volatile int i = 0; i < 100000; i++);
}
}