Skip to main content
Hi world!
Associate III
December 10, 2018
Question

Bootloader HardFault Error Peripheral

  • December 10, 2018
  • 17 replies
  • 2850 views

Hi guys,

I'm using a bootloader. I am using 2 UART channels in the bootloader program. At the same time, I use these uart channels in the program I will install. But they don't work. The program enters the HardFault Error interrupt. When sending data to the uart channel when debugging, the program is corrupted and enters the HardFault Error interrupt.

What can I do?

Thanks..

This topic has been closed for replies.

17 replies

Tesla DeLorean
Guru
December 10, 2018

>>What can I do?

Instrument the Hard Fault Handler so you understand how/why it got there, and learn how to debug gross errors?

Most likely source of errors insufficient stack size, and errant pointers or memory access.

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
AvaTar
Senior III
December 10, 2018

> What can I do?

Provide more information.

Like code for the UART initialization and the interrupt handlers.

Or you can step though your code in a debugger, and identify where the hardfault happens.

Perhaps inproper peripheral settings remain from the bootloader code. Or the interrupt vectors / settings are messed up.

Hi world!
Hi world!Author
Associate III
December 11, 2018

Sorry ..

I able to blink led with bootloader. But if i use uart etc. program is go to HardFault_Handler.

MCU: Stm32f0

This my jumpping function:

 void (*JumpToApp)(void);
 
 __set_CONTROL(0);
 SysTick->CTRL = 0;
 SysTick->LOAD = 0;
 SysTick->VAL = 0;
 
 __disable_irq();
 
 __DSB();
 __ISB();
 
 SYSCFG->CFGR1 = 0x01;
 
 uint32_t msp_value = *(__IO uint32_t *)UserStartAdress;
 uint32_t JumpAppAddr = *(__IO uint32_t *) (UserStartAdress+4);
 
 JumpToApp = (void (*) (void))JumpAppAddr;
 __set_MSP(*(__IO uint32_t *)UserStartAdress);
 
 JumpToApp();

And this in my user application program for vector configuration, RemapTable():

 #define APPLICATION_ADDRESS (uint32_t)0x08003000
 
 __IO uint32_t *VectorTable = (__IO uint32_t *)0x20000000;
 
 uint32_t Index = 0;
 for(Index = 0; Index < 48; Index++) {
 VectorTable[Index] = *(__IO uint32_t*)((uint32_t)APPLICATION_ADDRESS + (Index << 2));
 } 
 __HAL_RCC_USART1_FORCE_RESET();
 __HAL_RCC_USART2_FORCE_RESET();
 __HAL_RCC_USART1_RELEASE_RESET();
 __HAL_RCC_USART2_RELEASE_RESET();
 __HAL_RCC_APB2_FORCE_RESET();
 __HAL_RCC_AHB_FORCE_RESET();
 __HAL_RCC_SYSCFG_CLK_ENABLE();
 __HAL_RCC_AHB_RELEASE_RESET();
 __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
 __HAL_SYSCFG_REMAPMEMORY_SRAM();
 
 __enable_irq();

And finally this my main function:

 RemapTable();
 
 HAL_Init();
 
 SystemClock_Config();
 
 MX_GPIO_Init();
 MX_USART1_UART_Init();
 MX_USART2_UART_Init();
 MX_TIM6_Init();
 MX_NVIC_Init();
 
 PORTA_ODR.Led = 1; //Led is okey, ON
 
 xfprintf(UART, "\n/*** Boot ***/\n\n"); // This not work, go hardfault error interrupt

Hi world!
Hi world!Author
Associate III
December 11, 2018

Any ideas?

AvaTar
Senior III
December 11, 2018

> xfprintf(UART, "\n/*** Boot ***/\n\n"); // This not work, go hardfault error interrupt

I'm not doing Cube code.

What is xprintf() supposed to do, and where/how is it implemented ?

Hardfaults on printf()-like functions tend to be stack related, i.e. insufficient stack size.

Hi world!
Hi world!Author
Associate III
December 11, 2018

Yes, my problem is insufficient stack size.

I wrote my relocation code and jump code.

Where I am wrong?

My brain is blocked :)

AvaTar
Senior III
December 11, 2018

Stack size is a parameter you feed into the project settings.

The toolchain reserves said chunk of memory for the stack, and feeds the pointer to that chunk to the appropriate place in the vector table, where the MCU fetches it at startup. I assume you know the stack grows downward.

Consult the map file for your project.

BTW, mentioning the toolchain would be helpful.

Hi world!
Hi world!Author
Associate III
December 11, 2018

What can i do?

Hi world!
Hi world!Author
Associate III
December 11, 2018

This general problem. But no enought information.

Tesla DeLorean
Guru
December 11, 2018

>>This general problem. But no enough information.

So have you looked at the registers and faulting instructions? Hard to debug remotely. Harder with no detail from the remote end, and selective cut-n-paste of code that may or may not be relevant to the failure.

In Keil the stack size is defined in startup_stm32f0xx.s

You need to make sure the app doesn't use the base of RAM you're using for the Vector Table, and that the RAM is remapped properly.

Make sure it is linking the correct library, 32-bit ARM libraries will not execute on a CM0, code built for the CM3 or CM4 will likely also fail.

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
Hi world!
Hi world!Author
Associate III
December 11, 2018

Thank you for reply. This my .s file

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
 
Stack_Size		EQU 0x400
 
 AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
 
 
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
 
Heap_Size EQU 0x200
 
 AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
 
 PRESERVE8
 THUMB
 
 
; Vector Table Mapped to Address 0 at Reset
 AREA RESET, DATA, READONLY
 EXPORT __Vectors
 EXPORT __Vectors_End
 EXPORT __Vectors_Size
 
__Vectors DCD __initial_sp ; Top of Stack
 DCD Reset_Handler ; Reset Handler
 DCD NMI_Handler ; NMI Handler
 DCD HardFault_Handler ; Hard Fault Handler
 DCD 0 ; Reserved
 DCD 0 ; Reserved
 DCD 0 ; Reserved
 DCD 0 ; Reserved
 DCD 0 ; Reserved
 DCD 0 ; Reserved
 DCD 0 ; Reserved
 DCD SVC_Handler ; SVCall Handler
 DCD 0 ; Reserved
 DCD 0 ; Reserved
 DCD PendSV_Handler ; PendSV Handler
 DCD SysTick_Handler ; SysTick Handler
 
 ; External Interrupts
 DCD WWDG_IRQHandler ; Window Watchdog
 DCD PVD_VDDIO2_IRQHandler ; PVD through EXTI Line detect
 DCD RTC_IRQHandler ; RTC through EXTI Line
 DCD FLASH_IRQHandler ; FLASH
 DCD RCC_CRS_IRQHandler ; RCC and CRS
 DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1
 DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3
 DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15
 DCD TSC_IRQHandler ; TS
 DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
 DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel 2 and Channel 3
 DCD DMA1_Channel4_5_6_7_IRQHandler ; DMA1 Channel 4, Channel 5, Channel 6 and Channel 7
 DCD ADC1_COMP_IRQHandler ; ADC1, COMP1 and COMP2 
 DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation
 DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
 DCD TIM2_IRQHandler ; TIM2
 DCD TIM3_IRQHandler ; TIM3
 DCD TIM6_DAC_IRQHandler ; TIM6 and DAC
 DCD TIM7_IRQHandler ; TIM7
 DCD TIM14_IRQHandler ; TIM14
 DCD TIM15_IRQHandler ; TIM15
 DCD TIM16_IRQHandler ; TIM16
 DCD TIM17_IRQHandler ; TIM17
 DCD I2C1_IRQHandler ; I2C1
 DCD I2C2_IRQHandler ; I2C2
 DCD SPI1_IRQHandler ; SPI1
 DCD SPI2_IRQHandler ; SPI2
 DCD USART1_IRQHandler ; USART1
 DCD USART2_IRQHandler ; USART2
 DCD USART3_4_IRQHandler ; USART3 & USART4
 DCD CEC_CAN_IRQHandler ; CEC and CAN
 DCD USB_IRQHandler ; USB
 
__Vectors_End
 
__Vectors_Size EQU __Vectors_End - __Vectors
 
 AREA |.text|, CODE, READONLY
 
; Reset handler routine
Reset_Handler PROC
 EXPORT Reset_Handler [WEAK]
 IMPORT __main
 IMPORT SystemInit 
 LDR R0, =SystemInit
 BLX R0
 LDR R0, =__main
 BX R0
 ENDP
 
; Dummy Exception Handlers (infinite loops which can be modified)
 
NMI_Handler PROC
 EXPORT NMI_Handler [WEAK]
 B .
 ENDP
HardFault_Handler\
 PROC
 EXPORT HardFault_Handler [WEAK]
 B .
 ENDP
SVC_Handler PROC
 EXPORT SVC_Handler [WEAK]
 B .
 ENDP
PendSV_Handler PROC
 EXPORT PendSV_Handler [WEAK]
 B .
 ENDP
SysTick_Handler PROC
 EXPORT SysTick_Handler [WEAK]
 B .
 ENDP
 
Default_Handler PROC
 
 EXPORT WWDG_IRQHandler [WEAK]
 EXPORT PVD_VDDIO2_IRQHandler [WEAK]
 EXPORT RTC_IRQHandler [WEAK]
 EXPORT FLASH_IRQHandler [WEAK]
 EXPORT RCC_CRS_IRQHandler [WEAK]
 EXPORT EXTI0_1_IRQHandler [WEAK]
 EXPORT EXTI2_3_IRQHandler [WEAK]
 EXPORT EXTI4_15_IRQHandler [WEAK]
 EXPORT TSC_IRQHandler [WEAK]
 EXPORT DMA1_Channel1_IRQHandler [WEAK]
 EXPORT DMA1_Channel2_3_IRQHandler [WEAK]
 EXPORT DMA1_Channel4_5_6_7_IRQHandler [WEAK]
 EXPORT ADC1_COMP_IRQHandler [WEAK]
 EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK]
 EXPORT TIM1_CC_IRQHandler [WEAK]
 EXPORT TIM2_IRQHandler [WEAK]
 EXPORT TIM3_IRQHandler [WEAK]
 EXPORT TIM6_DAC_IRQHandler [WEAK]
 EXPORT TIM7_IRQHandler [WEAK]
 EXPORT TIM14_IRQHandler [WEAK]
 EXPORT TIM15_IRQHandler [WEAK]
 EXPORT TIM16_IRQHandler [WEAK]
 EXPORT TIM17_IRQHandler [WEAK]
 EXPORT I2C1_IRQHandler [WEAK]
 EXPORT I2C2_IRQHandler [WEAK]
 EXPORT SPI1_IRQHandler [WEAK]
 EXPORT SPI2_IRQHandler [WEAK]
 EXPORT USART1_IRQHandler [WEAK]
 EXPORT USART2_IRQHandler [WEAK]
 EXPORT USART3_4_IRQHandler [WEAK]
 EXPORT CEC_CAN_IRQHandler [WEAK]
 EXPORT USB_IRQHandler [WEAK]
 
 
WWDG_IRQHandler
PVD_VDDIO2_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_CRS_IRQHandler
EXTI0_1_IRQHandler
EXTI2_3_IRQHandler
EXTI4_15_IRQHandler
TSC_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_3_IRQHandler
DMA1_Channel4_5_6_7_IRQHandler
ADC1_COMP_IRQHandler
TIM1_BRK_UP_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
TIM14_IRQHandler
TIM15_IRQHandler
TIM16_IRQHandler
TIM17_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_4_IRQHandler
CEC_CAN_IRQHandler
USB_IRQHandler
 
 B .
 
 ENDP
 
 ALIGN
 
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
 IF :DEF:__MICROLIB
 
 EXPORT __initial_sp
 EXPORT __heap_base
 EXPORT __heap_limit
 
 ELSE
 
 IMPORT __use_two_region_memory
 EXPORT __user_initial_stackheap
 
__user_initial_stackheap
 
 LDR R0, = Heap_Mem
 LDR R1, =(Stack_Mem + Stack_Size)
 LDR R2, = (Heap_Mem + Heap_Size)
 LDR R3, = Stack_Mem
 BX LR
 
 ALIGN
 
 ENDIF
 
 END

Hi world!
Hi world!Author
Associate III
December 12, 2018

Any ideas? ​