2024-10-18 01:06 AM
I am using an STM32C031 and am trying to write the bootloader program and application program as a single .bin file.
However, I have designed the boot loader program to start up when the power is turned on and jump to the application program by specifying the flash memory if the specified signal has not been received for a while, but I cannot get it to jump properly. It seems to jump to the application program from the flash memory location, but the application program does not work properly.
What kind of program should I use to make the boot loader program start working correctly when it jumps to the application program?
Also attached are the documents to which we are referring.
The usage of flash memory is as follows.
Boot program: 0x08000000~0x080027FF
Application program: 0x08003800~0x080077FF
The program for the jump part described in the boot loader program is as follows.
void jump_main(){
HAL_TIM_Base_Stop_IT(&htim17);
huart1.Instance->CR1 &= ~0x20;
//Disable all interrupts
NVIC->ICER[0] = 0xFFFFFFFFFF;
NVIC->ICER[1] = 0xFFFFFFFFFF;
NVIC->ICER[2] = 0xFFFFFFFFFFFF;
//Clear pendings
NVIC->ICPR[0] = 0xFFFFFFFFFFFF;
NVIC->ICPR[1] = 0xFFFFFFFFFFFF;
NVIC->ICPR[2] = 0xFFFFFFFFFF;
int *user_app = (int *)(0x08003800+0x04);
__set_MSP(*(uint32_t *)0x08003800);
*(int*)0xE000ED08 = 0x08003800;
((void(*)())(*user_app))();
while(1){ };
}
2024-10-18 01:17 AM
Probably your application code with the file system_stm32c0xx.c does not have the vector offset updated to your application start address.
2024-10-18 01:41 AM
Shouldn't it be loading the CONTENT of the vector .
The vector table does not contain executable code.
Step the transition in the debug.
Instrument and print content to understand what the MCU sees
Have a working HardFault_Handler so you can see if it ends up there.
I would setup SP and SCB->VTOR on the application side
2024-10-18 03:43 AM
I am trying to set the FLASH address in “stm32c031xx_flash.icf” which is generated when generating code from STMCubeMX.Do you think these do not make sense?
<bootloader stm32c031xx_flash.icf>
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x080027FF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20002FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x200;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
<Application stm32c031xx_flash.icf>
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08003800;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08003800;
define symbol __ICFEDIT_region_ROM_end__ = 0x080077FF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20002FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x200;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:0x08000000 { section .bootloader };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
2024-10-18 04:00 AM
I found that if I separate the bootloader and application programs and run the bootloader only program, I get into "jump main()"and then a Hard Fault error. Is this related to your comment?