Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of football_project by
Diff: io/MySerial.cpp
- Revision:
- 8:d5d055be2bb8
- Parent:
- 7:205ef63d311a
- Child:
- 9:95dc84e9fb7f
diff -r 205ef63d311a -r d5d055be2bb8 io/MySerial.cpp
--- a/io/MySerial.cpp Fri Apr 17 22:12:43 2015 +0000
+++ b/io/MySerial.cpp Sat Apr 18 22:14:18 2015 +0000
@@ -14,14 +14,15 @@
{
void pin_mode( PinName, PinMode );
- void UART0_My_IRQHandler(); // Rename to UART0_IRQHandler once serial_api.c excludes in lib rebuild.
+ void UART0_IRQHandler(); // Make sure UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+ // TODO Maybe move all serial_api.c workarounds into serial_api.c
}
extern int stdio_uart_inited;
extern serial_t stdio_uart;
// Our versions of serial_api.c's...
-// (serial_free(), etc. in serial_api.c won't work wehn we use our own copy.)
+// (serial_free(), etc. in serial_api.c won't work when use our own copy.) TODO Maybe make one in serial_api.c accessible.
#define UART_NUM 1
static uint32_t serial_irq_ids[UART_NUM] = {0};
static uart_irq_handler irq_handler;
@@ -34,15 +35,16 @@
PinName rts, PinName cts ) : _my_serial(), _my_baud( 9600 )
{
my_serial_init( &_my_serial, tx, rx, rts, cts, _my_baud );
- serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this ); // serial_api.c only calls handler for Tx & Rx.
+// serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this ); // serial_api.c only calls handler for Tx & Rx.
- // Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-// my_serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this );
+ // Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+ my_serial_irq_handler( &_my_serial, _irq_handler, (uint32_t)this );
- // For cts -- Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-// attach( this, &MySerialBase::cts_handler, (Serial::IrqType)CtsIrq );
- // For uart errors -- Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-// attach( this, &MySerialBase::error_handler, (Serial::IrqType)ErrIrq );
+ // For uart errors -- Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+ attach( this, &MySerialBase::error_handler, (Serial::IrqType)ErrIrq );
+ // For cts -- Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+ attach( this, &MySerialBase::ncts_handler, (Serial::IrqType)NctsIrq );
+ attach( this, &MySerialBase::cts_handler, (Serial::IrqType)CtsIrq );
}
void MySerialBase::baud( int baudrate )
{
@@ -134,14 +136,15 @@
}
}
-// Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
void MySerialBase::my_serial_irq_handler( serial_t *obj, uart_irq_handler handler, uint32_t id )
{
irq_handler = handler;
serial_irq_ids[obj->index] = id;
}
+//
-// Replacement for serial_irq_set() in serial_api.c so we can eventually grab uart errors.
+// Replacement for serial_irq_set() in serial_api.c so we can grab uart errors.
void MySerialBase::my_serial_irq_set( serial_t *obj, IrqType irq, uint32_t enable )
{
IRQn_Type irq_n = (IRQn_Type)0;
@@ -158,51 +161,48 @@
switch( irq )
{
case RxIrq:
- obj->uart->INTEN |= (UART_INTENSET_RXDRDY_Msk);
+ obj->uart->INTENSET = UART_INTENSET_RXDRDY_Msk;
break;
case TxIrq:
- obj->uart->INTEN |= (UART_INTENSET_TXDRDY_Msk);
+ obj->uart->INTENSET = UART_INTENSET_TXDRDY_Msk;
break;
case ErrIrq:
- obj->uart->INTEN |= (UART_INTENSET_ERROR_Msk);
+ obj->uart->INTENSET = UART_INTENSET_ERROR_Msk;
break;
case CtsIrq:
- obj->uart->INTEN |= (UART_INTENCLR_CTS_Msk);
+ obj->uart->INTENSET = UART_INTENSET_CTS_Msk;
break;
case NctsIrq:
- obj->uart->INTEN |= (UART_INTENCLR_NCTS_Msk);
+ obj->uart->INTENSET = UART_INTENSET_NCTS_Msk;
break;
case RxtoIrq:
- obj->uart->INTEN |= (UART_INTENCLR_RXTO_Msk);
+ obj->uart->INTENSET = UART_INTENSET_RXTO_Msk;
break;
}
NVIC_SetPriority( irq_n, 3 );
NVIC_EnableIRQ( irq_n );
} else
- { // disable
- // masked writes to INTENSET dont disable and masked writes to
- // INTENCLR seemed to clear the entire register, not bits.
- // Added INTEN to memory map and seems to allow set and clearing of specific bits as desired
+ { // Disable
switch( irq )
{
case RxIrq:
- obj->uart->INTEN &= ~(UART_INTENCLR_RXDRDY_Msk);
+ obj->uart->INTENCLR = UART_INTENCLR_RXDRDY_Msk;
break;
case TxIrq:
- obj->uart->INTEN &= ~(UART_INTENCLR_TXDRDY_Msk);
+ obj->uart->INTENCLR = UART_INTENCLR_TXDRDY_Msk;
break;
case ErrIrq:
- obj->uart->INTEN &= ~(UART_INTENCLR_ERROR_Msk);
+ obj->uart->INTENCLR = UART_INTENCLR_ERROR_Msk;
break;
case CtsIrq:
- obj->uart->INTEN &= ~(UART_INTENCLR_CTS_Msk);
+ obj->uart->INTENCLR = UART_INTENCLR_CTS_Msk;
break;
case NctsIrq:
- obj->uart->INTEN &= ~(UART_INTENCLR_NCTS_Msk);
+ obj->uart->INTENCLR = UART_INTENCLR_NCTS_Msk;
break;
case RxtoIrq:
- obj->uart->INTEN &= ~(UART_INTENCLR_RXTO_Msk);
+ obj->uart->INTENCLR = UART_INTENCLR_RXTO_Msk;
break;
}
@@ -218,10 +218,10 @@
handler->_my_irq[irq_type].call();
}
-// Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
void MySerialBase::error_handler()
{
- puts( "\r\nUART ERR! " );
+ // Apparently handler will be continuously called until [error] condition is gone even though cleared.
if( (UART_ERRORSRC_OVERRUN_Present << UART_ERRORSRC_OVERRUN_Pos) == (UART_ERRORSRC_OVERRUN_Msk & _my_serial.uart->ERRORSRC) )
{
@@ -229,12 +229,50 @@
// Clear the error
_my_serial.uart->ERRORSRC = (UART_ERRORSRC_OVERRUN_Clear << UART_ERRORSRC_OVERRUN_Pos);
- }
+
+ } else if( (UART_ERRORSRC_PARITY_Present << UART_ERRORSRC_PARITY_Pos) == (UART_ERRORSRC_PARITY_Msk & _my_serial.uart->ERRORSRC) )
+ {
+ puts( "\r\n[ERR: PARITY]\r\n" );
+
+ // Clear the error
+ _my_serial.uart->ERRORSRC = (UART_ERRORSRC_PARITY_Clear << UART_ERRORSRC_PARITY_Pos);
+
+ } else if( (UART_ERRORSRC_FRAMING_Present << UART_ERRORSRC_FRAMING_Pos) == (UART_ERRORSRC_FRAMING_Msk & _my_serial.uart->ERRORSRC) )
+ {
+ puts( "\r\n[ERR: FRAMING]\r\n" );
+
+ // Clear the error
+ _my_serial.uart->ERRORSRC = (UART_ERRORSRC_FRAMING_Clear << UART_ERRORSRC_FRAMING_Pos);
+
+ } else if( (UART_ERRORSRC_BREAK_Present << UART_ERRORSRC_BREAK_Pos) == (UART_ERRORSRC_BREAK_Msk & _my_serial.uart->ERRORSRC) )
+ {
+ puts( "\r\n[ERR: BREAK]\r\n" );
+
+ // Clear the error
+ _my_serial.uart->ERRORSRC = (UART_ERRORSRC_BREAK_Clear << UART_ERRORSRC_BREAK_Pos);
+
+ } else
+ {
+ // Clear the error interrupt...
+ _my_serial.uart->EVENTS_ERROR = 0;
+ }
}
-// Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
void MySerialBase::cts_handler()
{
+ // Clear interrupt.
+ _my_serial.uart->EVENTS_CTS = 0;
+
+// puts( "\r\n[CTS: Clear]\r\n" );
+}
+
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
+void MySerialBase::ncts_handler()
+{
+ // Attempt to clear interrupt.
+ _my_serial.uart->EVENTS_NCTS = 0;
+
puts( "\r\n[CTS: High]\r\n" );
}
@@ -247,6 +285,7 @@
serial_putc( &_my_serial, c );
return c;
}
+
void MySerialBase::send_break()
{
// Wait for 1.5 frames before clearing the break condition
@@ -314,13 +353,12 @@
return len;
}
-// Won't work until we use our own UART0_IRQHandler (alter serial_api.c / rebuild mbed lib.)
-
+// Won't work unless UART0_IRQHandler is commented-out in serial_api.c (rebuild mbed lib.)
#ifdef __cplusplus
extern "C"
{
#endif
-void UART0_My_IRQHandler() // Rename to UART0_IRQHandler once serial_api.c excludes in lib rebuild.
+void UART0_IRQHandler()
{
MySerial::IrqType irq_type;
@@ -361,6 +399,6 @@
#ifdef __cplusplus
}
#endif
-
+//
/* EOF */
