Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2, 3 Все  След.
Автор Сообщение
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2017-июн-20 08:59 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
С внешней шиной не работаю.
Прописал Ваши данные по всем адресам внутренней PROGRAM RAM 1986ве81т, ошибок нет.
Может быть какой нибудь сбой в работе контролера внешней шины в вашем экземпляре МК.
Обратитесь в службу техподдержки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2017-июн-21 09:08 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
В результате отработки ПО обнаружил:
Для выполнения программы из внутренней PROGRAM RAM (1986ве81т) биты 9-13 регистра OTP->CNTR д.б. установлены в "1", в отличие от 1986ве8т.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2017-июн-21 17:21 
Не в сети
Аватара пользователя

Зарегистрирован: 2015-июн-16 11:58
Сообщения: 10
Откуда: АО "ПКК Миландр"
vasili писал(а):
В результате отработки ПО обнаружил:
Для выполнения программы из внутренней PROGRAM RAM (1986ве81т) биты 9-13 регистра OTP->CNTR д.б. установлены в "1", в отличие от 1986ве8т.


Для выполнения программы требуется вернуть их в состояние до записи.
В спецификации для ВЕ8Т эти биты зарезервированы(на самом деле не оказывают никакого влияния). Для ВЕ81Т описаны как WEn[4:0] на банки памяти. Не маскируются битом разрешения регистрового доступа. Соответственно для чтения необходимо вернуть в значение по сбросу - 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2017-ноя-08 11:43 
Не в сети

Зарегистрирован: 2017-ноя-02 12:37
Сообщения: 18
Помогите разобраться с записью в RAM ВЕ81Т. Судя по описанию на OTP, память разделена на четыре блока по 8192 40-разрядных слова (32+8). При выполнении программы из области OTP/RAM, осуществляется одновременная выборка из всех четырех банков. Соответственно, при записи программы в OTP/RAM для последующего корректного выполнения программы необходимо распределять слова между блоками следующим образом:
блок 0: 0x0, 0x10, 0x20...
блок 1: 0x4, 0x14, 0x24...
блок 2: 0x8, 0x18, 0x28...
блок 3: 0xС, 0x1C, 0x2C...
Это верно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2017-ноя-08 18:26 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
Lab221 писал(а):
Помогите разобраться с записью в RAM ВЕ81Т. Судя по описанию на OTP, память разделена на четыре блока по 8192 40-разрядных слова (32+8). При выполнении программы из области OTP/RAM, осуществляется одновременная выборка из всех четырех банков. Соответственно, при записи программы в OTP/RAM для последующего корректного выполнения программы необходимо распределять слова между блоками следующим образом:
блок 0: 0x0, 0x10, 0x20...
блок 1: 0x4, 0x14, 0x24...
блок 2: 0x8, 0x18, 0x28...
блок 3: 0xС, 0x1C, 0x2C...
Это верно?

Да.
При записи OTP/RAM рекомендуется использовать функцию, выполняемую из SRAM:
viewtopic.php?f=47&t=3674&start=0#p20915


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-21 11:32 
Не в сети

Зарегистрирован: 2019-янв-21 10:56
Сообщения: 6
Здравствуйте! Работаю с 1986ВЕ81Т, пытаюсь наладить взаимодействие с ОЗУ памяти программ. Получаю HardFault при выполнении memcpy() на инструкции "LDM r1!,{r3}" (копирование из памяти в регистр). Обращаюсь к ячейкам, начиная с адреса R1=0x01000000. Исключение может возникнуть как при первом прохождении инструкции LDM, так и на последующих.

Основных версии причины у меня две:
1) Где-то нужно что-то "включить", например, подать тактовый сигнал. Но в документации я ни слова об этом не увидел.
2) Исключение возникает из-за ошибки ECC. Да, контроллер можно настроить на прерывание в случае обнаружения ошибки ЕСС. Но это обычное маскируемое прерывание, не HardFault.
Функция записи в память программ реализована, но проверить я ее не могу из-за описанного сбоя. Предварительная инициализация содержимого ОЗУ памяти программ изменений в поведении не дает.
Уже массу вариантов перепробовал. Ткните носом, пожалуйста, в каком направлении копать!

Код. Сбой при достижении ячейки 0x01000010.
Код:
int main(void)
{
   uint32_t pram_address = 0x01000000;
   uint8_t buf[1024];
   memcpy(buf,(void*)pram_address,256);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-21 16:59 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 448
Откуда: ПКК "Миландр"
Все ошибки, возникающие в блоках, вызывают возникновение EVENT-ов в блоке FT_CNTR и при активации в нем прерываний - выработку соответствующих прерываний с обработчиками.
Исключение составляет обращение в неинициализированную область кода ОТР (ВЕ8) или СОЗУ(ВЕ81) . При этом возникает отказ шины, поскольку контроллер ЕСС не может вернуть неправильные данные, но и двойную ошибку он починить не может. В результате происходит выход в HardFault, либо в Bus_Fault если он активирован.

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


Вложения:
Комментарий к файлу: FLM для СОЗУ 1986ВЕ81
1986BE81_SRAM.zip [4.93 КБ]
Скачиваний: 61

_________________
Отдел технической поддержки support@milandr.ru
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-21 17:04 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
Могу сформировать тестовый проект (прочитать память и поморгать светодиодом выполняя код из 0x01000000) предварительно загрузив код в режиме загрузки UART0+JA, если пришлете схему платы или сообщите номер вывода со светодиодом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-22 07:46 
Не в сети

Зарегистрирован: 2019-янв-21 10:56
Сообщения: 6
Vasiliy, спасибо за подсказку! С FLM-ом работает. Судя по всему, проблема в некорректной записи памяти программ.
Вы не могли бы выслать исходники этого FLM?
vasili писал(а):
Могу сформировать тестовый проект (прочитать память и поморгать светодиодом выполняя код из 0x01000000) предварительно загрузив код в режиме загрузки UART0+JA, если пришлете схему платы или сообщите номер вывода со светодиодом.
Спасибо, если не трудно. Я использую отладочный комплект - индикация на PC16-PC23. Меня интересует вопрос программирования: может ли встроенный UART-загрузчик писать напрямую в память программ?
Цитата:
6.4.11 Режим UART0+JA
....
Данный режимы предоставляет достаточный набор операций, необходимых для записи
в ОЗУ какой-либо программы (в частности программатора Flash-памяти), верификации ее и
запуска на выполнение. .... Помимо доступа к ОЗУ может быть осуществлен доступ и к другим адресным
диапазонам.
:roll: Как это понять? Вроде бы речь идет о загрузке бутлоадера в ОЗУ, но остается доступ ко всем остальным блокам, в том числе, и к памяти программ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-22 08:45 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 448
Откуда: ПКК "Миландр"
bseyur писал(а):
Вы не могли бы выслать исходники этого FLM?

вероятно то, что во вложении.

bseyur писал(а):
Как это понять?

В обычное ОЗУ, не то что СОЗУ (ОТР), загружается программа по UART и исполняется.
Загрузку данных по UART осуществляет начальный загрузчик, и после получения команды R исполнение переходит на указанный адрес - запуск загруженной программы.


Вложения:
Комментарий к файлу: 1986BE81_FLM_RAM
81_FLMsrc.zip [12.6 КБ]
Скачиваний: 66

_________________
Отдел технической поддержки support@milandr.ru
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-22 11:57 
Не в сети

Зарегистрирован: 2019-янв-21 10:56
Сообщения: 6
Ясно, благодарю за помощь! :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-22 18:04 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
Тестовый пример с утилитой загрузки OTPRAM


Вложения:
tst_ram_otp.rar [624.85 КБ]
Скачиваний: 76
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-23 07:43 
Не в сети

Зарегистрирован: 2019-янв-21 10:56
Сообщения: 6
Огромное спасибо! Полезная утилита! :) Один вопрос. Проект prog25256 походит на код начального загрузчика. В каком случае он используется?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-янв-23 10:36 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 712
Откуда: г. Санкт-Петербург
prog25256 - загрузчик ОТPRAM памяти для 1986ве81т, его код загружается в режиме загрузки UARTO+JA после чего ему передается управление.
Также в наших отладочных устройствах устанавливается внешняя EEPROM AT25256.
При этом загрузчик prog25256 позволяет совместно с утилитой сохранять программу в AT25256, после чего можно стартовать в режиме SPI3+JA.
Дополнительно требуется один раз прописать "загрузчик по SPI" в начальную область AT25256 (для этого имеется специальная программка).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: RAM вместо OTP
СообщениеДобавлено: 2019-фев-22 05:54 
Не в сети

Зарегистрирован: 2019-янв-21 10:56
Сообщения: 6
Продолжаю знакомство с 1986ВЕ81Т. Возник затык(
Загрузил исполняемый код для МК во внешнюю память и даю возможность встроенному загрузчику скопировать его в ОЗУ, установив режим запуска SPI2+JB. Код копируется по адресу 0x20000000. При копировании кода ошибок нет, но его выполнение никак не хочет стартовать.

Если после загрузки кода вручную установить PC на точку входа, то все норм. Но сам загрузчик не может сделать переход.
Точку входа в мою программу указал в информационном заголовке, который считывается при загрузке по SPI. Я пробовал туда сохранять указатель на функцию или тот же указатель с "нулем" в младшем разряде - ничего не меняется.

Фактически проц находится в вечном цикле по адресу 0x2e8 - это внутренний обработчик NMI. Полез искать, как он туда попадает. Оказывается, загрузчик читает ячейку 0x20000000, где находится указатель на вершину стека моего кода и пытается передать управление туда:
Код:
        ....
        0xfb6: 0xf7ff 0xfe6f  BL        0xc98
        0xfba: 0x2120         MOVS      R1, #32                 ; 0x20
        0xfbc: 0x0609         LSLS      R1, R1, #24             ; 0x20000000 -> R1
        0xfbe: 0x6808         LDR       R0, [R1]                ; [0x20000000] -> R0
        0xfc0: 0x4700         BX        R0                     ; ???

В принципе ничто не мешает поместить указатель на точку входа по нужному адресу, но хотелось бы прозрачности, почему встроенный загрузчик так делает?
Кто-нибудь сталкивался с подобным? Как ситуацию можно еще продиагностировать?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2, 3 Все  След.

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


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

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


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

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