Перейти к содержанию
    

Непонятные странности со стиранием Flash на STM32F405

Ситуация следующая. (STM32F405)

FLASH_Unlock();

while (FLASH->SR & 0x010000);

FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3);

while (FLASH->SR & 0x010000);

FLASH_Lock();

Все прекрасно проходит под отладчиком. Сектор 1 стерт. Перепрошиваю, отключаю отладчик, передергиваю питание, немного выжидаю, подключаю отладчик и смотрю содержимое памяти. Сектор 1 не изменился.

В чем фишка?

 

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все прекрасно проходит под отладчиком.

 

Под отладчиком идете по шагам каждую строку или сразу всю процедуру стирания?

Попробуйте использовать флаг EOP (совместно с BSY).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Под отладчиком идете по шагам каждую строку или сразу всю процедуру стирания?

Попробуйте использовать флаг EOP (совместно с BSY).

Сразу всю процедуру.

 

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

Естественно, все прерывания запрещены. И даже вся периферия отключена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не ограничиваю никакие прерывания, просто выполняю код. У меня все нормально работает. Как под отладчиком, так и без него:

void InternalFlash::lock()
{
   FLASH->CR |= FLASH_CR_LOCK;
}

void InternalFlash::unlock(void)
{
   FLASH->KEYR = FLASH_KEY1;
   FLASH->KEYR = FLASH_KEY2;
}

//Функция стирает ВСЕ страницы. При её вызове прошивка самоуничтожается
//void flash_erase_all_pages(void)
//{
//      FLASH->CR |= FLASH_CR_MER; //Устанавливаем бит стирания ВСЕХ страниц
//      FLASH->CR |= FLASH_CR_STRT; //Начать стирание
//      while(!FlashReady); // Ожидание готовности.. Хотя оно уже наверное ни к чему здесь...
//      FLASH->CR &= FLASH_CR_MER;
//}

void InternalFlash::erasePage(byte page)
{
   if(page < 12 && page > 0)
   {
       while(FLASH_IS_BUSY);// Wait while flash is busy
       FLASH->CR |= FLASH_CR_PSIZE_1;// Parallelism to x32
       FLASH->CR |= FLASH_CR_SER | (page << 3); //Устанавливаем бит стирания одной страницы и стираем сектор 1 - 11
       FLASH->CR |= FLASH_CR_STRT; // Запускаем стирание
       while(FLASH_IS_BUSY);//Ждем пока страница сотрется.
   }
}

void InternalFlash::write(uint address, uint data)
{
   while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
   FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша
   *(uint*)address = data;// Write word cos we have 32bit parallelism
   while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
   FLASH->CR &= ~FLASH_CR_PG; //Запрещаем программирование флеша
}

void InternalFlash::writeBuf(uint address, uint *data, ushort size)
{
   while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
   FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша
   for(ushort i = 0; i < size; ++i)
   {
       ((uint *)address)[i] = data[i];// Write word cos we have 32bit parallelism
       while(FLASH_IS_BUSY);//Ожидаем готовности флеша к записи
   }
   FLASH->CR &= ~FLASH_CR_PG; //Запрещаем программирование флеша
}

 

Все методы класса InternalFlash

 

stm32f205, но, думаю, разницы не будет с другими ядрами

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема решена. Надо просто перед доступом к флэш очищать биты ошибок в FLASH->SR. Откуда они берутся - я пока не понял, но они стоят сразу при старте контроллера.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...