DMX512 send/recv library with STM32 slave support originally from http://mbed.org/users/okini3939/notebook/dmx512
Fork of DMX by
Diff: DMX.cpp
- 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;