Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

UART RX interrupt handlers

2004-02-23 by Alaric B Snell

Has anyone got a working example of a UART0 receive interrupt handler 
that I could study to see what I'm missing?

Mine works perfectly within Keil's ARM simulator, but in real life, 
sending a character in on UART0 puts the system in a new random state 
every time! The main loop is outputting characters via the UART, so my 
first thought is that maybe I need to be more careful about disabling 
interrupts ot prevent reading the receive buffer register during my 
main-loop code that loops until the transmit holding register is empty 
then outputs a character.

It's all written in assembly language, so none of the usual 
gcc-being-too-smart issues here...

An earlier run-in with code that worked fine in simulator and died in 
real life concerned the simulator assuming I had more RAM than I had, 
and not throwing a data abort when I accessed outside of it - so I now 
have a seperate handler for each ARM vector, plus a default VIC vector, 
all of which put a different pattern on my test LEDs so I can tell it's 
happened. My UART0 received interrupt handler should put the received 
char on the LEDs, yet somehow it always makes all the LEDs go on, like 
when the chip is reset.

I'm starting to wonder if there *is* something in this JTAG debugging 
lark after all ;-) This simulator seems too optimistic - it will 
correctly reflect the behaviour of a correct program, but will not 
always correctly reflect the behaviour of an incorrect program. Bah! 
When I was designing a logic simulator for asynchronous processor 
design, I took every opportunity to make it take worst-case estimates 
for bus settling times and the like, and whenever anything was read from 
in a potentially indeterminate state, it flagged it there and then, to 
root out as many potential problems as possible...

Background: I'm writing my LPC21xx FORTH, as before mentioned. It's now 
setting the system state up fine and starting executing after assembling 
a few basic words (like EMIT, for now hardcoded to use UART0, although 
at a later date to support swapping in different input/output drivers by 
updating a pointer; I plan to support console over I2C, for 
multi-processor setups) onto a dictionary list. But I want to have an 
interrupt handler for UART0 that puts characters into a buffer for KEY 
to read, except for Ctrl+C which will reset the stacks and drop into the 
interpreter with the console driver switched to UART0, and Ctrl+R which 
will do same but also reset the wordlist pointer (for when you've REALLY 
  hosed the system) - these are needed because the system will, by 
default, load a file from a FLASH filesystem on startup and begin 
executing, so we need a way to force it into a clean working state that 
cannot be overriden.

ABS

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.