Выполним очистку 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; |
Оставить ответ
Вы должны быть авторизованы чтобы размещать комментарии.