cancel
Showing results for 
Search instead for 
Did you mean: 

Help on UART Driver reception STM32L4

MiinaNeko
Associate II

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

 }

}

3 REPLIES 3

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 Venmo
Up vote any posts that you find helpful, it shows what's working..

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

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? 🙂