aboutsummaryrefslogtreecommitdiffstats
path: root/src/serial.c
blob: de28275b1a423841fdd7e0544dd91ba73b95f46a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stm32l476xx.h>
#include <gpio.h>
#include <clock.h>

void serial_init(void)
{
	gpio_mode(GPIOA, 2, ALTERNATE);
	gpio_mode(GPIOA, 3, ALTERNATE);
	GPIOA->AFR[0] &= ~(0x0000FF00);
	GPIOA->AFR[0] |= 0x00007700;
	RCC->APB1ENR1 |= RCC_APB1ENR1_USART2EN;

	// start usart device
	USART2->BRR = 80000000L / 115200L;
	USART2->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}

void serial_put(int c)
{
	while (!(USART2->ISR & USART_ISR_TXE));
	USART2->TDR = c & 0xFF;
}

char serial_get(void)
{
	while (!(USART2->ISR & USART_ISR_RXNE))
		delay(10);
	return USART2->RDR & 0xFF;
}

void serial_gets(char *buf, int max)
{
	uint16_t index = 0;

	do {
		buf[index] = serial_get();
		serial_put(buf[index]);
	} while (buf[index] != '\r' && index++ < max);
	buf[index] = '\0';
}