You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KED/bsl/csl/stm32f042/Src/usart.c

84 lines
2.0 KiB

/**
**************************************************************************************************
* @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 print_Usart(char *ptr)
{
uint16_t len = 0;
while(ptr[len] != '\0')
{
usartSendChar(ptr[len]);
len++;
}
}
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);
}