#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. Хорошо, спасибо! В этом есть смысл. Я займусь этим делом!