STM32 — флэш-память для записи и чтения

#c #stm32 #flash-memory

Вопрос:

Может ли кто-нибудь сказать мне, какую глупость я делаю неправильно или понимаю? В качестве теста я пытаюсь записать простое число во флэш-память и извлечь его. После успеха я расширю это до 6 подписанных значений. Мое устройство-STM32L476RG

 uint64_t data = 88;
Erase_Flash();
HAL_FLASH_Unlock();

Address = ADDR_FLASH_PAGE_256;
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST, Address, data) != HAL_OK)
    serprintf("Error writing flash.");

HAL_FLASH_Lock();
uint8_t *flash_biases = (uint8_t*) (ADDR_FLASH_PAGE_256);
 

введите описание изображения здесь

Основываясь на том, что я прочитал, я должен иметь доступ к флэш-памяти, как у меня есть. Но это не возвращает то значение, которое я ожидаю.

Функция Erase_Flash() выглядит следующим образом:

 void Erase_Flash() {
    HAL_FLASH_Unlock();
    /* Clear OPTVERR bit set on virgin samples */
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);

    /* Fill EraseInit structure*/
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_MASSERASE;
    EraseInitStruct.Banks = FLASH_BANK_2;

    if (HAL_FLASHEx_Erase(amp;EraseInitStruct, amp;PAGEError) != HAL_OK) {
        serprintf("Error erasing flash.");
    }
    HAL_FLASH_Lock();
}
 

Комментарии:

1. Какова точная модель вашего устройства?

2. Не могли бы вы опубликовать Erase_Flash() ? Относится Address к типу uint32_t ? Каково значение байта Address непосредственно перед вызовом HAL_FLASH_Program() (должно быть 0xFF)? Защищен ли сектор флэш-памяти для чтения/записи (проверьте байты опции)? Действительно ли сектор флэш-памяти не используется (проверьте сценарий компоновщика)?

3. @rel опубликовал! Раздел flash не используется. Есть еще один раздел кода, написанный коллегой, который отлично работает при этом значении.

4. @Tagli stm32L476RG, и сообщение отредактировано, чтобы отразить это

5. Как @Tagli уже указал в ответе ниже, вы можете использовать FLASH_Program_DoubleWord() или HAL_FLASH_Program() с FLASH_TYPEPROGRAM_DOUBLEWORD помощью , проверьте: github.com/STMicroelectronics/STM32CubeL4/blob/master/Drivers/… . В режиме быстрого программирования HAL_FLASH_Program() интерпретирует третий параметр как указатель! Довольно запутанно. Быстрое программирование доступно не во всех вариантах STM32… См. также: 3.3.7 Flash main memory programming sequences в справочном руководстве RM0351.

Ответ №1:

FLASH_TYPEPROGRAM_FAST режим используется для одновременной записи 32 двойных слов, и при использовании этого режима третий аргумент ( data ) становится исходным исходным адресом этого источника данных из 32 двойных слов, а не самих данных.

В настоящее время ваш код извлекает данные с адреса, начинающегося с 0x88, и записывает их (в общей сложности 256 байт) во флэш-память. Похоже, что по адресу 0x88 есть 245.

Вам нужно использовать FLASH_TYPEPROGRAM_DOUBLEWORD для записи uint64_t данных.

Комментарии:

1. Хорошо, спасибо! В этом есть смысл. Я займусь этим делом!