-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusart.c
159 lines (118 loc) · 2.66 KB
/
usart.c
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include "usart.h"
volatile Buffer_TypeDef outputBuffer;
volatile Buffer_TypeDef inputBuffer;
void initUsart(void)
{
//reset buffers
outputBuffer.readPtr = outputBuffer.buffer;
outputBuffer.writePtr = outputBuffer.buffer;
outputBuffer.records = 0;
inputBuffer.readPtr = inputBuffer.buffer;
inputBuffer.writePtr = inputBuffer.buffer;
inputBuffer.records = 0;
//enable Clocks
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
//setup pina.9 for tx
GPIOA->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1 | GPIO_CRH_CNF9_1;
GPIOA->CRH &= ~GPIO_CRH_CNF9_0;
//setup pina.10 for rx
GPIOA->CRH &= ~(GPIO_CRH_MODE10_0 | GPIO_CRH_MODE10_1 | GPIO_CRH_CNF10_0);
GPIOA->CRH |= GPIO_CRH_CNF10_1;
//reset usart1 registers
USART1->CR1 = 0;
USART1->CR2 = 0;
USART1->CR3 = 0;
//Baud 256000
USART1->BRR = (uint32_t)188;
//enable transmitter and receiver, also receiver interrupt
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE;
//enable interrupt for Usart1
NVIC_EnableIRQ(USART1_IRQn);
//enable Usart1
USART1->CR1 |= USART_CR1_UE;
}
void writeCharUsart(uint8_t c)
{
*outputBuffer.writePtr = c;
outputBuffer.writePtr++;
if(outputBuffer.writePtr == outputBuffer.buffer+BUFFER_SIZE)
{
outputBuffer.writePtr = outputBuffer.buffer;
}
USART1->CR1 |= USART_CR1_TXEIE;
}
void writeStringUsart(uint8_t* string)
{
uint8_t* ptr;
ptr = string;
while(*ptr != '\0')
{
writeCharUsart(*ptr);
ptr++;
}
writeCharUsart('\r');
}
uint8_t readOutputBuffer(void)
{
uint8_t out;
out = *outputBuffer.readPtr;
outputBuffer.readPtr++;
if(outputBuffer.readPtr == outputBuffer.buffer+BUFFER_SIZE)
{
outputBuffer.readPtr = outputBuffer.buffer;
}
if(outputBuffer.readPtr == outputBuffer.writePtr)
{
USART1->CR1 &= ~USART_CR1_TXEIE;
}
return out;
}
uint8_t readUsart(void)
{
uint8_t out;
out = *inputBuffer.readPtr;
inputBuffer.readPtr++;
if(inputBuffer.readPtr == inputBuffer.buffer+BUFFER_SIZE)
{
inputBuffer.readPtr = inputBuffer.buffer;
}
if(out == '\r')
{
inputBuffer.records--;
}
return out;
}
void writeInputBuffer(uint8_t c)
{
*inputBuffer.writePtr = c;
inputBuffer.writePtr++;
if(inputBuffer.writePtr == inputBuffer.buffer+BUFFER_SIZE)
{
inputBuffer.writePtr = inputBuffer.buffer;
}
if(c == '\r')
{
inputBuffer.records++;
}
}
uint8_t anyInputUsart(void)
{
return inputBuffer.records;
}
void USART1_IRQHandler(void)
{
if((USART1->SR & USART_SR_RXNE) != 0)
{
USART1->SR &= ~USART_SR_RXNE;
writeInputBuffer(USART1->DR);
}
if((USART1->SR & USART_SR_TXE) != 0)
{
USART1->SR &= ~USART_SR_TXE;
if(outputBuffer.readPtr != outputBuffer.writePtr)
{
USART1->DR = readOutputBuffer();
}
}
}