/** ************************************************************************************************** * @file usart.c * @author Kerem Yollu & Edwin Koch * @date 03.11.2021 * @version 0.4 Unstable ************************************************************************************************** * @brief Implementation of usart.h for the STM32F042K6 MCU * * **Detailed Description :** * * This source code uses bit manipulation in order to minimise the footprint of pin initialisation * and manipulation. It's based on the CMSIS/Device/ST/STM32F0xx/Include/stm32f042x6.h Header file * to get the obtain the right Registers. * * ************************************************************************************************** */ #include"usart.h" #include"pin.h" #define USART2_EN (1U << 17) #define CR1_TE_EN (1U << 3) #define CR1_UE_EN (1U << 0) #define ISR_TXE (1U << 7) #define UART_BAUD 115200 #define SYST_CLK 8000000 #define AF1 0x01 void usartSetBaudRate(uint32_t baud); void usartInit() { /* COnfiguring teh pins for the uart*/ pinConfig(pinA2, alternate, def_stage, def_res, def_speed); pinConfig(pinA15, alternate, def_stage, def_res, def_speed); //Sets pina2 to alternate mode as UART_TX pinSetAlternate(pinA2, AF1); //Enable the priferas bus and UART RCC->APB1ENR |= USART2_EN; usartSetBaudRate(UART_BAUD); //enables the transmit and sets all the other values to 0 = Default USART2->CR1 = CR1_TE_EN; // The = 0 is on purpose to set uart to default mode. //UART Enable USART2->CR1 |= CR1_UE_EN; } static uint16_t usartComputeBaudRate(uint32_t clk, uint32_t baud) { //return((clk + (baud/2U))/baud); return(clk/baud); } void usartSetBaudRate(uint32_t baud) { USART2->BRR = usartComputeBaudRate(SYST_CLK,baud); } void usartSendChar(int ch) { // Make sure that TX buffer is empty while(!(USART2->ISR & ISR_TXE)){} USART2->TDR = (ch & 0xFF); }