F4.FLASH Стирание сектора

Выполним очистку 11 сектора.

Для этого разблокируем FLASH выполнив последовательно запись ключей в поле KEYR:
FLASH->KEYR = 0x45670123;
FLASH->KEYR = 0xCDEF89AB;

Бит LOCK в регистре CR должен очиститься, значит регистр разблокирован. Если бит LOCK останется в случае неудачной разблокировки, снять его уже не получиться и потребуется выполнить сброс микроконтроллера.

Установим латентность FLASH памяти в зависимости от напряжения питания и частоты ядра (смотреть RM0090 страница 80)

FLASH->ACR |= FLASH_ACR_LATENCY_5WS; //2.7 — 3.6V, 150

Очистим флаги статусного регистра SR

FLASH->SR = 0xFFFFFFFF;

Настроим  CR регистр.
Активируем режим стирания сектора, установив бит SER

FLASH->CR |= FLASH_CR_SER;

Установим размер параллелизма 0x10 в поле PSIZE, оно зависит от напряжения питания для программирования и стирания (смотреть RM0090 страница 85)

FLASH->CR |= FLASH_CR_PSIZE_1; //2.7 — 3.6 V 0x10

Установим номер сектора (0-11) для стирания в поле SNB

FLASH->CR |= ((uint32_t)11

или так

FLASH->CR |= FLASH_CR_SNB_3 | FLASH_CR_SNB_1 | FLASH_CR_SNB_0; //0x1011

Запустим операцию стирания установкой бита STRT и ждем окончания процедуры, флаг BSY

FLASH->CR |= FLASH_CR_STRT;
while((FLASH->SR & FLASH_SR_BSY) == 1){};

Очищаем CR и блокируем FLASH память установкой бита LOCK это можно сделать все одной записью

FLASH->CR = 0x80000000;

Сектор очищен.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FLASH->KEYR = 0x45670123;
FLASH->KEYR = 0xCDEF89AB;
 
FLASH->ACR |= FLASH_ACR_LATENCY_5WS;
 
FLASH->SR = 0xFFFFFFFF;
FLASH->CR |= FLASH_CR_SER;
FLASH->CR |= FLASH_CR_PSIZE_1; //2.7 - 3.6 V 0x10
FLASH->CR |= ((uint32_t)11  FLASH_CR_SNB_Pos); 
//FLASH->CR |= FLASH_CR_SNB_3 | FLASH_CR_SNB_1 | FLASH_CR_SNB_0; //0x1011
 
FLASH->CR |= FLASH_CR_STRT;
while((FLASH->SR & FLASH_SR_BSY) == 1){};
 
FLASH->CR = 0x80000000;

Оставить ответ