cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F042K6 - Jump to Bootloader

PP11
Associate II

 

Hello everyone,
 
I have an STM32F042K6 running a small application in a hard-to-reach enclosure. I want to use the USB interface for firmware updates. This interface is used for sending data. The bootloader is activated by a long button press. I already have this code running on an STM32F303, and it works great. Unfortunately, it doesn't work on the F042.
I changed the addr to "0x1FFFC400" for the F042K6. 
 
 

 

void JumpToBootloader(void) {
void (*SysMemBootJump)(void);
/**
* Step: Set system memory address.
* For STM32F303, system memory is on 0x1FFFD800
* For other families, check AN2606 document table 110 with descriptions of memory addresses
*/
volatile uint32_t addr = 0x1FFFD800;
/**
* Step: Disable RCC, set it to default (after reset) settings
* Internal clock, no PLL, etc.
*/
//MX_USB_DEVICE_DeInit();
HAL_RCC_DeInit();
/**
* Step: Disable systick timer and reset it to default values
*/
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/**
* Step: Disable all interrupts
*/
//__disable_irq();
/**
* Step: Remap system memory to address 0x0000 0000 in address space
* For each family registers may be different.
* Check reference manual for each family.
*
* For STM32F4xx, MEMRMP register in SYSCFG is used (bits[1:0])
* For STM32F0xx, CFGR1 register in SYSCFG is used (bits[1:0])
* For others, check family reference manual
*/
__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH(); //Call HAL macro to do this for you
/**
* Step: Set jump memory location for system memory
* Use address with 4 bytes offset which specifies jump location where program starts
*/
SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
/**
* Step: Set main stack pointer.
* This step must be done last otherwise local variables in this function
* don't have proper value since stack pointer is located on different position
*
* Set direct address location which specifies stack pointer in SRAM location
*/
__set_MSP(*(uint32_t *)addr);
/**
* Step: Actually call our function to jump to set location
* This will start system memory execution
*/
SysMemBootJump();
/**
* Step: Connect USB<->UART converter to dedicated USART pins and test
* and test with bootloader works with STM32 Flash Loader Demonstrator software
*/
}

 

 
 
I then looked for alternative solutions, but they also don't work, and I am at a loss.
Example:
I disabled the BOOT_SEL Bit for the second attempt.
 
The goal is to use the STM32CubeProgrammer to upload new firmware.

What else could I do? 
Thanks! 


Greetings 
Paul 

2 REPLIES 2

While the sources of bootloader are not available, you actually can debug it at the register level. So one possible way to proceed is to read out all relevant registers (in your case perhaps RCC, USB, related GPIO) after jumping to the bootloader, and compare them to the bootloader started "naturally" (using BOOT0).

JW

Billy OWEN
ST Employee

Hi @PP11 

 

This post has been escalated to the ST Online Support Team for additional assistance.  We'll contact you directly.

 

Regards,

Billy