cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F105 DFU BootLoader does not work

arilink
Associate III

I successfully used USB DFU on STM32H7, and I want to perform the same operation on STM32F105. I learned from the manual that the system BootLoader address is 0x1FFFB000. But when I try to jump into USB DFU mode, windows prompts the device descriptor but my users The program can use USB to communicate normally. What is the problem?

4 REPLIES 4
Imen.D
ST Employee

Hello @arilink​,

Please refer to this post and FAQ: DFU mode with system bootloader is not working, while USB does, that may answer your question.

If your question is answered, please select the answer as “Best�? as this will help other users to find answers faster.

Imen

When your question is answered, please close this topic by clicking "Accept as Solution".
Thanks
Imen
Imen.D
ST Employee

Hi @arilink​ ,

Were you able to resolve the issue ? If yes, it will be interesting to share with us your update.

Thanks

Imen

When your question is answered, please close this topic by clicking "Accept as Solution".
Thanks
Imen

no i had try the way in your url but it doesn't work DFU is not ok

My current experimental phenomenon is that when I pull the STM32F105RBT6 boot0 high and power on, the USB will prompt an unrecognized USB device and then the USB will jump twice. After the stable device manager, there will be an additional STM32 Bootloader device that can be used for DFU firmware update This is the phenomenon I want but at the same time I have new questions

1. When I use the software to jump into DFU mode, it will prompt the unrecognized USB device but it will not jump. Why?

2. After boot0 is pulled high and powered on, windows first prompts an unrecognized USB device and then the USB will be stable after beating twice? What is the reason?

3. I attach the source code of the software to enter DFU mode. Can you help me check if there is a problem?

static void JumpToBootloader(void)

{

uint32_t i=0;

void (*SysMemBootJump)(void); /* Declare a function pointer */

__IO uint32_t BootAddr = 0x1FFB000; /* STM32H7 system BootLoader address */

/* Turn off the global interrupt */

DISABLE_INT();

/* Turn off the tick timer and reset to the default value */

SysTick->CTRL = 0;

SysTick->LOAD = 0;

SysTick->VAL = 0;

/* Set all clocks to the default state, use HSI clock */

HAL_RCC_DeInit();

/* Close all interrupts and clear all interrupt pending flags */

for (i = 0; i <8; i++)

{

NVIC->ICER[i]=0xFFFFFFFF;

NVIC->ICPR[i]=0xFFFFFFFF;

}

/* Enable global interrupt */

ENABLE_INT();

/* Jump to the system BootLoader, the first address is MSP, address +4 is the reset interrupt service program address */

SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

/* Set the main stack pointer */

__set_MSP(*(uint32_t *)BootAddr);

/* In the RTOS project, this statement is very important, set to privileged mode, use MSP pointer */

__set_CONTROL(0);

/* Jump to the system BootLoader */

SysMemBootJump();

while (1)

{

}

}