cancel
Showing results for 
Search instead for 
Did you mean: 

STM32 UART RS485 DE probelm

clee.10
Associate III

Hi, All

I am using STM32F303CB to build a modbus environment which connected to RS485 bus.

(BTW, MCU as slave side)

I using STM32 HAL lib to setup whole UART & RS485 setting.

I suppose DE pin waveform should be matched to Slave_Tx ( X wrong)

-> The DE pin waveform should be driven to high until Tx send out data.

0690X000006Cof7QAC.png

The DE pin is likely a periodic pulses. (That was strange)

My Schematic is as follow (485_DIR = DE)

0690X000006CofHQAS.png

Following are initial code ( HAL lib )

void SerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
		huart1.Instance = USART1;
 
		(void)ucPORT;
		(void)ucDataBits;
		(void)eParity;
		
		huart1.Init.BaudRate = ulBaudRate;
		huart1.Init.StopBits = UART_STOPBITS_1;
		huart1.Init.Parity = UART_PARITY_NONE;		
		huart1.Init.WordLength = UART_WORDLENGTH_8B;	
		huart1.Init.Mode = UART_MODE_TX_RX;
		huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
		huart1.Init.OverSampling = UART_OVERSAMPLING_16;
		huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
		huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
		if (HAL_RS485Ex_Init(&huart1, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
		{
			_Error_Handler(__FILE__, __LINE__);
		}
}
 
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */
 
  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    PA12     ------> USART1_DE 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */
 
  /* USER CODE END USART1_MspInit 1 */
  }

3 REPLIES 3

What do you mean by "match" in "DE pin waveform is not matching to salve_Tx waveform"? DE should be active during the whole duration of transmitted frames (transmitted bytes), and it appears to be so. It of course cannot be identical to Tx.

JW

@JW Yes, you are right ( DE should be active during the whole duration of transmitted frames), even though, my DE still wrong.

clee.10
Associate III

I finally got the reason, cause I am using freeModbus lib, it will turn off interrupt when Rx or Tx done.

That will cause this phenomenon.