Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-сен-16 19:49

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2017-мар-21 15:08 
Не в сети

Зарегистрирован: 2016-мар-26 12:46
Сообщения: 19
В проекте на ВЕ92 информационная память FLASHа работает (пишу и читаю параметры проекта) прекрасно. На ВЕ4У после записи в данную память после RESETа процессор виснет. Оживает только если выполнить Erase (меню Flash в Keil). Подскажите, пожалуйста, что делать или пример проекта!?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2017-мар-21 16:03 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 705
Откуда: г. Санкт-Петербург
В информационной памяти д.б. прошит начальный загрузчик. Поэтому при использовании этой памяти нужно позаботиться о его сохранности. Команда "Erase" в Keil его восстанавливает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2017-мар-22 07:37 
Не в сети

Зарегистрирован: 2016-мар-26 12:46
Сообщения: 19
vasili, спасибо. У меня появился следующий вопрос, адрес свободной памяти (страницы), можно ли стирать страницу или трется память (информационная) целиком? И вообще, как я могу ее использовать если в ней находится информация?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2017-мар-22 08:04 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1323
Откуда: Тула
DGW писал(а):
vasili, спасибо. У меня появился следующий вопрос, адрес свободной памяти (страницы), можно ли стирать страницу или трется память (информационная) целиком? И вообще, как я могу ее использовать если в ней находится информация?

Информационная память и представлена одной страницей. Стирание возможно только страницами. Если обязательно писать в инфо.память придётся позаботиться о сохранении загрузчика на прежнем месте (считать его, и записать обратно после стирания).
Очевидно это не самый лучший вариант. Лучше использовать страницу основной флеш.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-07 09:43 
Не в сети

Зарегистрирован: 2014-окт-10 18:12
Сообщения: 28
prostoRoman писал(а):
Информационная память и представлена одной страницей. Стирание возможно только страницами.

Но в спецификации написано, что информационная память состоит из 4-х блоков по 2048 байт, а стирать можно как блоками по 2048 байт, так и страницами по 512 байт.

Возник еще вопрос (ко всем) - стало интересно посмотреть, что там записано, а там загрузчик записан два раза подряд.
Первый:
- с адреса 0х0 до 0х544 записаны какие-то данные (видимо сам код загрузчика);
- далее с адреса 0х548 по 0x7fc пустые ячейки (0xffffffff);
- далее с адреса 0x800 (второй блок согласно спецификации) записаны одинаковые данные - в каждой ячейке почему-то записано 0xc04b5f8.

Далее начиная с адреса 0x1000 (3-й и 4-й блоки информационной памяти) зачем-то по второму разу записано все то же самое и в том же порядке, хотя по идее как раз они и напрашиваются под использование для хранения переменных данных пользователя.

Это результат деятельности файла FLM (использую из официального пака)? Код загрузчика входит в состав FLM, т.е. возможно надо сначала подправить загрузчик, а потом получить новый FLM?

UPD:
На вызове библиотечной функции EEPROM_EraseBlock(0x1800, EEPROM_Info_Bank_Select) виснет намертво, в отладчике показывает, что стерлась вообще вся ПЗУ, причем основная, а не информационная (как будто он пытался стереть 32 Кбайта, а не 2 и залез на основную память). Если пытаться стереть страницу через EEPROM_ErasePage, а потом прочитать, оказывается, что ничего не стирает вообще. Например, следующий код:
Код:
  __disable_irq();
  EEPROM_ErasePage(0x0a00, EEPROM_Info_Bank_Select);
  __enable_irq();

Потом чтение в цикле в диапазоне от 0x0a00 до 0x0bfc дает один и тот же результат 0xc04b5f8.


Последний раз редактировалось _Desh_ 2019-июн-07 14:05, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-07 13:58 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1323
Откуда: Тула
_Desh_ писал(а):
prostoRoman писал(а):
Информационная память и представлена одной страницей. Стирание возможно только страницами.

Но в спецификации написано, что информационная память состоит из 4-х блоков по 2048 байт, а стирать можно как блоками по 2048 байт, так и страницами по 512 байт.

Вероятно спецификация 2017 года отличается от СП 2019 года.

_Desh_ писал(а):
На вызове библиотечной функции EEPROM_EraseBlock(0x1800, EEPROM_Info_Bank_Select) виснет намертво...

Проверьте, что код, данные и т.п. ф-ции EEPROM_EraseBlock располагается в ОЗУ.
Проверьте, правильно ли у вас указана тактовая частота в config.h стандартной библиотеки.
Код:
#define FLASH_PROG_FREQ_MHZ     (64.0)

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-07 15:08 
Не в сети

Зарегистрирован: 2014-окт-10 18:12
Сообщения: 28
prostoRoman писал(а):
Проверьте...

Да проверил сразу же, файл MDR32F9x_eeprom.c целиком в ОЗУ через настройки Кейла, частота в конфиге что 8.0 (по умолчанию), что 32.0 (настоящая), на работоспособность никак не повлияла, задержка обращения к Flash выставлена в соответствии со спецификацией (1 при частоте ядра свыше 18 МГц).

Зато в примерах на гитхабе (https://github.com/StartMilandr/MDR_Pac ... _StoreData) вон чего нашел:
Цитата:
Стирание по страницам полностью работает только с основной памятью! Стирание страниц информационной памяти проходит успешно только для 1-го блока. (Память EEPROM для этих МК поделена на 4 блока по 64 страницы). Стирание страниц в остальных блоках заканчивается неудачей. Либо неправильно написана функция стирания (хоть все и сделано по спецификации), либо это аппаратная особенность.

А у меня даже и с первым блоком стирание страниц не работает. Или в спецификации написана явная лажа про страницы. Остается загадкой, как же тогда FLM вообще отрабатывает команду Erase в Кейле, когда прописывает туда загрузчик.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-07 15:41 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1323
Откуда: Тула
_Desh_ писал(а):
Остается загадкой, как же тогда FLM вообще отрабатывает команду Erase в Кейле, когда прописывает туда загрузчик.

Помнится в репозиториях StartMilandr есть FLM в исходниках, это не штатные FLM, но можно глянуть.
Keil (оригинальный FLM) возможно трёт вообще всю память специальным битиком, как у ВЕ9х и ВЕ1.
Возможно на форуме есть исходники от оригинального FLM...

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-07 16:48 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 705
Откуда: г. Санкт-Петербург
Код для стирания инф. памяти для HCLK 8Mгц. Должен исполняться из SRAM
Предварительно д.б. включено тактирование EEPROM:
MDR_RST_CLK->PER2_CLOCK |= 1<<3;
Открыть
Код:
__asm void sleep(int id)
{
             lsls r0,#1
sleepn
             subs         r0,#1
             bne         sleepn
            bx   lr
}

void Erase(void)
{
   MDR_EEPROM->KEY = 0x8AAA5551;
   MDR_EEPROM->CMD |= EEPROM_CMD_CON;
   sleep(10);
   MDR_EEPROM->CMD |= EEPROM_CMD_IFREN;
   MDR_EEPROM->ADR = 0;
   MDR_EEPROM->CMD &= ~(EEPROM_CMD_XE|EEPROM_CMD_YE|EEPROM_CMD_SE|EEPROM_CMD_MAS1|EEPROM_CMD_ERASE|EEPROM_CMD_NVSTR);
   MDR_EEPROM->CMD |= EEPROM_CMD_XE|EEPROM_CMD_MAS1|EEPROM_CMD_ERASE;
   sleep(11);// 11us
   MDR_EEPROM->CMD |= EEPROM_CMD_NVSTR;
   sleep(50000);// 50ms
   MDR_EEPROM->CMD &= ~EEPROM_CMD_ERASE;
   sleep(110);// 110us
   MDR_EEPROM->CMD &= ~(EEPROM_CMD_XE|EEPROM_CMD_MAS1|EEPROM_CMD_NVSTR);
   sleep(2);// 2us
   MDR_EEPROM->CMD &= ~(EEPROM_CMD_CON|EEPROM_CMD_IFREN);
}
Закрыть


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-07 18:52 
Не в сети

Зарегистрирован: 2014-окт-10 18:12
Сообщения: 28
Итог дня. В новом FLM операция EraseAll происходит путем стирания блоков максимального размера и в основной, и в информационной памяти, после чего в информационную память в зависимости от значения бита FPOR в регистре BKP_REG_0E пишется код загрузчика. Судя по тому, что результат чтения информационной памяти и с оригинальным, и с новым FLM после полного стирания памяти одинаков, и загрузчики, и процедуры их записи идентичны.

Но почему-то загрузчик записан два раза (в 1-м и 3-м блоке, остальные блоки забиты непонятным мусором), а при попытке стереть блок информационной памяти целиком, стирается одновременно и блок основной памяти с таким же адресом, из-за чего программа зависает. Т.е. получается, что бит IFREN не выбирает либо одну память, либо другую, а выбирает обе.

Вывод - в контроллере ВЕ4 информационная память предназначена для хранения кода загрузчика, и более ни для чего не пригодна.

И это не описано ни в спецификации, ни в errata. И это нехорошо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-10 09:07 
Не в сети

Зарегистрирован: 2014-окт-10 18:12
Сообщения: 28
В связи с обнаруженными особенностями ВЕ4, посоветуйте, пожалуйста - как правильно организовать хранение переменных данных в основной памяти? Если исходить из предположения, что программа пользователя будет размещена с начала памяти, т.е. с младших адресов, и я выделю под переменные данные последний блок памяти (или страницу, раз в примерах написано, что стирание страниц основной памяти работает правильно). То получится, что при включенной опции Erase Full Chip в Кейле, он будет затираться при каждой перепрошивке и нужно будет постоянно восстанавливать переменные данные, что неудобно.

Может в таком случае искусственно ограничить доступный Кейлу объем ПЗУ (модифицировав FLM и указав ему размер ПЗУ не 0х20000, а 0х10000), тогда старшие блоки (страницы) памяти стираться при программировании не будут?


Последний раз редактировалось _Desh_ 2019-июн-10 10:33, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-10 10:27 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 413
Откуда: ПКК "Миландр"
_Desh_ писал(а):
Может в таком случае искусственно ограничить доступный Кейлу объем ПЗУ (модифицировав FLM и указав ему размер ПЗУ не 0х20000, а 0х10000), тогда старшие блоки (страницы) памяти стираться при программировании не будут?

https://www.keil.com/pack/doc/CMSIS/Pac ... mFunc.html

Keil при выставленной галочке EraseAll вызовет функцию EraseChip которая реализована в FLM. Соответственно сотрется все. Какой бы объем памяти не был установлен в настройках проекта. Можно написать свою модификацию FLM, которая вместо стирания всего чипа в EraseChip, будет стирать только заданные начальные страницы.

Если галочка EraseAll не выставлена, то уменьшение памяти в настройке проекта сработает. Кейл смотрит размер программы и стирает страницы только под нее. Причем если страница уже стерта, то Кейл не вызывает EraseSector для этой страницы, сохраняя ресурс памяти.

Поэтому хранить данные в последней странице вполне здравое решение. Доступ к данным обычный, данные доступны всегда. Не надо как с инфо памятью обращаться за ними по регистровому доступу из ОЗУ.

_Desh_ писал(а):
Вывод - в контроллере ВЕ4 информационная память предназначена для хранения кода загрузчика, и более ни для чего не пригодна.

По этому поводу перепроверим работу и внесем в errata.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-10 11:11 
Не в сети

Зарегистрирован: 2014-окт-10 18:12
Сообщения: 28
Пока попробую обойтись настройками проекта. Если окажется неудобно, буду делать FLM, благо рабочий пример есть на гитхабе. Благодарю за ответы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Информационная память FLASHа ВЕ4У
СообщениеДобавлено: 2019-июн-17 13:18 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1323
Откуда: Тула
_Desh_ писал(а):
UPD:
На вызове библиотечной функции EEPROM_EraseBlock(0x1800, EEPROM_Info_Bank_Select) виснет намертво, в отладчике показывает, что стерлась вообще вся ПЗУ, причем основная, а не информационная (как будто он пытался стереть 32 Кбайта, а не 2 и залез на основную память). Если пытаться стереть страницу через EEPROM_ErasePage, а потом прочитать, оказывается, что ничего не стирает вообще. Например, следующий код:
Код:
  __disable_irq();
  EEPROM_ErasePage(0x0a00, EEPROM_Info_Bank_Select);
  __enable_irq();

Потом чтение в цикле в диапазоне от 0x0a00 до 0x0bfc дает один и тот же результат 0xc04b5f8.


Вот на что наткнулся в новой (1.51) версии библиотеки:
Код:
@@ -230,66 +211,62 @@ __RAMFUNC void EEPROM_ErasePage(uint32_t Address, uint32_t BankSelector)
   Command |= (BankSelector == EEPROM_Info_Bank_Select) ? EEPROM_CMD_IFREN : 0;
   MDR_EEPROM->CMD = Command;

-  for (Offset = 0; Offset < (4 << 2); Offset += 4)
-  {
-    MDR_EEPROM->ADR = Address + Offset;             /* Page Address */
-    MDR_EEPROM->DI = 0;
-    Command |= EEPROM_CMD_XE | EEPROM_CMD_ERASE;
-    MDR_EEPROM->CMD = Command;
-    ProgramDelay(GET_US_LOOPS(5));              /* Wait for 5 us */
-    Command |= EEPROM_CMD_NVSTR;
-    MDR_EEPROM->CMD = Command;
-    ProgramDelay(GET_US_LOOPS(40000));          /* Wait for 40 ms */
-    Command &= ~EEPROM_CMD_ERASE;
-    MDR_EEPROM->CMD = Command;
-    ProgramDelay(GET_US_LOOPS(5));              /* Wait for 5 us */
-    Command &= ~(EEPROM_CMD_XE | EEPROM_CMD_NVSTR);
-    MDR_EEPROM->CMD = Command;
-    ProgramDelay(GET_US_LOOPS(1));              /* Wait for 1 us */
-  }
+  MDR_EEPROM->ADR = Address;                  /* Page Address */
+  MDR_EEPROM->DI = 0;
+  Command |= EEPROM_CMD_XE | EEPROM_CMD_ERASE;
+  MDR_EEPROM->CMD = Command;
+  ProgramDelay(GET_US_LOOPS(10));              /* Wait for 10 us */
+  Command |= EEPROM_CMD_NVSTR;
+  MDR_EEPROM->CMD = Command;
+  ProgramDelay(GET_US_LOOPS(40000));          /* Wait for 40 ms */
+  Command &= ~EEPROM_CMD_ERASE;
+  MDR_EEPROM->CMD = Command;
+  ProgramDelay(GET_US_LOOPS(5));              /* Wait for 5 us */
+  Command &= ~(EEPROM_CMD_XE | EEPROM_CMD_NVSTR);
+  MDR_EEPROM->CMD = Command;
+  ProgramDelay(GET_US_LOOPS(1));              /* Wait for 1 us */
+
   Command &= EEPROM_CMD_DELAY_Msk;
   MDR_EEPROM->CMD = Command;
   MDR_EEPROM->KEY = 0;
}

/**
-  * @brief  Erases all pages of the selected EEPROM memory bank.
+  * @brief  Erases one block of the selected EEPROM memory bank.
+  * @param  Address: Block Address in the EEPROM memory.
   * @param  BankSelector: Selects EEPROM Bank (Main Bank or Information Bank).
   *         This parameter can be one of the following values:
   *           @arg EEPROM_Main_Bank_Select:      The EEPROM Main Bank selector.
-  *           @arg EEPROM_All_Banks_Select:      The EEPROM All Banks selector.
+  *           @arg EEPROM_Info_Bank_Select:      The EEPROM Information Bank selector.
   * @retval None
   */
-__RAMFUNC void EEPROM_EraseAllPages(uint32_t BankSelector)
+__RAMFUNC void EEPROM_EraseBlock(uint32_t Address, uint32_t BankSelector)
{
   uint32_t Command;
-  uint32_t Offset;

-  assert_param(IS_EEPROM_ERASE_SELECTOR(BankSelector));
+  assert_param(IS_EEPROM_BANK_SELECTOR(BankSelector));

   MDR_EEPROM->KEY = EEPROM_REG_ACCESS_KEY;
   Command = (MDR_EEPROM->CMD & EEPROM_CMD_DELAY_Msk) | EEPROM_CMD_CON;
-  Command |= (BankSelector == EEPROM_All_Banks_Select) ? EEPROM_CMD_IFREN : 0;
+  Command |= (BankSelector == EEPROM_Info_Bank_Select) ? EEPROM_CMD_IFREN : 0;

   MDR_EEPROM->CMD = Command;
................
Вдруг поможет...

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB