-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathUARTISR
164 lines (134 loc) · 3.14 KB
/
UARTISR
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
160
161
162
163
164
\ STM8 eForth buffered UART ISR handler
\ baud rate initialization for UARTISR:
\ 0: default=9600,
\ 1: 2400, 2:4800, 3:9600, 4:19200, 5:57600, 6:115200, 7:230400
#require WIPE
NVM
20 CONSTANT RXLEN
VARIABLE rxbuf RXLEN 2- ALLOT
VARIABLE rxp \ receive xfer pointer in ISR
VARIABLE tstamp \ receive timestamp
16 CONSTANT TXLEN
VARIABLE txbuf TXLEN 2- ALLOT
VARIABLE txp \ transmit xfer pointer in ISR
VARIABLE tbp \ transmit buffer pointer
RAM WIPE
\res MCU: STM8S103
\res export INT_UARTRX INT_UARTTX
\res export UART1_SR UART1_DR UART1_CR2
\ #require PINDEBUG
#require BUSCTRL
#require WIPE
#require :NVM
#require ALIAS
#require ]B!
#require ]B?
5 CONSTANT #RIEN
6 CONSTANT #TC
6 CONSTANT #TCIEN
7 CONSTANT #TIEN
NVM
\ Start UART TX ISR chain
: send ( -- )
BUStx \ enable TX driver
txbuf txp ! \ next char: buffer start
[ 1 UART1_CR2 #TIEN ]B! \ start ISR chain (TXE is active)
;
\ reset TX buffer pointer
: txres ( -- )
txbuf tbp !
;
\ TX ISR handler
:NVM
SAVEC
\ P2H
txp DUP @ ( va a1 ) DUP tbp @ < IF
( va a1 ) C@ UART1_DR C!
( va ) 1 SWAP +!
ELSE
( va a1 ) 2DROP
[ 0 UART1_CR2 #TIEN ]B! \ spin down ISR chain
[ 1 UART1_CR2 #TCIEN ]B! \ next ISR call: transfer complete
\ test and clear TC ISR
[ UART1_SR #TC ]B? IF
\ terminate ISR chain and release bus
[ 0 UART1_CR2 #TCIEN ]B!
txres BUSrx
THEN
THEN
\ P2L
IRET
[ OVERT INT_UARTTX !
\ headerless: test for enough free space in txbuf for putting n bytes
:NVM ( n -- f )
tbp @ txbuf - + 1- TXLEN <
;RAM ALIAS test-tbp NVM
\ RX ISR handler
:NVM
SAVEC
\ P1H
UART1_DR C@
( c ) rxp @ ( c a ) DUP rxbuf - ( c a len ) RXLEN < IF
( c a ) SWAP ( a c ) OVER ( a c a ) C!
( a ) 1+ rxp !
THEN
TIM tstamp !
\ P1L
IRET
[ OVERT INT_UARTRX !
\ reset RX buffer and initialize RX ISR handler
: rxres ( -- )
rxbuf rxp !
[ 1 UART1_CR2 #RIEN ]B!
;
\ add c to TX buffer
: txc+ ( c -- )
1 test-tbp IF
tbp @ C! 1 tbp +!
THEN
;
\ add n to TX buffer
: tx+ ( n -- )
2 test-tbp IF
tbp @ ! 2 tbp +!
THEN
;
WIPE RAM
\res export UART1_CR2 UART1_BRR1
#require ]C!
#require OSCFREQ
#require UART_DIV
#require WIPE
: BR ( br -- ) \ shorthand for baud rate table
OSCFREQ UART_DIV
;
NVM
HERE \ pass-on baud rate table address to UARTISR
960 BR , 240 BR , 480 BR , 960 BR , 1920 BR , 5760 BR , 11520 BR , 23040 BR ,
\ initilization of buffered UART handler (call this once)
: UARTISR ( n -- )
DUP 0 8 WITHIN NOT IF
DROP 0 \ out of range - use default baud rate
THEN
2* ( BR table ) LITERAL + @ UART1_BRR1 !
[ $0C UART1_CR2 ]C! \ enable TX and RX
\ PINDEBUG
BUSCTRL
txres rxres
;
WIPE RAM
\\ Example, run e.g. in SWIMCOM
#include UARTISR
\ show contents the RX and TX buffers
: bufdump ( -- )
CR ." rxbuf:"
rxbuf rxp @ OVER - DUP . DUMP
CR ." txbuf:"
txbuf tbp @ OVER - DUP . DUMP
;
2 UARTISR
txbuf TXLEN 66 FILL
65 txbuf C!
10 txbuf TXLEN 1- + C!
txlen tbp +!
send