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)10putchar(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()23serial_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)33void 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()63serial_received() 64 { 65 //return UART2_SR & UART_SR_RXNE; 66 return first_free != last_used; 67 } 68 getchar()69char 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)85print_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)94print_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)104print_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