Очистка флеш памяти stm32

Обновлено: 30.06.2024

Flash память МК делится на сектора. Каждый сектор отвечает за заданную область памяти. Всего секторов 12. Какой сектор за какую область памяти отвечает можно узнать из приведённого ниже списка:

0. 0x08000000-0x08003FFF (16 кБ)
1. 0x08004000-0x08007FFF (16 кБ)
2. 0x08008000-0x0800BFFF (16 кБ)
3. 0x0800C000-0x0800FFFF (16 кБ)
4. 0x08010000-0x0801FFFF (64 кБ)
5. 0x08020000-0x0803FFFF (128 кБ)
6. 0x08040000-0x0805FFFF (128 кБ)
7. 0x08060000-0x0807FFFF (128 кБ)
8. 0x08080000-0x0809FFFF (128 кБ)
9. 0x080A0000-0x080BFFFF (128 кБ)
10. 0x080C0000-0x080DFFFF (128 кБ)
11. 0x080E0000-0x080FFFFF (128 кБ)

Стирать память можно только по секторам, т.е., если вам требуется записать 1 байт, вам надо куда-то скопировать ВЕСЬ сектор, стереть его и записать в него старые данные, заменив в них нужный байт. Записать же данные поверх текущих невозможно потому, что запись производится побитовым AND. Т.е. фактически это выглядит так:

ПАМЯТЬ=ПАМЯТЬ AND data, где data - ваши данные.

Правильная запись гарантируется только если все биты в нужной ячейке равны 1. Как вы уже догадались, стирание памяти устанавливает состояние всех ячеек в 1.

Чтение из Flash.

Тут всё просто. У нас есть адрес из которого нам надо считать. Что мы и делаем функцией:

uint32_t flash_read(uint32_t address)
return (*(__IO uint32_t*) address);
>

Эта функция возвращает данные из 4-х байт, начиная с заданного.

Разблокирование Flash.

Прежде чем что-то делать с памятью, как уже было написано выше, её надо сначала разблокировать. Для этого надо в регистр KEYR сначала записать число 0x45670123, а затем 0xCDEF89AB. при использовании StdPeriph это сводится к вызову функции:

Если вы закончили писать в память, то вызовите функцию:

Стирание Flash.

Перед стиранием узнайте по приведённому выше списку в каком секторе находятся данные, подлежащие стиранию. Затем вызовите функцию:

FLASH_Sector_5 - Вместо 5 вставьте номер своего сектора.
VoltageRange_3 - это диапазон питания. Есть 4 диапазона:

VoltageRange_1 - питание от 1.8 до 2.1 В
VoltageRange_2 - питание от 2.1 до 2.7 В
VoltageRange_3 - питание от 2.7 до 3.6 В
VoltageRange_4 - питание от 2.7 до 3.6 В с внешним Vpp.

У вас скорее всего 3.3В без батарейки.

Запись в Flash.

Запись также происходит по адресу одной из команд:

Первым пишется адрес куда писать, вторым данные которые писать. Функции используются в зависимости от типа записываемых данных. Пример:

Пример чтения и записи.

Фунция которая записывает 12 символов в память:

void WriteDeviceAddress(char* data)
uint8_t i;

FLASH_Unlock();
FLASH_EraseSector(DEVICE_SECTOR, VoltageRange_3);

for (i=0;i<12;i++)
FLASH_ProgramByte(DEVICE_ADDRESS+i, data[i]);
>


Пример чтения записанных 12-ти символов:

void ReadDeviceAddress(char* Dout)
uint32_t temp , i, j, k=0;

Использование в программе:

char TempStr[20], TempStr2[20];

sprintf(TempStr2, "0001951337B1");
WriteDeviceAddress(TempStr2);
ReadDeviceAddress(TempStr);

STM32: Операции стирания, чтения и записи Flash (библиотека HAL)

  • Платформа приложения: STM32F030F4P6
  • ST официальная библиотека: STM32Cube_FW_F0_V1.9.0

Базовые знания


  • В подавляющем большинстве микроконтроллеров и микроконтроллеров (ARM, x86) адресное пространство находится в байтах, то есть адрес является байтом.
  • Одной из характеристик флэш-памяти является то, что она может записывать только 0, а не 1. Таким образом, если исходный адрес содержит данные, это означает, что некоторые биты равны 0, эти биты эквивалентны недействительным. Таким образом, вы должны убедиться, что все они равны 1, прежде чем писать, необходимо только удаление. Кроме того, каждое стирание должно стирать сектор 4K, который определяется характеристиками вспышки.
  • Внутренний генератор должен быть включен до вспышки.

STM32F030F4P6 Введение во флэш-память

Конфигурация оборудования STM32F030F4P6: флэш-память (16 КБ), ОЗУ (4 КБ)
(содержит 4 сектора, 1 сектор содержит 4 страницы, каждая страница имеет пространство 1 Кбайт)
Пользователи могут выполнять Flash program и erase Операция.


Main Flash memory programming
The main Flash memory can be programmed 16 bits at a time.
Flash memory erase
The Flash memory can be erased page by page or completely (Mass Erase).

Flash memory addresses Size(byte) Name Description
0x0800 0000 - 0x0800 03FF 1 Kbyte Page 0 Sector 0
0x0800 0400 - 0x0800 07FF 1 Kbyte Page 1 Sector 0
0x0800 0800 - 0x0800 0BFF 1 Kbyte Page 2 Sector 0
0x0800 0C00 - 0x0800 0FFF 1 Kbyte Page 3 Sector 0
0x0800 1000 - 0x0800 13FF 1 Kbyte Page 4 Sector 1
0x0800 1400 - 0x0800 17FF 1 Kbyte Page 5 Sector 1
0x0800 1800 - 0x0800 1BFF 1 Kbyte Page 6 Sector 1
0x0800 1C00 - 0x0800 1FFF 1 Kbyte Page 7 Sector 1
0x0800 2000 - 0x0800 23FF 1 Kbyte Page 8 Sector 2
0x0800 2400 - 0x0800 27FF 1 Kbyte Page 9 Sector 2
0x0800 2800 - 0x0800 2BFF 1 Kbyte Page 10 Sector 2
0x0800 2C00 - 0x0800 2FFF 1 Kbyte Page 11 Sector 2
0x0800 3000 - 0x0800 33FF 1 Kbyte Page 12 Sector 3
0x0800 3400 - 0x0800 37FF 1 Kbyte Page 13 Sector 3
0x0800 3800 - 0x0800 3BFF 1 Kbyte Page 14 Sector 3
0x0800 3C00 - 0x0800 3FFF 1 Kbyte Page 15 Sector 3

STM32F030F4P6 Флэш-код для чтения и записи (библиотека HAL)

В чем может быть причина? Пробовал грузиться с притянутым к "1" BOOT0 - да же картина, подключается нормально, стирание идёт медленно и до конца не доходит.

P.S. Только что снова без особой надежды проделал те же операции - за секунду всё стёрлось, память очистилась без проблем. В чем причина - так и не понял

Нужно с ресетом подключать, т.е. SWD + nRESET, и в программке от ST-Link тоже указать что подключаться под ресетом. BOOT0 = 0.

Хотя учитывая, что у Вас читалось, возможно дело просто в слабом питании микроконтроллера. Во время стирания требуется немного больше тока, чем обычно.

JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Была похожая проблема. На микроконтроллере STM32F105RB отваливался настроенный в нем USB-HID Device, "Full chip erase" в ST-Link Utility не работал, как у автора, а иногда программа вообще не могла подключиться к устройству через ST-Link или связь отваливалась.

-Connection to device is lost: check power supply and debug connection.
-If the target is in low power mode, please enable "Debug in Low Power mode" option from Target->settings menu.
-No ST-LINK detected

Причиной был самодельный вентилятор. Мотор вентилятора из кассетного аудиоплеера, пропеллер от авиамодели и трансформаторный блок питания (питание было развязано). Шумы, создаваемые моторчиком, давали наводки на сигнальные цепи USB и SWD интерфейсов.
Времени потрачено много.
Всегда будьте бдительны, господа.

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Грязь на линиях питания, наводки на провода программатора. Конденсаторы на питании кристалла стоят? Разводка питания и земли нормальная?

Процедура стирания - дает неплохой мусор на шины питания. Прекрасно работающая схема может сильно чудить при стирании.

Попробуй снизить частоту работы ST-Link.

Приглашаем всех желающих 25/11/2021 г. принять участие в вебинаре, посвященном антеннам Molex. Готовые к использованию антенны Molex являются компактными, высокопроизводительными и доступны в различных форм-факторах для всех стандартных антенных протоколов и частот. На вебинаре будет проведен обзор готовых решений и перспектив развития продуктовой линейки. Разработчики смогут получить рекомендации по выбору антенны, работе с документацией и поддержкой, заказу образцов.

Часовой пояс: UTC + 3 часа

Кто сейчас на форуме

Думаю постоянные посетители сайта заметили, что предпочитаю все делать на регистрах, но иногда все таки использую SPL. Например, в статье про самописный бутлоадер, использовались библиотечные функции для работы с флэш памятью.

В очередной раз, подключая эту библиотеку, решил, что она занимает много места и решил самостоятельно реализовать необходимые функции.

  • Key register (FLASH_KEYR)
  • Option byte key register (FLASH_OPTKEYR)
  • Flash control register (FLASH_CR)
  • Flash status register (FLASH_SR)
  • Flash address register (FLASH_AR)
  • Option byte register (FLASH_OBR)
  • Write protection register (FLASH_WRPR)


FLASH_KEYR
После сброса МК FPEC (Flash memory program/erase controller) защищен от случайной записи/стирания. И для того, чтобы его разблокировать необходимо в регистр FLASH_KEYR последовательно записать два ключа: KEY1 = 0×45670123 и KEY2 = 0xCDEF89AB.

После этого бит LOCK в регистре FLASH_CR будет сброшен, а по окончании записи его надо программно установить.

FLASH_OPTKEYR
Позволяет снять защиту с опционных байтов для их модификации, которые после сброса МК доступны только для чтения. По своему назначению схож с FLASH_KEYR, ключи и последовательность действий для его разблокировки такая же. Отличие состоит в том, что после последовательной записи двух ключей будет установлен бит OPTWRE в регистре FLASH_CR, который разрешает запись данных в область опционных байт флэш памяти.

BSY(Busy) — устанавливается во время операций записи/стирания и сбрасывается по окончании или возникновении ошибки.

PGERR(Programming error) — устанавливается при попытке программирования не стертой памяти, то есть значение которой отлично от 0xFFFF.

WRPRTERR(Write protection error) — устанавливается при попытке программирования, защищенной от записи области.

EOP(End of operation) — устанавливается аппаратно, при успешном завершении операции записи/стирания.


FLASH_CR
Выше мы уже задействовали регистр FLASH_CR, предлагаю рассмотреть битовые поля из которых он состоит.

PG(Programming) — запись единицы в этот бит разрешает программирование флэш памяти.

PER(Page erase) — запись единицы в этот бит позволяет стереть одну страницу флэш памяти.

MER(Mass erase) — запись единицы в этот бит разрешает полное стирание флэш памяти.

OPTPG(Option byte programming) — запись единицы в этот бит разрешает программирования опционных байтов.

OPTER(Option byte erase) — запись единицы в этот бит позволяет стирать опционные байты.

STRT(Start) — запись единицы в этот бит запускает процедуру стирания флэш памяти.

LOCK(LOCK) — запись единицы в этот бит блокирует запись/стираниt флэш памяти.

OPTWRE(Option bytes write enable) — запись единицы в этот бит разрешает программирование опционных байтов.

ERRIE(Error interrupt enable) — запись единицы в этот бит разрешает генерацию прерываний при возникновении ошибок, то есть при установке PGERR или WRPRTERR в регистре FLASH_SR.

EOPIE(End of operation interrupt enable) — запись единицы в этот бит разрешает генерацию прерываний по окончанию операции записи/стирания, то есть при установке EOP в регистре FLASH_SR.

OBL_LAUNCH(Force option byte loading) — запись единицы в этот бит.


FLASH_AR
Предназначен для задания адреса при программировании флэш памяти. Для стирания страницы, в этот регистр необходимо записать любой из адресов, входящих в эту страницу и не обязательно начальный.


FLASH_OBR и FLASH_WRPR
Эти регистры в операциях записи и стирания не участвуют, а предназначены для установки защиты МК. Об этом планируется отдельная статья.

В коде приведенном в начале статьи видно, что перед тем как писать во флэш её надо очистить, а стирать флэш у STM32 можно либо по одной странице, либо полностью. При обновлении прошивки бутлоадером, вариант полного стирания флэш памяти не подходит(затрется сам бутлоадер), по этому необходимо стирать по одной странице. Размер страницы необходимо уточнить в документации на МК.

Прочитать данные 32-битной переменной, очень просто достаточно знать ее адрес.

Для записи данных, также необходим адрес и понимание того, что данные пишутся блоками по 16 бит.

В случае если функция вернула ноль, необходимо проверить значение флагов в регистре FLASH_SR, чтобы понять причину возникновения ошибки.

Вот и всё, основные необходимые функции для работы с памятью реализованы и многие непонятные моменты прояснились. Все что для этого надо было — это прочитать пару страниц даташита)))

Читайте также: