cancel
Showing results for 
Search instead for 
Did you mean: 

GPS: STM32L010K4 Hardfault_Handler at STM32L0xx_it.c:0x80006

Rgoss.1
Associate II

Dear fellow geek,

I am working on a project wich uses the STM32L010K4 microcontroller. We implemented the chip on a PCB and we can write pins high and low and we’re able to use SPI.

This project revolves around a GPS application. We’re trying to use the UART protocol with the stm32CubeMx IDE. We’re also trying to make some large/complex computations, I read online that this could potentially lead to stack overflow. I also read the datasheet and the uart is and spi are part of two different alternate functions. This is the message we get when trying to implement uart. 0693W000003PMTqQAO.jpg

With kind regards,

Reinier Gosseling

10 REPLIES 10
TDK
Guru

Look at MX_LP_UART1_UART_Init() and ensure the LPUART1 handle is passed to everything. It should not be passing UART1 handles.

If you feel a post has answered your question, please click "Accept as Solution".
prain
Senior III

post your code for better help!

Rgoss.1
Associate II

/* USER CODE BEGIN Header */

/**

 **************************

 * @file      : main.c

 * @brief     : Main program body

 **************************

 * @attention

 *

 * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.

 * All rights reserved.</center></h2>

 *

 * This software component is licensed by ST under BSD 3-Clause license,

 * the "License"; You may not use this file except in compliance with the

 * License. You may obtain a copy of the License at:

 *            opensource.org/licenses/BSD-3-Clause

 *

 **************************

 */

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

UART_HandleTypeDef hlpuart1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_LPUART1_UART_Init(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**

 * @brief The application entry point.

 * @retval int

 */

int main(void)

{

 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* MCU Configuration--------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */

 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */

 MX_GPIO_Init();

 MX_LPUART1_UART_Init();

 /* USER CODE BEGIN 2 */

 /* USER CODE END 2 */

 /* Infinite loop */

 /* USER CODE BEGIN WHILE */

 while (1)

 {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

 }

 /* USER CODE END 3 */

}

/**

 * @brief System Clock Configuration

 * @retval None

 */

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

 /** Configure the main internal regulator output voltage 

 */

 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

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

 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_LPUART1;

 PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

 {

  Error_Handler();

 }

}

/**

 * @brief LPUART1 Initialization Function

 * @param None

 * @retval None

 */

static void MX_LPUART1_UART_Init(void)

{

 /* USER CODE BEGIN LPUART1_Init 0 */

 /* USER CODE END LPUART1_Init 0 */

 /* USER CODE BEGIN LPUART1_Init 1 */

 /* USER CODE END LPUART1_Init 1 */

 hlpuart1.Instance = LPUART1;

 hlpuart1.Init.BaudRate = 209700;

 hlpuart1.Init.WordLength = UART_WORDLENGTH_7B;

 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();

 }

 /* USER CODE BEGIN LPUART1_Init 2 */

 /* USER CODE END LPUART1_Init 2 */

}

/**

 * @brief GPIO Initialization Function

 * @param None

 * @retval None

 */

static void MX_GPIO_Init(void)

{

 /* GPIO Ports Clock Enable */

 __HAL_RCC_GPIOA_CLK_ENABLE();

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

 * @brief This function is executed in case of error occurrence.

 * @retval None

 */

void Error_Handler(void)

{

 /* USER CODE BEGIN Error_Handler_Debug */

 /* User can add his own implementation to report the HAL error return state */

 /* USER CODE END Error_Handler_Debug */

}

#ifdef USE_FULL_ASSERT

/**

 * @brief Reports the name of the source file and the source line number

 *     where the assert_param error has occurred.

 * @param file: pointer to the source file name

 * @param line: assert_param error line source number

 * @retval None

 */

void assert_failed(uint8_t *file, uint32_t line)

 /* USER CODE BEGIN 6 */

 /* User can add his own implementation to report the file name and line number,

   tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

 /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

/******** (C) COPYRIGHT STMicroelectronics **END OF FILE*/

More likely to need to look at your GPIO Init code in your HAL MSP​ file.

The part has a finite amout of RAM, GNU/GCC will try to use all of it.

To solve Hard Fault problems you need to inspect the registers and code at and prior to the faulting location.​

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..

Still need to drill down to the code calling HAL_GPIO_Init()

grep or find-in-files, likely in the MSP code

Look very specifically at the REGISTERS and ASSEMBLER instructions at the faulting location, to understand what it is complaining about, likely a bad or unaligned pointer. Work back in the code to see where that was initialized

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
Rgoss.1
Associate II

when using STM32L0 and getting a hardfualt, does it also has something to do with the hardware(we're trying to program a custom PCB)?

Rgoss.1
Associate II

When implementing a stm32L0 series microcontroller in a custom PCB is it also possible that the harfault error could also have somthing to do with the actual hardware. even when some functions do work.

TDK
Guru

Usually hardfaults are due to software.

Examine the SCB registers to determine the cause of the hard fault and go from there.

If you feel a post has answered your question, please click "Accept as Solution".
Rgoss.1
Associate II

thank you guys for your time and attantion, it is sicerely appreciated.