DMX512 send/recv library with STM32 slave support originally from http://mbed.org/users/okini3939/notebook/dmx512

Fork of DMX by Suga koubou

Revision:
19:6534f3ffdfec
Parent:
18:69d65ca92bcc
Child:
20:908740273e88
--- a/DMX.cpp	Mon Jan 11 06:17:04 2016 +0000
+++ b/DMX.cpp	Wed Apr 27 14:26:20 2016 +0000
@@ -74,6 +74,15 @@
       _uart = (LPC_UART_TypeDef*)UART_0;
       NVIC_SetPriority(UART_IRQn, 1);
     }
+#elif defined(TARGET_NUCLEO_F303K8)
+    if (p_rx == PA_10 || p_rx == PB_7) {
+        _uart = (USART_TypeDef*) USART1;
+        NVIC_SetPriority(USART1_IRQn, 1);
+    } else
+    if (p_rx == PA_3 || p_rx == PB_4) {
+        _uart = (USART_TypeDef*) USART2;
+        NVIC_SetPriority(USART2_IRQn, 1);
+    }
 #endif
 
     _dmx.baud(250000);
@@ -111,7 +120,13 @@
     case DMX_MODE_BEGIN:
         // Break Time
         timeout01.detach();
-        _uart->LCR |= (1 << 6);
+        #if defined(TARGET_STM)
+            // TODO: I didn't need to send anything over DMX, so this is not implemented
+            // If you wish to find out how to interface with USART on a low level, check
+            // http://www.keil.com/dd/docs/datashts/st/stm32f3xx/dm00043574.pdf
+        #else
+            _uart->LCR |= (1 << 6);
+        #endif
         mode_tx = DMX_MODE_BREAK;
         timeout01.attach_us(this, &DMX::int_timer, time_break);
         break;
@@ -119,7 +134,11 @@
     case DMX_MODE_BREAK:
         // Mark After Break
         timeout01.detach();
-        _uart->LCR &= ~(1 << 6);
+        #if defined(TARGET_STM)
+            // TODO see above
+        #else
+            _uart->LCR &= ~(1 << 6);
+        #endif
         mode_tx = DMX_MODE_MAB;
         timeout01.attach_us(this, &DMX::int_timer, time_mab);
         break;
@@ -162,14 +181,22 @@
 void DMX::int_rx () {
     int flg, dat;
 
-    flg = _uart->LSR;
-#ifdef DMX_UART_DIRECT
-    dat = _uart->RBR;
-#else
-    dat = _dmx.getc();
-#endif
+    #ifdef TARGET_STM
+        dat = _dmx.getc();
+        flg = (_uart->ISR & (USART_FLAG_FE | USART_ISR_IDLE)) == (USART_FLAG_FE | USART_ISR_IDLE);
+        if (flg) {
+            _uart->ICR = USART_ICR_FECF;
+        }
+    #else
+        flg = _uart->LSR & ((1 << 7)|(1 << 3)|(1 << 4));
+        #ifdef DMX_UART_DIRECT
+            dat = _uart->RBR;
+        #else
+            dat = _dmx.getc();
+        #endif
+    #endif
 
-    if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) {
+    if (flg) {
         // Break Time
         if (addr_rx >= 24 && mode_rx == DMX_MODE_DATA) {
             is_received = 1;