реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Непонятные странности со стиранием Flash, Под отладчиком чтирает, без отладчика нет
AVN
сообщение Aug 4 2017, 14:46
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 21-03-05
Пользователь №: 3 556



Ситуация следующая. (STM32F405)
FLASH_Unlock();
while (FLASH->SR & 0x010000);
FLASH_EraseSector(FLASH_Sector_1, VoltageRange_3);
while (FLASH->SR & 0x010000);
FLASH_Lock();
Все прекрасно проходит под отладчиком. Сектор 1 стерт. Перепрошиваю, отключаю отладчик, передергиваю питание, немного выжидаю, подключаю отладчик и смотрю содержимое памяти. Сектор 1 не изменился.
В чем фишка?
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Aug 4 2017, 15:00
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



На основе бытовой телепатии: под отладчиком не срабатывают прерывания, которые нельзя использовать при записи во флеш. В релизе соответственно они ломают процесс записи.
Go to the top of the page
 
+Quote Post
tvsdig
сообщение Aug 4 2017, 17:12
Сообщение #3





Группа: Участник
Сообщений: 9
Регистрация: 24-11-16
Пользователь №: 94 344



Цитата(AVN @ Aug 4 2017, 17:46) *
Все прекрасно проходит под отладчиком.


Под отладчиком идете по шагам каждую строку или сразу всю процедуру стирания?
Попробуйте использовать флаг EOP (совместно с BSY).
Go to the top of the page
 
+Quote Post
AVN
сообщение Aug 4 2017, 17:49
Сообщение #4





Группа: Участник
Сообщений: 12
Регистрация: 21-03-05
Пользователь №: 3 556



Цитата(tvsdig @ Aug 4 2017, 20:12) *
Под отладчиком идете по шагам каждую строку или сразу всю процедуру стирания?
Попробуйте использовать флаг EOP (совместно с BSY).

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

Цитата(Kabdim @ Aug 4 2017, 18:00) *
На основе бытовой телепатии: под отладчиком не срабатывают прерывания, которые нельзя использовать при записи во флеш. В релизе соответственно они ломают процесс записи.

Естественно, все прерывания запрещены. И даже вся периферия отключена.
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение Aug 5 2017, 06:37
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Не ограничиваю никакие прерывания, просто выполняю код. У меня все нормально работает. Как под отладчиком, так и без него:
CODE
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, но, думаю, разницы не будет с другими ядрами
Go to the top of the page
 
+Quote Post
AVN
сообщение Aug 7 2017, 16:31
Сообщение #6





Группа: Участник
Сообщений: 12
Регистрация: 21-03-05
Пользователь №: 3 556



Проблема решена. Надо просто перед доступом к флэш очищать биты ошибок в FLASH->SR. Откуда они берутся - я пока не понял, но они стоят сразу при старте контроллера.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016