#include "stm32c0xx.h"

// Function prototypes
void SystemClock_Config(void);
void UART1_Init(void);
void UART1_Send(char *data);

int main(void) {
    SystemClock_Config();  // Configure system clock to 16 MHz
    UART1_Init();  // Initialize UART
    
    while (1) {
        UART1_Send("0!\n");  // Transmit "0!"
        for (int i = 0; i < 5000000; i++); // Extended delay
        
        UART1_Send("1!\n");  // Transmit "1!"
        for (int i = 0; i < 5000000; i++); // Extended delay
    }
}

void SystemClock_Config(void) {
    // Enable the High-Speed Internal (HSI) oscillator (16 MHz)
    RCC->CR |= RCC_CR_HSION;
    while (!(RCC->CR & RCC_CR_HSIRDY)); // Wait until HSI is ready

    // Select HSI as system clock source
    RCC->CFGR |= RCC_CFGR_SWS_HSI;
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // Wait until HSI is used as system clock

    // Optionally set the HSI calibration (if required)
    RCC->ICSCR = (RCC->ICSCR & ~RCC_ICSCR_HSITRIM) | (0x10 << RCC_ICSCR_HSITRIM_Pos); // Default trim value
}

void UART1_Init(void) {
    // Enable GPIOA and USART1 clocks
    RCC->IOPENR |= RCC_IOPENR_GPIOAEN;    // Enable GPIOA clock
    RCC->APBENR2 |= RCC_APBENR2_USART1EN; // Enable USART1 clock
    
    // Configure PA2 (TX) and PA3 (RX) for USART1
    GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE3); // Clear mode bits
    GPIOA->MODER |= (GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1); // Set to alternate function mode
    GPIOA->AFR[0] |= (4 << GPIO_AFRL_AFSEL2_Pos) | (4 << GPIO_AFRL_AFSEL3_Pos); // AF4 for USART1
    
    // Configure USART1 for 115200 baud rate (BRR = 0x8A for 16 MHz clock)
    USART1->BRR = 0x8A; // Set baud rate to 115200
    USART1->CR1 = USART_CR1_TE | USART_CR1_UE; // Enable TX and UART
}

void UART1_Send(char *data) {
    while (*data) {
        // Wait until TXE (Transmit Data Register Empty) is set
        while (!(USART1->ISR & USART_ISR_TXFE));
        USART1->TDR = *data++; // Transmit data
    }
    
    // Wait until TC (Transmission Complete) is set
    while (!(USART1->ISR & USART_ISR_TC));
}
nucleo:PD0
nucleo:PD2
nucleo:VDD
nucleo:PA14
nucleo:PA13
nucleo:PC6
nucleo:GND.1
nucleo:PC13
nucleo:PC14
nucleo:PF0
nucleo:PF1
nucleo:PB11
nucleo:PA2
nucleo:PD1
nucleo:PD2.2
nucleo:E5V
nucleo:GND.2
nucleo:IOREF.1
nucleo:NRST.1
nucleo:3V3.1
nucleo:5V.1
nucleo:GND.3
nucleo:GND.4
nucleo:VIN.1
nucleo:PA0
nucleo:PA1
nucleo:PA4
nucleo:PB1
nucleo:PA11
nucleo:PA12
nucleo:IOREF.2
nucleo:NRST.2
nucleo:3V3.2
nucleo:5V.2
nucleo:GND.5
nucleo:GND.6
nucleo:VIN.2
nucleo:A0
nucleo:A1
nucleo:A2
nucleo:A3
nucleo:A4
nucleo:A5
nucleo:5V.3
nucleo:PA3
nucleo:PC15
nucleo:PB12.1
nucleo:PB12.2
nucleo:PB2
nucleo:GND.7
nucleo:PF3
nucleo:PA8
nucleo:PB15
nucleo:PB14
nucleo:PB13
nucleo:AGND
nucleo:PB0.1
nucleo:PD3
nucleo:PB8
nucleo:PB9
nucleo:AVDD.1
nucleo:GND.8
nucleo:PA5
nucleo:PA6
nucleo:PA7
nucleo:PB0.2
nucleo:PC7
nucleo:PA9
nucleo:PA15
nucleo:PB5
nucleo:PB4
nucleo:PB10
nucleo:PB3
nucleo:PA10
nucleo:PB6
nucleo:PB7
nucleo:D15
nucleo:D14
nucleo:AVDD.2
nucleo:GND.9
nucleo:D13
nucleo:D12
nucleo:D11
nucleo:D10
nucleo:D9
nucleo:D8
nucleo:D7
nucleo:D6
nucleo:D5
nucleo:D4
nucleo:D3
nucleo:D2
nucleo:D1
nucleo:D0
D0D1D2D3D4D5D6D7GNDLOGIC
logic1:D0
logic1:D1
logic1:D2
logic1:D3
logic1:D4
logic1:D5
logic1:D6
logic1:D7
logic1:GND