2018-12-10 05:21 AM
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..
2018-12-10 07:27 AM
>>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.
2018-12-10 07:29 AM
> 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.
2018-12-10 10:58 PM
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
2018-12-11 03:26 AM
Any ideas?
2018-12-11 03:46 AM
> 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.
2018-12-11 03:50 AM
Yes, my problem is insufficient stack size.
I wrote my relocation code and jump code.
Where I am wrong?
My brain is blocked :)
2018-12-11 04:52 AM
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.
2018-12-11 05:47 AM
What can i do?
2018-12-11 06:03 AM
This general problem. But no enought information.