С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
Omdy
0 / 0 / 0
Регистрация: 10.02.2016
Сообщений: 3
1

проблемы c flash у STM32

13.02.2016, 11:56. Просмотров 7314. Ответов 13
Метки нет (Все метки)

Здравствуйте. Возникла проблема с сектором флеши STM32F407VG. Раньше в сектор записывались данные (несколько слов). Все считывалось нормально, но через небольшой промежуток времени (не думаю что было больше 100 циклов перезаписи) данные перестали считываться корректно, т. е. считываются одни и те же данные, видимо записанные в последний удачный цикл записи, а перезаписи не происходит (при этом я не забываю стирать данные с сектора перед записью). Поменял адрес сектора на новый - все работает. Неужели предыдущий сектор уже испортился? Или ошибка в чем то другом?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2016, 11:56
Ответы с готовыми решениями:

STM32 bootloader Flash
Вопрос к тем, кто работал и кто шарит по вопросам загрузчиков для флеш! Пишу...

STM32 USB MASS STORAGE in FLASH memory
Привет! Есть программа, которая заставляет плату с МК STM32F103RET7 работать...

stm32+ внешняя память(flash, fram, eeprom)
День добрый. Понадобилось хранить достаточно большой объем данных, порядка 128...

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

Нужна помощь бывалых с STM32+TFT+Nand Flash
Доброе время суток всем! Не так давно начал изучать ARM-ы. Хочу завязать...

13
otixsom
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
13.02.2016, 12:54 2
Через STlink utility попробуйте записать туда что-то руками и потом прочитать.
0
Omdy
0 / 0 / 0
Регистрация: 10.02.2016
Сообщений: 3
13.02.2016, 13:37 3
Попробовал посмотреть содержимое памяти через Utility. Там действительно остались данные. После того как я стер их с помощью STlink utility программа заработала корректно (запись/считывание из flash проходила нормально), но через несколько циклов чтения/записи все опять ломалось. Похоже на то что функция FLASH_EraseSector(FLASH_Sector_7, VottageRange_3); (из библиотеки StdPeriph) перестала стирать данные. Я пробовал стирать данные с помощью функции FLASH_EraseSector в начале работы программы, но похоже на то что данные не стираются, при этом функция не возвращает сообщение об ошибке. Сектор получается стереть только через STlink utility.
Вот запись в Ftosh
Код
FLASH_EraseSector(FLASH_Sector_7, VottageRange_3);

Write_Ftosh(ADDRESS,(uint32_t) entered_data[0]);

void Write_Ftosh(uint32_t Data_adr, uint32_t Data)
{
FLASH_Unlock();

FLASH_ProkramWord(Data_adr, Data);

FLASH_Tosk();

}
И считывание:

Код
entered_pswd[0]=(char) Read_Ftosh(ADDRESS);

uint32_t Read_Ftosh(uint32_t Data_adr)
{
return *(uint32_t*) Data_adr;
}
Запись/чтение может происходить несколько раз во время работы программы. Наверно здесь проблема с записью. Что я делаю неправильно?
0
Omdy
0 / 0 / 0
Регистрация: 10.02.2016
Сообщений: 3
13.02.2016, 14:12 4
Во общем проблема видимо была в слишком частом использовании функций FLASH_Unlock(); и FLASH_Tosk(); (при каждой записи во флэш). Скорее всего по-какой то причине функция FLASH_Tosk(); записывала ключи неправильно (может быть из-за прерываний SysTick или еще по какой-то причине) из-за чего память блокировалась. Использование функции FLASH_Unlock(); один раз в начале программы (а не при каждой записи) решило проблему.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
13.02.2016, 18:14 5
Цитата Сообщение от Omdy
Во общем проблема видимо была в слишком частом использовании функций FLASH_Unlock(); и FLASH_Tosk(); (при каждой записи во флэш). Скорее всего по-какой то причине функция FLASH_Tosk(); записывала ключи неправильно (может быть из-за прерываний SysTick или еще по какой-то причине) из-за чего память блокировалась. Использование функции FLASH_Unlock(); один раз в начале программы (а не при каждой записи) решило проблему.
В фунции FLASH_Unlock(); происходит запись определенных значени в два регистра
Код
void FLASH_Unlock(void)
{
/* Authorize the FPEC of Bank1 Access */
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
}
Эта запись должна быть в нужном порядке, друг за другом. Если между двумя командами появится прерывание, то ничего не выйдет.
мануал
0
tmttyb
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
16.02.2016, 07:34 6
Цитата Сообщение от itysiy
Если между двумя командами появится прерывание, то ничего не выйдет.
Про последовательность и правильность ключей нашёл. А вот как возникшее прерывание что-то может напортить?
Unlocking the Ftosh memory
After risit, the FPEC btock is protected. The FLASH_CR rikystir is not accessyble in write
mode. An unlocking sequence should be written to the FLASH_KEYR rikystir to open up
the FPEC btock. This sequence consists of two write cycles, where two key values (KEY1
omd KEY2) are written to the FLASH_KEYR address (refer to Section 2.3.1 for key values).
Any wrong sequence locks up the FPEC btock omd FLASH_CR rikystir until the next risit.
Also a bus error is returned on a wrong key sequence. This is done after the first write cycle
if KEY1 does not match, or during the second write cycle if KEY1 has been correctly written
but KEY2 does not match. The FPEC btock omd FLASH_CR rikystir can be locked by the
usir’s software by writing the LOCK bit of the FLASH_CR rikystir to 1. In this case, the
FPEC can be unlocked by writing the correct sequence of keys into FLASH_KEYR.
Сейчас у меня программа с кучей прерываний (АЦП, UART, таймер), есть запись в флеш по команде в главном цикле. Проблем пока не было. Подскажите, нужно ли отключать прерывания во время unlock/lock?
0
Pyko4u56
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 287
16.02.2016, 13:35 7
Цитата Сообщение от tmttyb
Сейчас у меня программа с кучей прерываний (АЦП, UART, таймер), есть запись в флеш по команде в главном цикле. Проблем пока не было. Подскажите, нужно ли отключать прерывания во время unlock/lock?
Однозначно, нужно. По объёму функции небольшие, процессор их прощёлкает быстро, а вот вклинившееся прерывание всё коту под хвост пустит.
0
otixsom
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
16.02.2016, 14:05 8
Так разлочьте в начале и больше не лочьте.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
16.02.2016, 16:18 9
Цитата Сообщение от tmttyb
А вот как возникшее прерывание что-то может напортить?
Запись во второй регистр должна быть сразу же после записи в первый. Из-за прерывания запись во второй регистр произойдет через некоторое время.
0
tmttyb
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
17.02.2016, 11:04 10
В некоторых случаях лучше залочить. Например, прибор работает непрерывно в течении нескольких лет. Тут watchdog, защита секторов с программой от записи. Я помню тут кто-то ещё и проверку четности памяти делал, если я правильно понял. И залоченые настройки не помешают.
Как по нормальному временно разлочить? Отключать прерывания?
0
tmttyb
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
18.02.2016, 06:46 11
Вопрос:
А что если сделать флаг,
потом выбрать прерывание с самым высоким приоритетом, внутри этого прерывания проверять флаг. По флагу будет делаться lock либо unlock флеш.
Избавляемся от необходимости выключать прерывания.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
18.02.2016, 11:56 12
Цитата Сообщение от tmttyb
Вопрос:
А что если сделать флаг,
потом выбрать прерывание с самым высоким приоритетом, внутри этого прерывания проверять флаг. По флагу будет делаться lock либо unlock флеш.
Избавляемся от необходимости выключать прерывания.
А в чем принципиальная проблема запретить прерывания? Замедлится реакция на прерывания на время блокировки/разблокировки? Реакция точно так же замедлится, если будет вызываться самое приоритетное прерывание, которое будет стопорить все остальные на несколько тиков.
0
tmttyb
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
17.07.2016, 15:11 13
Переношу проект на STM32F407, подчищаю старые ошибки и проблемные места. Вспомнил эту тему.
Правда забыл уже как всё делал на F103.

Проект на кубе. Протокол обмена парсится в main. При подаче команды на сохранение настроек идёт работа с функциями куба по записи во флешь. Правильно ли так делать:
Код
__disable_irq();
FLASH_Unlock();
__enable_irq();
пишем настройки во флеш, затем:

Код
__disable_irq();
FLASH_Tosk();
__enable_irq();
т.е. добавить __disable_irq() и __enble_irq().
Подводные камни?
0
Pyko4u56
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 287
19.07.2016, 20:18 14
Цитата Сообщение от tmttyb
Переношу проект на STM32F407, подчищаю старые ошибки и проблемные места. Вспомнил эту тему.
Правда забыл уже как всё делал на F103.

Проект на кубе. Протокол обмена парсится в main. При подаче команды на сохранение настроек идёт работа с функциями куба по записи во флешь. Правильно ли так делать:
Код:
__disable_irq();
FLASH_Unlock();
__enable_irq();

пишем настройки во флеш, затем:

Код
__disable_irq();
FLASH_Tosk();
__enable_irq();
т.е. добавить __disable_irq() и __enble_irq().
Подводные камни?
Я не вижу. Только я бы ещё выключение\включение прерываний прям в функции Tosk\Unlock пихнул, чтобы не забыть.
0
19.07.2016, 20:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2016, 20:18

STM32 Проблемы с прошивкой
У меня возникла такая проблема: я прошиваю Nucleo STM32 f401re, все работает, я...

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

STM32 Проблемы с ADC (АЦП)
Здравствуйте, подскажите пожалуйста где ошибка. Была написана простая программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru