blob: 8d8fddd7f2a8577404c5a2c9d1b5396779692d83 (
plain) (
blame)
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
|
#include <stdio.h>
#include "stm8.h"
#include "serial.h"
extern volatile unsigned char *sif;
int
putchar(int c)
{
while(!(USART->sr & USART_SR_TXE));
USART->dr = c;
return c;
}
volatile uint8_t rx_buf[UART_BUF_SIZE];
volatile uint8_t first_free= 0;
volatile uint8_t last_used= 0;
unsigned char
serial_nuof_received()
{
if (first_free == last_used)
return 0;
else if (first_free > last_used)
return first_free - last_used;
else
return UART_BUF_SIZE - (last_used - first_free);
}
void isr_rx(void) __interrupt(USART_RX_IRQ)
{
volatile uint8_t d;
if (USART->sr & USART_SR_RXNE)
{
uint8_t n;
d= USART->dr;
n= (first_free+1)%UART_BUF_SIZE;
*sif= 'p';*sif= '|';
*sif= 'p';*sif= d;
*sif= 'p';*sif= '|';
if (n != last_used)
{
rx_buf[first_free]= d;
first_free= n;
}
else
{
*sif= 'p';*sif= '*';
*sif= 'p';*sif= d;
*sif= 'p';*sif= '*';
}
d= serial_nuof_received();
*sif= 'p';*sif= '/';
*sif= 'p';*sif= d+'0';
*sif= 'p';*sif= '/';
}
}
char
serial_received()
{
//return UART2_SR & UART_SR_RXNE;
return first_free != last_used;
}
char getchar()
{
uint8_t o, nr;
while (!serial_received())
;
o= last_used;
last_used= (last_used+1)%UART_BUF_SIZE;
o= rx_buf[o];
nr= serial_nuof_received();
*sif= 'p';*sif= '@';
*sif= 'p';*sif= nr+'0';
*sif= 'p';*sif= '@';
return o;
}
void
print_cx1(char c)
{
if (c > 9)
printf("%c", c-10+'A');
else
printf("%c", c+'0');
}
void
print_cx2(char c)
{
int d;
d= (c>>4) & 0xf;
print_cx1(d);
d= c & 0xf;
print_cx1(d);
}
void
print_ix4(int i)
{
int d= i>>12;
print_cx1(d);
d= (i>>8) & 0xf;
print_cx1(d);
d= (i>>4) & 0xf;
print_cx1(d);
d= i & 0xf;
print_cx1(d);
}
|