Last active
June 14, 2020 20:12
-
-
Save TG9541/a9772d6f180d15c5d548a2f58bc97bad to your computer and use it in GitHub Desktop.
Buffered ?RX for STM8S Low Density
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
\ STM8 eForth buffered UART receive | |
\ the code assumes that the target CPU resource was loaded | |
\ e.g. \res MCU: STM8S103 | |
\ and the RX buffer length was defined as a constant | |
\ e.g. 8 CONSTANT RBLEN | |
\ more in the example at the end of the file | |
\res export INT_UARTRX UART_DR UART_CR2 | |
#require WIPE | |
#require :NVM | |
#require ALIAS | |
#require ]B! | |
#require '?KEY | |
5 CONSTANT #RIEN | |
NVM | |
VARIABLE rxbuf RBLEN 2- ALLOT | |
VARIABLE rxp \ UART RX ISR buffer write pointer | |
VARIABLE rrp \ ?RXB buffer read pointer | |
\ increment buffer pointer w/ wrap around | |
:NVM ( a -- ) | |
DUP @ 1+ ( a ab1 ) [ rxbuf RBLEN + 1- ] LITERAL OVER < IF | |
( a n1 ) DROP rxbuf ( a n0 ) | |
THEN | |
( a n ) SWAP ! | |
;RAM ALIAS rpi | |
\ RX ISR handler | |
:NVM | |
SAVEC | |
UART1_DR C@ rxp @ C! rxp rpi | |
IRET | |
[ OVERT INT_UARTRX ! | |
\ like ?RX only buffered | |
: ?RXB ( -- c T | F ) | |
rrp @ rxp @ = IF | |
0 | |
ELSE | |
rrp @ C@ -1 rrp rpi | |
THEN | |
; | |
\ Interrupt RX UART handler | |
: INTRX ( -- ) | |
[ ' ?RXB ] LITERAL '?KEY ! | |
rxbuf DUP rxp ! rrp ! | |
[ 1 UART1_CR2 #RIEN ]B! | |
; | |
WIPE RAM | |
\\ Example | |
\ select the (STM8S) controller first (alt. STM8S105. STM8S207) | |
\res MCU: STM8S103 | |
\ define the UART buffer length | |
8 CONSTANT RBLEN | |
\ then load the controller independent code | |
#require INTRX | |
\ put it to work | |
#require WIPE | |
#require :NVM | |
#require OSCFREQ | |
#require UART_DIV | |
#require UARTBRR | |
NVM | |
'BOOT ( xt ) | |
:NVM | |
INTRX | |
( xt ) LITERAL EXECUTE | |
;NVM 'BOOT ! | |
\ calculate UART_DIV settings for 38400 baud at the CPU clock rate | |
3840 OSCFREQ UART_DIV UARTBRR ! | |
WIPE RAM | |
\ make it survive a RESET command | |
#require PERSIST | |
PERSIST |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment