Skip to main content
Itamar Eliakim
Associate II
October 6, 2018
Question

STM32F103 - CubeMX DFU

  • October 6, 2018
  • 5 replies
  • 1737 views

Hi,

I couldn't find online a working bootloader implementation of STM32f103C8 based on generated files from CubeMX, i've started porting the F4 DFU to F1, there are two applications:

0x08000000 - DFU Bootloader

0x08008000 - Application

Jump between the address works perfectly, CRC works well, at the init of DFU bootloader i check the CRC at certain address if it matches the application that starts from 0x08008000.

Correctly the main issue is with the implementation of "MEM_If_Write_FS", this is the code:

uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
 
{
 
 /* USER CODE BEGIN 3 */
 
	uint32_t i = 0;
 
 
 
	for(i = 0; i < Len; i+=4)
 
	{
 
 /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
 
 be done by byte */
 
 if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest+i), *(uint32_t*)(src+i)) == HAL_OK)
 
 {
 
 /* Check the written value */
 
 if(*(uint32_t *)(src + i) != *(uint32_t*)(dest+i))
 
 {
 
 /* Flash content doesn't match SRAM content */
 
 return 2;
 
 }
 
 }
 
 else
 
 {
 
 /* Error occurred while writing data in Flash memory */
 
 return 1;
 
 }
 
	}
 
 
 
	return (USBD_OK);
 
 /* USER CODE END 3 */
 
}

When i try to load the app through dfu-util on linux the app freezes on:

Download from image offset 00000000 to memory 08008000-080083ff, size 1024
 
 Poll timeout 50 ms
 
 Poll timeout 0 ms

And on the debugger i get "Flash content doesn't match SRAM content" on the "MEM_If_Write_FS".

Is there any way to solve this issue?

Best,

Itamar

    This topic has been closed for replies.

    5 replies

    Pavel A.
    October 7, 2018

    If you want to program by BYTE : in line 11 increment the counter by 1 and use appropriate parameter: FLASH_TYPEPROGRAM_BYTE. You increment by 4, and program by 32-bit (aka WORD).

    Itamar Eliakim
    Associate II
    October 8, 2018

    Not sure i understand you, why should i change it to BYTE instead of WORD? shouldn't it work the same?

    is the the reason the the dfu-util doesn't work?

    Itamar Eliakim
    Associate II
    October 9, 2018

    UP

    Tesla DeLorean
    Guru
    October 9, 2018

    What is it you want everyone to do? Not sure there's a lot of pro interest in chasing down CubeMX issues.

    Perhaps start by instrumenting the code so you don't stop real-time USB functionality.

    Output things like the addresses involved, current content, addresses and mismatched data.

    Make sure the memory is erased. Test flash code outside of DFU context.

    Try using ST DFU tools

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Pavel A.
    October 9, 2018

    You wrote that the error is in comparing the written value with original.

    This indeed could be because writing flash is done in wrong granularity.

    There's a comment in your source snippet that says that programming should be done by byte.

    Same API, but stepping in the for loop then should be by one byte.

    -- pa