AnsweredAssumed Answered

LPUART LL driver not working, HAL driver working (STM32L476JG)

Question asked by Alex Hösl on Apr 4, 2018
Latest reply on Apr 5, 2018 by Amel N

Hi everybody,

 

I'm currently facing the following problem: I initialize code with CubeMX for a STM32L476JG. I want to use the low level drivers, but they don't seem to work. I was doing several hours of testing and trying to find the error, but don't come further anymore.

My last try was to switch to the HAL drivers for a simple test, voila, it's working! Immediately, without any problems!

But I need the LL drivers. Maybe somebody can help me!

 

This is how Cube initialises the LPUART with LL drivers:

/* LPUART1 init function */
static void MX_LPUART1_UART_Init(void)
{

  LL_LPUART_InitTypeDef LPUART_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;

  /* Peripheral clock enable */
  LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_LPUART1);
 
  /**LPUART1 GPIO Configuration  
  PB11   ------> LPUART1_TX
  PB12   ------> LPUART1_RTS
  PB13   ------> LPUART1_CTS
  PB10   ------> LPUART1_RX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_13|LL_GPIO_PIN_10;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* LPUART1 DMA Init */
 
  /* LPUART_TX Init */
  LL_DMA_SetPeriphRequest(DMA2, LL_DMA_CHANNEL_6, LL_DMA_REQUEST_4);

  LL_DMA_SetDataTransferDirection(DMA2, LL_DMA_CHANNEL_6, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);

  LL_DMA_SetChannelPriorityLevel(DMA2, LL_DMA_CHANNEL_6, LL_DMA_PRIORITY_MEDIUM);

  LL_DMA_SetMode(DMA2, LL_DMA_CHANNEL_6, LL_DMA_MODE_NORMAL);

  LL_DMA_SetPeriphIncMode(DMA2, LL_DMA_CHANNEL_6, LL_DMA_PERIPH_NOINCREMENT);

  LL_DMA_SetMemoryIncMode(DMA2, LL_DMA_CHANNEL_6, LL_DMA_MEMORY_INCREMENT);

  LL_DMA_SetPeriphSize(DMA2, LL_DMA_CHANNEL_6, LL_DMA_PDATAALIGN_BYTE);

  LL_DMA_SetMemorySize(DMA2, LL_DMA_CHANNEL_6, LL_DMA_MDATAALIGN_BYTE);

  /* LPUART1 interrupt Init */
  NVIC_SetPriority(LPUART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
  NVIC_EnableIRQ(LPUART1_IRQn);

  LPUART_InitStruct.BaudRate = 9600;
  LPUART_InitStruct.DataWidth = LL_LPUART_DATAWIDTH_8B;
  LPUART_InitStruct.StopBits = LL_LPUART_STOPBITS_1;
  LPUART_InitStruct.Parity = LL_LPUART_PARITY_NONE;
  LPUART_InitStruct.TransferDirection = LL_LPUART_DIRECTION_TX_RX;
  LPUART_InitStruct.HardwareFlowControl = LL_LPUART_HWCONTROL_NONE;
  LL_LPUART_Init(LPUART1, &LPUART_InitStruct);
}

 

After that, I was trying to send some data (doesn't work). Am I missing something?:

  while(1)
  {
      LL_LPUART_TransmitData8(LPUART1, 0x55);
      myTimer_CPU_Delay(10);
  }

 

And that's how Cube initialises with HAL drivers:

/* LPUART1 init function */
static void MX_LPUART1_UART_Init(void)
{
  hlpuart1.Instance = LPUART1;
  hlpuart1.Init.BaudRate = 9600;
  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;
  if (HAL_UART_Init(&hlpuart1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}

 

And I can successfully transmit after that with the following:

  uint8_t data = 0x55;
  while(1)
  {
      HAL_UART_Transmit(&hlpuart1, &data, sizeof(data), 100);
      myTimer_CPU_Delay(10);
  }

 

I would appreciate a tipp, hint, solution! If you need further information, I'm sure I'll find them.

Thanks in advance,

Regards

Alex

Outcomes