Search code examples
stm32hal

Can't write Double word on STM32F429 using HAL driver


I am trying to write uint64_t(double word) variable into the flash memory, without success though. Here is the code.

#define APPLICATION_START_ADDRESS                                   0x8008000

void flashErase(uint8_t startSector, uint8_t numberOfSectors)
{
    HAL_FLASH_Unlock();

    Flash_eraseInitStruct.TypeErase     = FLASH_TYPEERASE_SECTORS;
    Flash_eraseInitStruct.VoltageRange  = FLASH_VOLTAGE_RANGE_3;
    Flash_eraseInitStruct.Sector        = startSector;
    Flash_eraseInitStruct.NbSectors     = numberOfSectors;

    if(HAL_FLASHEx_Erase(&Flash_eraseInitStruct, &Flash_halOperationSectorError) != HAL_OK)
    {
        Flash_raiseError(errHAL_FLASHEx_Erase);
    }

    HAL_FLASH_Lock();
}

int main(void)
{
    HAL_Init();
    main_clockSystemInit();
    __IO uint64_t word =  0x1234567890;

    flashErase(2, 1);
//  flashProgramWord(aTxBuffer, APPLICATION_START_ADDRESS, 2 );
    HAL_FLASH_Unlock();
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, APPLICATION_START_ADDRESS, word);
}

I get error flag raised PGSERR and PGAERR. The erase operation goes without problems. But programming returns ERROR. Some Ideas?


Solution

  • There is no STM32F249, did you mean STM32F429?

    In order to use 64 bit programming, VPP (BOOT0) has to be powered by 8 - 9 Volts. Is it?

    See the Reference Manual Section 3.6.2

    enter image description here

    By the way,

    __IO uint64_t word =  0x1234567890;
    

    would not work as (presumably) expected. It is a 32 bit architecture, integer constants will be truncated to 32 bits, unless there is an L suffix. U wouldn't hurt either, because the variable is unsigned. __IO is unnecessary.

    uint64_t word =  0x1234567890UL;