Skip to main content
MiinaNeko
Associate
November 12, 2019
Question

Help on UART Driver reception STM32L4

  • November 12, 2019
  • 1 reply
  • 929 views

Hello! I come to you because I have had an annoying problem for a few days. I am a student and I have a custom board with an STM32L431RC. My goal is to communicate via UART with a NB-IoT modem. The transmission is carried out correctly, however, nothing happens for reception. I looked at the oscciloscope and the recption pin is at 0...

I use STMCubeMX to configure the uart and I followed the HAL_UART generic driver documentation.

I share my code with you, I'd be happy to have your help. Thank you in advance for your time.

#define txBuf_size 100

#define rxBuf_size 100

char txBuf[txBuf_size];

char rxBuf[rxBuf_size];

int main(void)

{

HAL_Init();

MX_GPIO_Init();

 MX_USART1_UART_Init();

 //Modem On

  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);

  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET);

  //Modem communication

  send_at_cmd("AT+CPIN?\r");

}

void send_at_cmd(char* cmd)

{

   HAL_StatusTypeDef status_tx=HAL_TIMEOUT;

   HAL_StatusTypeDef status_rx=HAL_TIMEOUT;

   strcpy(txBuf,cmd);

   while(status_rx!=HAL_OK){

      status_tx=HAL_UART_Transmit(&huart1,(uint8_t*)txBuf, strlen(txBuf), 0xFFFF);

      if(status_tx==HAL_OK){

         status_rx=HAL_UART_Receive(&huart1,(uint8_t*)rxBuf,sizeof(rxBuf),5000);

         if(rxBuf[0]!=0){

            status_rx=HAL_OK;

         }

      }

   }

   status_rx=HAL_OK;

}

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

 /** Initializes the CPU, AHB and APB busses clocks

 */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;

 RCC_OscInitStruct.MSIState = RCC_MSI_ON;

 RCC_OscInitStruct.MSICalibrationValue = 0;

 RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

   Error_Handler();

 }

 /** Initializes the CPU, AHB and APB busses clocks

 */

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                             |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

 {

   Error_Handler();

 }

 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;

 PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

 {

   Error_Handler();

 }

 /** Configure the main internal regulator output voltage

 */

 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)

 {

   Error_Handler();

 }

}

void MX_GPIO_Init(void)

{

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 /* GPIO Ports Clock Enable */

 __HAL_RCC_GPIOA_CLK_ENABLE();

 /*Configure GPIO pin Output Level */

 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_RESET);

 /*Configure GPIO pins : PA11 PA12 */

 GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;

 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

 GPIO_InitStruct.Pull = GPIO_NOPULL;

 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

void MX_USART1_UART_Init(void)

{

 huart1.Instance = USART1;

 huart1.Init.BaudRate = 115200;

 huart1.Init.WordLength = UART_WORDLENGTH_8B;

 huart1.Init.StopBits = UART_STOPBITS_1;

 huart1.Init.Parity = UART_PARITY_NONE;

 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_UART_Init(&huart1) != HAL_OK)

 {

   Error_Handler();

 }

}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

{

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 if(uartHandle->Instance==USART1)

 {

 /* USER CODE BEGIN USART1_MspInit 0 */

 /* USER CODE END USART1_MspInit 0 */

   /* USART1 clock enable */

   __HAL_RCC_USART1_CLK_ENABLE(); <---- Error here missing ; (but I don't find why)

   __HAL_RCC_GPIOA_CLK_ENABLE(); <---- Error here missing ; (but I don't find why)

   /**USART1 GPIO Configuration   

   PA9    ------> USART1_TX

   PA10    ------> USART1_RX

   */

   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;

   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

   GPIO_InitStruct.Pull = GPIO_NOPULL;

   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

   GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 /* USER CODE BEGIN USART1_MspInit 1 */

 /* USER CODE END USART1_MspInit 1 */

 }

}

    This topic has been closed for replies.

    1 reply

    Tesla DeLorean
    Guru
    November 12, 2019

    Probably want to actually wait for the modem to power on, signalling may have specific timings you need to meet.

    Try avoiding the HAL's blocking transmit/receive functions, these thing can happen concurrently.

    I've posted interrupt based code for the L4 in the past.

    Avoid leaving the main() function

    For missing files/functions, make sure to have the appropriate Include Paths set up for the project, and the stm32l4xx_hal_conf.h file selecting the modules you are using.

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    MiinaNeko
    MiinaNekoAuthor
    Associate
    November 14, 2019

    Hello,

    I tried what you advised me and checked the files. Thanks to my operator I see that the modem connects to a network etc. so it receives my commands and executes them well, that's why I think the problem comes from the initialization but I can't understand why. This is the configuration file of the UART. Maybe you have some advice or opinion on it? Thank you.

    #include "usart.h"

    /* USER CODE BEGIN 0 */

    /* USER CODE END 0 */

    UART_HandleTypeDef huart1;

    /* USART1 init function */

    void MX_USART1_UART_Init(void)

    {

     huart1.Instance = USART1;

     huart1.Init.BaudRate = 115200;

     huart1.Init.WordLength = UART_WORDLENGTH_8B;

     huart1.Init.StopBits = UART_STOPBITS_1;

     huart1.Init.Parity = UART_PARITY_NONE;

     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_UART_Init(&huart1) != HAL_OK)

     {

       Error_Handler();

     }

    }

    void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

    {

     GPIO_InitTypeDef GPIO_InitStruct = {0};

     if(uartHandle->Instance==USART1)

     {

     /* USER CODE BEGIN USART1_MspInit 0 */

     /* USER CODE END USART1_MspInit 0 */

       /* USART1 clock enable */

       __HAL_RCC_USART1_CLK_ENABLE(); <---- warning here Missing ;

       __HAL_RCC_GPIOA_CLK_ENABLE(); <---- warning here Missing ;

       /**USART1 GPIO Configuration   

       PA9    ------> USART1_TX

       PA10    ------> USART1_RX

       */

       GPIO_InitStruct.Pin = GPIO_PIN_9;

       GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

       GPIO_InitStruct.Pull = GPIO_NOPULL;

       GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

       GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

       HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

       GPIO_InitStruct.Pin = GPIO_PIN_10;

       GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

       GPIO_InitStruct.Pull = GPIO_NOPULL;

       GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

       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 */

     }

    }

    The initialized modules are (in stm32l4xx_hal_conf.h):

    #define HAL_UART_MODULE_ENABLED

    #define HAL_GPIO_MODULE_ENABLED

    #define HAL_EXTI_MODULE_ENABLED

    #define HAL_I2C_MODULE_ENABLED

    #define HAL_DMA_MODULE_ENABLED

    #define HAL_RCC_MODULE_ENABLED

    #define HAL_FLASH_MODULE_ENABLED

    #define HAL_PWR_MODULE_ENABLED

    #define HAL_CORTEX_MODULE_ENABLED

    MiinaNeko
    MiinaNekoAuthor
    Associate
    November 14, 2019

    The toggle point for the transmission to be set to 1 is in this function HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) in the stm32l4xx_hal_uart.c file :

    MODIFY_REG(huart->Instance->CR1, USART_CR1_FIELDS, tmpreg);

    Do you have any ideas? :)