diff --git a/ChangeLog b/ChangeLog index 89ee49b97..3e0fc0043 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ Fix lost character on Espruino Startup (fix #704) Fix duplicated characters when USB+USART IRQs fire at the same time (fix #635) Fixed Serial.find(...) + Detect UART framing and parity errors and emit them as events on the Serial object 1v82 : Fix debugger regression (where quit/reset/etc don't exit properly) Fix wakeup when setDeepSleep used at startup (fix #645) diff --git a/src/jsdevices.h b/src/jsdevices.h index b4a7c6426..3d69ab1af 100644 --- a/src/jsdevices.h +++ b/src/jsdevices.h @@ -55,6 +55,13 @@ typedef enum { EV_SERIAL5, EV_SERIAL6, EV_SERIAL_MAX = EV_SERIAL6, + EV_SERIAL1_STATUS, // Used to store serial status info + EV_SERIAL2_STATUS, + EV_SERIAL3_STATUS, + EV_SERIAL4_STATUS, + EV_SERIAL5_STATUS, + EV_SERIAL6_STATUS, + EV_SERIAL_STATUS_MAX = EV_SERIAL6_STATUS, EV_SPI1, EV_SPI2, EV_SPI3, @@ -71,6 +78,9 @@ typedef enum { EV_CHARS_ONE = EV_TYPE_MASK+1, EV_CHARS_SHIFT = GET_BIT_NUMBER(EV_CHARS_ONE), EV_CHARS_MASK = 3 * EV_CHARS_ONE, // see IOEVENT_MAXCHARS + // ----------------------------------------- SERIAL STATUS + EV_SERIAL_STATUS_FRAMING_ERR = EV_TYPE_MASK+1, + EV_SERIAL_STATUS_PARITY_ERR = EV_SERIAL_STATUS_FRAMING_ERR<<1, // ----------------------------------------- WATCH EVENTS // if the pin we're watching is high, the handler sets this EV_EXTI_IS_HIGH = EV_TYPE_MASK+1, @@ -79,12 +89,16 @@ typedef enum { // Return true if the device is a USART #define DEVICE_IS_USART(X) (((X)>=EV_SERIAL_START) && ((X)<=EV_SERIAL_MAX)) +#define DEVICE_IS_USART_STATUS(X) (((X)>=EV_SERIAL1_STATUS) && ((X)<=EV_SERIAL_STATUS_MAX)) // Return true if the device is an SPI. #define DEVICE_IS_SPI(X) (((X)>=EV_SPI1) && ((X)<=EV_SPI_MAX)) #define DEVICE_IS_I2C(X) (((X)>=EV_I2C1) && ((X)<=EV_I2C_MAX)) #define DEVICE_IS_EXTI(X) (((X)>=EV_EXTI0) && ((X)<=EV_EXTI_MAX)) +#define IOEVENTFLAGS_SERIAL_TO_SERIAL_STATUS(X) ((X) + EV_SERIAL1_STATUS - EV_SERIAL1) +#define IOEVENTFLAGS_SERIAL_STATUS_TO_SERIAL(X) ((X) + EV_SERIAL1 - EV_SERIAL1_STATUS) + #define IOEVENTFLAGS_GETTYPE(X) ((X)&EV_TYPE_MASK) #define IOEVENTFLAGS_GETCHARS(X) ((((X)&EV_CHARS_MASK)>>EV_CHARS_SHIFT)+1) #define IOEVENTFLAGS_SETCHARS(X,CHARS) ((X)=(((X)&(IOEventFlags)~EV_CHARS_MASK) | (((CHARS)-1)<= 0) { - USART_SendData(USART, (uint16_t)c); - } else - USART_ITConfig(USART, USART_IT_TXE, DISABLE); - } + /* Clear the USART Receive interrupt */ + USART_ClearITPendingBit(USART, USART_IT_RXNE); + /* Read one byte from the receive data register */ + jshPushIOCharEvent(device, (char)USART_ReceiveData(USART)); + } + /* If overrun condition occurs, clear the ORE flag and recover communication */ + if (USART_GetFlagStatus(USART, USART_FLAG_ORE) != RESET) + { + (void)USART_ReceiveData(USART); + } + if(USART_GetITStatus(USART, USART_IT_TXE) != RESET) { + /* If we have other data to send, send it */ + int c = jshGetCharToTransmit(device); + if (c >= 0) { + USART_SendData(USART, (uint16_t)c); + } else + USART_ITConfig(USART, USART_IT_TXE, DISABLE); + } } void USART1_IRQHandler(void) {