#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));
}