Как написать во флэш STM32 - PullRequest
       137

Как написать во флэш STM32

0 голосов
/ 12 января 2019

Я хочу записать во флэш-сектор 11 из STM32F407VGT из моего кода пользователя, чтобы сохранить некоторые данные. Я использовал библиотеку stm32f4xx_hal_flash.c. Сначала я стираю сектор, используя этот код:

void Flash_Init(void)
{        
    FLASH_EraseInitTypeDef pEraseInit;

    pEraseInit.Banks = FLASH_BANK_1;
    pEraseInit.NbSectors = 1;
    pEraseInit.Sector = FLASH_SECTOR_10;
    pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;

    if(HAL_FLASH_Unlock() == HAL_OK)
    {
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
        HAL_FLASHEx_Erase(&pEraseInit,0);
        HAL_FLASH_Lock();
    }
}

Программа зависает при достижении функции HAL_FLASHEx_Erase(&pEraseInit,0);. Мой скаттер-файл выглядит так:

LR_IROM1 0x08000000 0x01000000  {    ; load region size_region
  ER_IROM1 0x08000000 0x01000000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {
   .ANY (+RW +ZI)
  }
}

Что-то, что я должен сделать сначала, чтобы эта функция работала?

1 Ответ

0 голосов
/ 22 января 2019

Вы хотите написать сектор 11, но ваша переменная pEraseInit.Sector - FLASH_SECTOR_10 в вашей функции инициализации. Поэтому вы должны изменить FLASH_SECTOR_10 на FLASH_SECTOR_11. Также, если вы используете CubeMX, вы можете попробовать следующую функцию записи и чтения без функции инициализации.

uint32_t flash_read(uint32_t address){
    return *(uint32_t*)address;
}

void flash_write(uint32_t address, uint32_t data){
    HAL_FLASH_Unlock();
    FLASH_Erase_Sector(FLASH_SECTOR_11,VOLTAGE_RANGE_1);
    HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,address,data);
    HAL_FLASH_Lock();
}

Вы можете увидеть карту флэш-памяти здесь

...