1 #include <stdio.h>
2 
3 #include "stm8.h"
4 
5 #include "serial.h"
6 
7 extern volatile unsigned char *sif;
8 
9 int
putchar(int c)10 putchar(int c)
11 {
12   while(!(USART->sr & USART_SR_TXE));
13 
14   USART->dr = c;
15   return c;
16 }
17 
18 volatile uint8_t rx_buf[UART_BUF_SIZE];
19 volatile uint8_t first_free= 0;
20 volatile uint8_t last_used= 0;
21 
22 unsigned char
serial_nuof_received()23 serial_nuof_received()
24 {
25   if (first_free == last_used)
26     return 0;
27   else if (first_free > last_used)
28     return first_free - last_used;
29   else
30     return UART_BUF_SIZE - (last_used - first_free);
31 }
32 
isr_rx(void)33 void isr_rx(void) __interrupt(USART_RX_IRQ)
34 {
35   volatile uint8_t d;
36   if (USART->sr & USART_SR_RXNE)
37     {
38       uint8_t n;
39       d= USART->dr;
40       n= (first_free+1)%UART_BUF_SIZE;
41       *sif= 'p';*sif= '|';
42       *sif= 'p';*sif= d;
43       *sif= 'p';*sif= '|';
44       if (n != last_used)
45 	{
46 	  rx_buf[first_free]= d;
47 	  first_free= n;
48 	}
49       else
50 	{
51 	  *sif= 'p';*sif= '*';
52 	  *sif= 'p';*sif= d;
53 	  *sif= 'p';*sif= '*';
54 	}
55       d= serial_nuof_received();
56       *sif= 'p';*sif= '/';
57       *sif= 'p';*sif= d+'0';
58       *sif= 'p';*sif= '/';
59     }
60 }
61 
62 char
serial_received()63 serial_received()
64 {
65   //return UART2_SR & UART_SR_RXNE;
66   return first_free != last_used;
67 }
68 
getchar()69 char getchar()
70 {
71   uint8_t o, nr;
72   while (!serial_received())
73     ;
74   o= last_used;
75   last_used= (last_used+1)%UART_BUF_SIZE;
76   o= rx_buf[o];
77   nr= serial_nuof_received();
78   *sif= 'p';*sif= '@';
79   *sif= 'p';*sif= nr+'0';
80   *sif= 'p';*sif= '@';
81   return o;
82 }
83 
84 void
print_cx1(char c)85 print_cx1(char c)
86 {
87   if (c > 9)
88     printf("%c", c-10+'A');
89   else
90     printf("%c", c+'0');
91 }
92 
93 void
print_cx2(char c)94 print_cx2(char c)
95 {
96   int d;
97   d= (c>>4) & 0xf;
98   print_cx1(d);
99   d= c & 0xf;
100   print_cx1(d);
101 }
102 
103 void
print_ix4(int i)104 print_ix4(int i)
105 {
106   int d= i>>12;
107   print_cx1(d);
108   d= (i>>8) & 0xf;
109   print_cx1(d);
110   d= (i>>4) & 0xf;
111   print_cx1(d);
112   d= i & 0xf;
113   print_cx1(d);
114 }
115