cancel
Showing results for 
Search instead for 
Did you mean: 

LPUART fail wakeup in STOP2

npatil15
Associate III

Hello,

Using Modbus master and slave communication, where Modbus master working fine, I have issue with slave device communication.

Using HAL_UARTEx_ReceiveToIdle_IT() for receiving modbus frame, and HAL_UART_Transmit_IT() to transmit response. Currently doing only read for testing purpose.

Issue: LPUART does not wakeup on receive interrupt.

Here is the information below

npatil15_0-1762921775853.pngnpatil15_1-1762921798795.png

During Init()

#define     LPUART1_EXTI_ENABLE_IT()   (EXTI->IMR1 |= EXTI_IMR1_IM28)

LPUART1_EXTI_ENABLE_IT();
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
 __HAL_RCC_HSI_ENABLE();

 

And here I will go to sleep mode if no rx/tx going on. So I will maintain the state busy until rx to tx process is complete. Once it complete, it will go to sleep mode. Here below is sleep mode logic

  //Preparation for next receive data 
   RS485_RX_ENABLE();//Its macro to receive RX data on line.
  __HAL_UART_FLUSH_DRREGISTER(&hlpuart1);
  HAL_UART_AbortReceive(&hlpuart1)
  HAL_UARTEx_ReceiveToIdle_IT(&hlpuart1, &gRxBuf[0], UART_RX_BUF_SIZE);

  //Below code is to go stop2 mode
  __HAL_UART_CLEAR_FLAG(&hlpuart1, UART_CLEAR_PEF | UART_CLEAR_NEF | UART_CLEAR_OREF);
  uint32_t dummy = hlpuart1.Instance->RDR; // flush RDR
  (void)dummy;  

   WakeUpSelection.WakeUpEvent = UART_WAKEUP_ON_STARTBIT;
  if (HAL_UARTEx_StopModeWakeUpSourceConfig(&hlpuart1, WakeUpSelection) != HAL_OK)
  {
    Error_Handler();
  }
  while (__HAL_UART_GET_FLAG(&hlpuart1, USART_ISR_BUSY) == SET);

  /* make sure that LPUART is ready to receive
   * (test carried out again later in HAL_UARTEx_StopModeWakeUpSourceConfig) */
  while (__HAL_UART_GET_FLAG(&hlpuart1, USART_ISR_REACK) == RESET);

  /* Enable the LPUART Wake UP from STOP mode Interrupt */
  __HAL_UART_DISABLE_IT(&hlpuart1, UART_IT_WUF);
  __HAL_UART_ENABLE_IT(&hlpuart1, UART_IT_WUF);

  /* enter STOP mode */
  HAL_UARTEx_EnableStopMode(&hlpuart1);
  HAL_SuspendTick();
  HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
  HAL_ResumeTick();
  Reset_SystemClock();
  HAL_UARTEx_DisableStopMode(&hlpuart1);
#define     LPUART1_EXTI_ENABLE_IT()   (EXTI->IMR1 |= EXTI_IMR1_IM28)

LPUART1_EXTI_ENABLE_IT();
static void MX_LPUART1_UART_Init(void)
{
  hlpuart1.Instance = LPUART1;
  hlpuart1.Init.BaudRate = 115200;
  hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
  hlpuart1.Init.StopBits = UART_STOPBITS_1;
  hlpuart1.Init.Parity = UART_PARITY_NONE;
  hlpuart1.Init.Mode = UART_MODE_TX_RX;
  hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  hlpuart1.FifoMode = UART_FIFOMODE_ENABLE;
  if (HAL_UART_Init(&hlpuart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_RS485Ex_Init(&hlpuart1, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_EnableFifoMode(&hlpuart1) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN LPUART1_Init 2 */
  LPUART1_EXTI_ENABLE_IT();
  /* USER CODE END LPUART1_Init 2 */
}

For testing I have tried lptimer to wakeup and it work, but it doesnt wakeup at rx interrupt.

Please help me to identify the issue.

Thanks,

Nitin

0 REPLIES 0