Implement DMX reciever and add more advanced failure mode #1
@@ -3,11 +3,15 @@
 | 
			
		||||
 | 
			
		||||
static uint32_t dmx_base_channel;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum dmx_rx_state_enum {
 | 
			
		||||
	DMX_RX_WAIT_FOR_BREAK = 0,
 | 
			
		||||
	DMX_RX_DATA,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static volatile enum dmx_rx_state_enum dmx_state;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static volatile bool break_received;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -71,17 +75,22 @@ void USART1_IRQHandler(void)
 | 
			
		||||
	if (isr & USART_ISR_FE) {
 | 
			
		||||
		/* Frame error received. Start of DMX frame */
 | 
			
		||||
		/* Flush RX data */
 | 
			
		||||
		USART1->CR3 &= ~USART_CR3_DMAR;
 | 
			
		||||
		USART1->RQR = USART_RQR_RXFRQ;
 | 
			
		||||
		USART1->CR3 |= USART_CR3_DMAR;
 | 
			
		||||
		DMA1_Channel3->CCR &= ~DMA_CCR_EN;
 | 
			
		||||
		while (DMA1_Channel3->CCR & DMA_CCR_EN);
 | 
			
		||||
		DMA1_Channel3->CMAR = (uint32_t)dmx_channel_data;
 | 
			
		||||
		DMA1_Channel3->CPAR = (uint32_t)&USART1->RDR;
 | 
			
		||||
		DMA1_Channel3->CNDTR = DMX_UNIVERSE_SIZE + 1;
 | 
			
		||||
		DMA1_Channel3->CCR |= DMA_CCR_EN;
 | 
			
		||||
		USART1->RQR = USART_RQR_RXFRQ;
 | 
			
		||||
		USART1->CR3 |= USART_CR3_DMAR;
 | 
			
		||||
		break_received = true;
 | 
			
		||||
		dmx_state = DMX_RX_DATA;
 | 
			
		||||
	} else if (isr & USART_ISR_RXNE) {
 | 
			
		||||
 | 
			
		||||
		if (dmx_state != DMX_RX_DATA) {
 | 
			
		||||
			USART1->RQR = USART_RQR_RXFRQ;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	__DSB();
 | 
			
		||||
@@ -97,6 +106,7 @@ void DMA_CH2_3_DMA2_CH1_2_IRQHandler(void)
 | 
			
		||||
 | 
			
		||||
	if (isr & DMA_ISR_TCIF3) {
 | 
			
		||||
		DMA1->ISR;
 | 
			
		||||
		dmx_state = DMX_RX_WAIT_FOR_BREAK;
 | 
			
		||||
	}
 | 
			
		||||
	__DSB();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#define DMX_UNIVERSE_SIZE (255u)
 | 
			
		||||
#define DMX_UNIVERSE_SIZE (512u)
 | 
			
		||||
#define DMX_USED_CHANNEL_COUNT (129u)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -220,9 +220,9 @@ int main(void)
 | 
			
		||||
			last_led_val = led_val;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		wait_for_ticks(5);
 | 
			
		||||
		/* Only wait in case of non-DMX mode */
 | 
			
		||||
		if (!(mode == RING_MODE_WAIT_DMX_BREAK || mode == RING_MODE_WAIT_DMX))
 | 
			
		||||
			wait_for_ticks(5);
 | 
			
		||||
 | 
			
		||||
		if((int16_t)TIM3->CNT > (int16_t)led_val) {
 | 
			
		||||
			led_val = 0u;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user