Как я могу стереть внутреннюю флэш-страницу (не сектор!) В моем STM32F405RG при использовании HAL?
Я зашел в тупик, пытаясь управлять внутренней вспышкой в микроконтроллере STM32F4. Есть много примеров, но большинство из них используют SPL API или низкоуровневые операции с регистрами. Я использую библиотеки HAL. И я не могу найти функцию, чтобы стереть только одну страницу (в stm32f4xx_hal_flash.c
а также stm32f4xx_hal_flash_ex.c
). Предлагаемые функции, такие как HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError)
или же void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange)
не позволяйте стирать только одну страницу (2048 кБайт), а только целый сектор (или сектора). Когда я пытаюсь использовать что-то вроде:
void Internal_Flash_Erase(unsigned int pageAddress) {
while (FLASH->SR & FLASH_SR_BSY);
if (FLASH->SR & FLASH_SR_EOP) {
FLASH->SR = FLASH_SR_EOP;
}
FLASH->CR |= FLASH_CR_PER;
FLASH->AR = pageAddress;
FLASH->CR |= FLASH_CR_STRT;
while (!(FLASH->SR & FLASH_SR_EOP));
FLASH->SR = FLASH_SR_EOP;
FLASH->CR &= ~FLASH_CR_PER;
}
возникает ошибка компилятора, потому что нет FLASH->AR
(Адресный регистр) в HAL. Я нашел чтение Справочного руководства RM0090, которое теперь мне нужно использовать FLASH->CR
вместо AR и установить биты FLASH_CR_SNB [3:6]
выбрать номер сектора.
И теперь я не знаю, как стереть только одну страницу. Это необходимо для создания запоминающего устройства во внутренней флеш-памяти для функции:int8_t STORAGE_Write_FS (uint8_t lun,
uint8_t *buf,
uint32_t blk_addr,
uint16_t blk_len)
в usbd_storage_if.c
который переводит вызовы USB-стека во внутреннюю флэш-память.
3 ответа
Ты не можешь Наименьшая часть, которую вы можете стереть - это сектор.
Я цитирую из справочника:
3.6.3 Стереть
Операция удаления флэш-памяти может выполняться на уровне секторов или всей флэш-памяти> (Mass Erase). Массовое стирание не влияет на сектор OTP или сектор конфигурации.
Вот почему сектора имеют разные размеры. Важно продуманно использовать программное обеспечение для секторов, учитывая, когда вам может понадобиться стереть данные флэш-памяти.
Возможно, вам понадобится буферизовать целые сектора в ОЗУ, чтобы реализовать запись во флэш-памяти с гранулярностью, подобной файловой системе.
Обычно: копирование флэш-сектора в таблицу, изменение страницы в таблице, удаление сектора, копирование таблицы во флэш-сектор
Видимо, я нашел свою ошибку. Примеры, которые я нашел, применяются для STM32F103xx. А флэш-память STM32F103xx действительно делится на страницы (1 или 2 Кбайт). Можно стереть "сектор", который равен стиранию "страницы". Но есть различия в случае STM32F4xx, где флэш-память разделена на сектора.