Skip to main content
Visitor II
October 11, 2024
Question

DMX512 control with STM32

  • October 11, 2024
  • 2 replies
  • 703 views

i have done the dmx512 receiving in the stm32 
but now i am trying to make it robust , when i connect disconnect the cable many times the data in my buffer changes for a second which effects in the flickering 
i am using the framing error methood
i will share u the code below 

void USART3_IRQHandler(void)

{

// Check for overrun error

// if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_ORE) != RESET) {

// ore = 1 ;

// memcpy(rxBuffer , bitArray , sizeof(bitArray));

//// if (skipFirstByte) {

// skipFirstByte = 0; // Set the flag to false after skipping

//// } else {

// if (rxIndex < BUFFER_SIZE) {

//

//// rxBuffer[rxIndex++] = receivedByte; // Store valid data

// // if (rxIndex ==513){

// scaledValue = (rxBuffer[1] * 257) ;

// scaledValue2 = (rxBuffer[2] * 257) ;

// scaledValue3 = (rxBuffer[3] * 257) ;

// scaledValue4 = (rxBuffer[4] * 257) ;

// scaledValue5 = (rxBuffer[5] * 257) ;

//

// __HAL_TIM_SET_COMPARE(RT1, R1, scaledValue);

// __HAL_TIM_SET_COMPARE(GT1, G1, scaledValue2);

// __HAL_TIM_SET_COMPARE(BT1, B1, scaledValue3);

// __HAL_TIM_SET_COMPARE(WWT1, WW1, scaledValue4);

// __HAL_TIM_SET_COMPARE(CWT1, CW1, scaledValue5);

//

// __HAL_TIM_SET_COMPARE(RT2, R2, scaledValue);

// __HAL_TIM_SET_COMPARE(GT2, G2, scaledValue2);

// __HAL_TIM_SET_COMPARE(BT2, B2, scaledValue3);

// __HAL_TIM_SET_COMPARE(WWT2, WW2, scaledValue4);

// __HAL_TIM_SET_COMPARE(CWT2, CW2, scaledValue5);

// }

// __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_ORE); // Clear the overrun error flag

//// skipFirstByte = 1; // Set flag to skip first byte on next reception

// }

// Check for framing error

if ((__HAL_UART_GET_FLAG(&huart3, UART_FLAG_FE) != RESET) && (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET)&& (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_ORE) == RESET)&& ((volatile uint32_t)(USART3->SR)!= 448)) {

// Handle framing error

rxIndex = 0; // Reset index

fe = 1 ;

currentFrameTime = HAL_GetTick(); // Replace with your system tick function if different



// Calculate time between frames

timeBetweenFrames = currentFrameTime - lastFrameTime;



// Update last frame time

lastFrameTime = currentFrameTime;

if ((volatile uint32_t)(USART3->SR)!= 448){

if (rxBuffer[0] == 0 ) {

memcpy(bitArray , rxBuffer , sizeof(bitArray));

memset(rxBuffer, 0, sizeof(rxBuffer));

}



}







// Clear buffer



__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_FE); // Clear the error flag

skipFirstByte = 1; // Reset the flag to skip first byte on next reception

}

// if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) != RESET) {

// // Handle idle line detection

// rxIndex = 0; // Reset buffer index

// memset(rxBuffer, 0, sizeof(rxBuffer)); // Clear buffer

// skipFirstByte = 1; // Indicate signal has started

// __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_IDLE); // Clear the idle flag

// }

// Check if data is available to read

if ((__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET) &&

(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) != RESET) &&

((volatile uint32_t)(USART3->SR) != 448)) {



// Get current timestamp (assuming you have a function to get system ticks)

idleFlagStatus = __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE);

receivedByte = (uint16_t)(USART3->DR & 0xFF); // Read data from USART DR

rxne = 1;



// Store data in buffer, skipping the first byte

if (skipFirstByte) {

skipFirstByte = 0; // Set the flag to false after skipping

} else {

if (rxIndex < BUFFER_SIZE) {

// Check if the condition is met

if (rxBuffer[0] != 0) {

// Reset rxBuffer to prevBuffer

memcpy(rxBuffer, prevBuffer, sizeof(rxBuffer)); // Assuming prevBuffer is defined and has the same size

} else {

// Store valid data

rxBuffer[rxIndex++] = receivedByte;



// Scale and update PWM values

scaledValue = (rxBuffer[1] * 257);

scaledValue2 = (rxBuffer[2] * 257);

scaledValue3 = (rxBuffer[3] * 257);

scaledValue4 = (rxBuffer[4] * 257);

scaledValue5 = (rxBuffer[5] * 257);



// Update PWM outputs

__HAL_TIM_SET_COMPARE(RT1, R1, scaledValue);

__HAL_TIM_SET_COMPARE(GT1, G1, scaledValue2);

__HAL_TIM_SET_COMPARE(BT1, B1, scaledValue3);

__HAL_TIM_SET_COMPARE(WWT1, WW1, scaledValue4);

__HAL_TIM_SET_COMPARE(CWT1, CW1, scaledValue5);



__HAL_TIM_SET_COMPARE(RT2, R2, scaledValue);

__HAL_TIM_SET_COMPARE(GT2, G2, scaledValue2);

__HAL_TIM_SET_COMPARE(BT2, B2, scaledValue3);

__HAL_TIM_SET_COMPARE(WWT2, WW2, scaledValue4);

__HAL_TIM_SET_COMPARE(CWT2, CW2, scaledValue5);

}

}

}



__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_IDLE); // Clear the idle flag

}



// if ((volatile uint32_t)(USART3->SR)== 448){

// memcpy(rxBuffer , bitArray , sizeof(bitArray));

//// if (skipFirstByte) {

// skipFirstByte = 0; // Set the flag to false after skipping

//// } else {

// if (rxIndex < BUFFER_SIZE) {

//

// // rxBuffer[rxIndex++] = receivedByte; // Store valid data

// // if (rxIndex ==513){

// scaledValue = (rxBuffer[1] * 257) ;

// scaledValue2 = (rxBuffer[2] * 257) ;

// scaledValue3 = (rxBuffer[3] * 257) ;

// scaledValue4 = (rxBuffer[4] * 257) ;

// scaledValue5 = (rxBuffer[5] * 257) ;

//

// __HAL_TIM_SET_COMPARE(RT1, R1, scaledValue);

// __HAL_TIM_SET_COMPARE(GT1, G1, scaledValue2);

// __HAL_TIM_SET_COMPARE(BT1, B1, scaledValue3);

// __HAL_TIM_SET_COMPARE(WWT1, WW1, scaledValue4);

// __HAL_TIM_SET_COMPARE(CWT1, CW1, scaledValue5);

//

// __HAL_TIM_SET_COMPARE(RT2, R2, scaledValue);

// __HAL_TIM_SET_COMPARE(GT2, G2, scaledValue2);

// __HAL_TIM_SET_COMPARE(BT2, B2, scaledValue3);

// __HAL_TIM_SET_COMPARE(WWT2, WW2, scaledValue4);

// __HAL_TIM_SET_COMPARE(CWT2, CW2, scaledValue5);

// }

//

// // }

//// }

// }



}


thiis is working but how can i solve the buffer value change when i regoresly connect or discoonect pelase help

    This topic has been closed for replies.

    2 replies

    Technical Moderator
    October 11, 2024

    Hello @Aniket ,

    Please review tips on how to post a thread in this community on this link, mainly for the title, the STM32 part number and the code source sharing. I'm editing your post.

    Technical Moderator
    October 11, 2024

    +

    Related thread: https://community.st.com/t5/stm32-mcus-embedded-software/dmx512-with-stm32f103/td-p/728244

    Please if you have solved your issue in it, please provide how did you solve it and mark it as solution.

    Thank you.