Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 285 сообщений ]  На страницу « 115 16 17 18 19 »
Автор Сообщение
СообщениеДобавлено: 2021-сен-10 12:07 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Vladimir_K писал(а): *
Открыть Еще раз добрый день.
Andrey.Microteh писал(а): *
Andrey.Microteh писал(а): *
Добрый день.
Возник еще один вопрос.
Хотелось бы получить описание (если такое существует) по методике перезаписи флэш (аналог STM In-Application Programming).
Это позволит реализовать механизм дистанционного обновления прошивки.
Еще раз добрый день.
Так и не получил ответа на заданный вопрос.
Нашел у Вас на форуме тему "Утилиты для прошивки Flash МК 1986 через UART", принципы стали более-менее понятны, но нужны детали.
Хотелось бы получить разъяснения по регистрам EEPROM и порядку работы с ними именно для этого контроллера.
В текущем даташите (версия 0.8.0 от 20.08.21) какое-либо описание работы с регистрами EEPROM отсутствует, в SPL ни примеров, ни драйверов.
Выложите пожалуйста описание и по возможности пример, каким образом читать/писать/стирать сектор Flash.
UPD: Дополнительно сразу возникает вопрос: возможно ли стирание меньше, чем сектор? Какая-то постраничная организация Flash присутствует?
Закрыть
Здравствуйте!

После установки "Software pack для Keil MDK 5 для МК 1986ВК01", который можно скачать с сайта компании, в директории с распакованными файлами пака в папке "Flash\MDR1986VK01\Source" находятся исходные файлы FLM-файла. Также в этой директории в папке "Test_Flash" расположен пример использования функций для работы с Flash-памятью МК. Пример "Test_Flash" собран под предыдущую версию пака, поэтому, чтобы не возникло сложностей, во вложении выкладываю обновлённый вариант для текущей версии пака.

Посмотрите, пожалуйста, данный пример, он поможет разобраться с работой контроллера Flash-памяти.

В МК 1986ВК018, в отличии от МК 1986ВЕ9х/1Т/3Т, используется новый контроллер Flash-памяти, имеющий в составе блоки памяти для хранения ECC и поддерживающий защищённые области. Информация о контроллере Flash-памяти приведена в спецификации в разделе "7.3 Организация FLASH памяти". Так как ОКР по разработке данного МК ещё идёт, то в дальнейшем в спецификации будут подробно описаны алгоритмы выполнения всех доступных операций чтения/записи/стирания. Сейчас в спецификации для выполнения всех операций приведены только временные диаграммы с указанием времён. Для выполнения требуемой операции необходимо реализовать соответствующую диаграмму, переключая состояния сигналов в регистрах контроллера Flash-памяти. Ознакомится с готовой реализацией операций доступа к Flash-памяти Вы можете в исходных файлах FLM.

Структурно Flash-память состоит из 4-х банков данных и 2 банков ECC, каждый банк имеет объём 64K * 32 бита (256 Кбайт). Для стирания доступна страница объёмом 16 Кбайт (при стирании сразу во всех 4 банках данных). Обратите, пожалуйста, внимание, что данные, хранящиеся в 1 странице 4 основных банков, занимают только половину страницы 2 банков ECC. Так как минимальной единицей стирания является страница, то при стирании 1 страницы 2 банков ECC требуется стереть 2 страницы 4 банков данных. Данная особенность учитывается в функции "EraseSector()", где стирается 2 страницы 4 банков данных и 1 страница 2 банков ECC. В связи с этим в проекте размер страницы также указан 0x8000 (32 Кбайта).
Спасибо за ответ.
Начал разбираться с проектом - наткнулся на неоднозначность в документации.
Спецификация 0.8.0, страница 398, таблица 71. По смещению 100,110,120 указаны регистры REG_60_TMRx.
Далее по тексту на странице 401 для этого смещения имя регистров REG_60_SYS.
В проекте Keil опять-таки имя REG_60_TMRx.
Возвращаемся к спецификации. Страница 401. В первой таблице бит DISABLE_JTAG указан 15, ниже в описании он в 8 бите.
Кто-то неправ...


Вернуться к началу
СообщениеДобавлено: 2021-сен-15 10:43 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Добрый день.
Планируется ли портирование и подключение LwIP на Ваш контроллер?


Вернуться к началу
СообщениеДобавлено: 2021-сен-16 10:42 
Не в сети
Support

Зарегистрирован: 2020-мар-17 09:52
Сообщения: 16
Организация: АО ПКК Миландр
Andrey.Microteh писал(а): *
Начал разбираться с проектом - наткнулся на неоднозначность в документации.
Спецификация 0.8.0, страница 398, таблица 71. По смещению 100,110,120 указаны регистры REG_60_TMRx.
Далее по тексту на странице 401 для этого смещения имя регистров REG_60_SYS.
В проекте Keil опять-таки имя REG_60_TMRx.
Возвращаемся к спецификации. Страница 401. В первой таблице бит DISABLE_JTAG указан 15, ниже в описании он в 8 бите.
Кто-то неправ...
Здравствуйте.

Спасибо за найденные ошибки и недочеты. Соответствующие задачи на корректировку спецификации и файлов поддержки МК поставлены.
Регистры будут переименованы в xxx_SYS, xxx_PWR и xxx_CLK, как в названиях пунктов 19.11.4-19.11.7. Бит DISABLE_JTAG имеет сдвиг 8 - таблицы регистров блока BKP также будут скорректированы.
В SPL для микроконтроллера названия регистров будут скорректированы.

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


Вернуться к началу
СообщениеДобавлено: 2021-сен-16 13:56 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Еще одна проблема, на сей раз моя собственная.
Пытаюсь разобраться с расчетом ecc.
Перенес из Вашего проекта 1986VK01 в свой на Iar код по чтению и проверке флэш: функции Init, ecc, Verify.
Объявил во флэш буфер:
#pragma location = 0x101f100
const unsigned char Buf[32] = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};

Пытаюсь выполнить Verify:
//------------------------------------------------------------------------------
__ramfunc void testFlash(void)
{
unsigned char TestBuf[64];
memset(TestBuf,0x55,32);
Init();
Verify(0x1f100,32,TestBuf);
UnInit();
}

Расчет ecc из Вашего проекта:
__ramfunc unsigned char ecc(unsigned long addr, unsigned long data)
{
unsigned int r=0;

r ^= (((addr>>0)&0x01010101)*0xFF)&0x91C86432;
r ^= (((addr>>1)&0x01010101)*0xFF)&0xA1D06834;
r ^= (((addr>>2)&0x01010101)*0xFF)&0xC1E07038;
r ^= (((addr>>3)&0x01010101)*0xFF)&0x9E4FA7D3;
r ^= (((addr>>4)&0x01010101)*0xFF)&0xA251A854;
r ^= (((addr>>5)&0x01010101)*0xFF)&0xC261B058;
r ^= (((addr>>6)&0x01010101)*0xFF)&0xC4623198;
r ^= (((addr>>7)&0x01010101)*0xFF)&0xA4522994;
r ^= (((data>>0)&0x01010101)*0xFF)&0x198C4623;
r ^= (((data>>1)&0x01010101)*0xFF)&0x1A0D8643;
r ^= (((data>>2)&0x01010101)*0xFF)&0x1C0E0783;
r ^= (((data>>3)&0x01010101)*0xFF)&0xE9F47A3D;
r ^= (((data>>4)&0x01010101)*0xFF)&0x2A158A45;
r ^= (((data>>5)&0x01010101)*0xFF)&0x2C160B85;
r ^= (((data>>6)&0x01010101)*0xFF)&0x4C261389;
r ^= (((data>>7)&0x01010101)*0xFF)&0x4A259249;
r ^= r>>16;
r ^= r>>8;

return r&0xFF;
}

Вываливаюсь из Verify с ошибкой при проверке ecc. Получаю для TestBuf e0=0x2119F2CA, e1=0x754DA69E.
При чтении из регистров получаю RDATA[0..3] = 0x55555555, RECC0=0xB088635B, RECC1=0xE4DC370F.

Подскажите пожалуйста, где я ошибаюсь?


Вернуться к началу
СообщениеДобавлено: 2021-сен-16 21:20 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 344
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
Подскажите, пожалуйста, на отладочном комплекте данный МК припаян к плате или вставлен в ZIF-панельку? А есть ли таковые панельки под данный корпус? Если да, то как они называются, и где их можно купить?


Вернуться к началу
СообщениеДобавлено: 2021-сен-17 09:37 
Не в сети
Support

Зарегистрирован: 2017-фев-14 11:21
Сообщения: 227
Организация: АО ПКК Миландр
Откуда: АО "ПКК Миландр"
Professor Chaos писал(а): *
Подскажите, пожалуйста, на отладочном комплекте данный МК припаян к плате или вставлен в ZIF-панельку? А есть ли таковые панельки под данный корпус? Если да, то как они называются, и где их можно купить?
Здравствуйте!

Микроконтроллер К1986ВК018 припаян к отладочной плате.

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


Вернуться к началу
СообщениеДобавлено: 2021-сен-23 15:28 
Не в сети
Support

Зарегистрирован: 2017-фев-14 11:21
Сообщения: 227
Организация: АО ПКК Миландр
Откуда: АО "ПКК Миландр"
Andrey.Microteh писал(а): *
Добрый день.
Планируется ли портирование и подключение LwIP на Ваш контроллер?
Здравствуйте, Андрей!

Задача запланирована. Ориентировочный срок выполнения - вторая половина октября 2021.

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


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 09:57 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Ekaterina писал(а): *
Andrey.Microteh писал(а): *
Добрый день.
Планируется ли портирование и подключение LwIP на Ваш контроллер?
Здравствуйте, Андрей!

Задача запланирована. Ориентировочный срок выполнения - вторая половина октября 2021.
Спасибо за информацию. Будем ждать с нетерпением.


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 11:35 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Вопрос по переходу на адрес приложения:
Работаю из флэш, текущее приложение лежит в диапазоне 0x01000000-0x01007FFF.
Загрузил я свое приложение во флэш в диапазон 0x01008000-0x010FFFFF.
Теперь нужно из текущего приложения перейти на загруженное.
По идее должно выглядеть примерно так:
typedef void(*pHandler)(void);
void GoToNewApp(uint32_t NewAppAddr)
{
SysTick->CTRL = 0x0;
__disable_irq();
SCB->VTOR = NewAppAddr;
register pHandler ResetHandlerPfunc = (pHandler)(*(volatile uint32_t*)(NewAppAddr+4));
__set_MSP(*(uint32_t*)NewAppAddr);
ResetHandlerPfunc();
}
Выполняю переход GoToNewApp(0x01008000) - и тишина.
Загруженное приложение не запускается.
Такое ощущение, что надо сделать что-то ещё.
I need help!


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 13:00 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 448
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Andrey.Microteh писал(а): *
Вопрос по переходу на адрес приложения:
Работаю из флэш, текущее приложение лежит в диапазоне 0x01000000-0x01007FFF.
Загрузил я свое приложение во флэш в диапазон 0x01008000-0x010FFFFF.
Теперь нужно из текущего приложения перейти на загруженное.
По идее должно выглядеть примерно так:
typedef void(*pHandler)(void);
void GoToNewApp(uint32_t NewAppAddr)
{
SysTick->CTRL = 0x0;
__disable_irq();
SCB->VTOR = NewAppAddr;
register pHandler ResetHandlerPfunc = (pHandler)(*(volatile uint32_t*)(NewAppAddr+4));
__set_MSP(*(uint32_t*)NewAppAddr);
ResetHandlerPfunc();
}
Выполняю переход GoToNewApp(0x01008000) - и тишина.
Загруженное приложение не запускается.
Такое ощущение, что надо сделать что-то ещё.
I need help!
Здравствуйте!

Подскажите, пожалуйста, производится ли в режиме отладки мониторинг изменения регистров ядра? Попробуйте самостоятельно перенести адрес Reset_Handler в регистр ядра R15(PC) и проверьте, запустится ли Ваше приложение. Спасибо.

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


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 13:10 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Lampadov писал(а): *
Andrey.Microteh писал(а): *
Вопрос по переходу на адрес приложения:
Работаю из флэш, текущее приложение лежит в диапазоне 0x01000000-0x01007FFF.
Загрузил я свое приложение во флэш в диапазон 0x01008000-0x010FFFFF.
Теперь нужно из текущего приложения перейти на загруженное.
По идее должно выглядеть примерно так:
typedef void(*pHandler)(void);
void GoToNewApp(uint32_t NewAppAddr)
{
SysTick->CTRL = 0x0;
__disable_irq();
SCB->VTOR = NewAppAddr;
register pHandler ResetHandlerPfunc = (pHandler)(*(volatile uint32_t*)(NewAppAddr+4));
__set_MSP(*(uint32_t*)NewAppAddr);
ResetHandlerPfunc();
}
Выполняю переход GoToNewApp(0x01008000) - и тишина.
Загруженное приложение не запускается.
Такое ощущение, что надо сделать что-то ещё.
I need help!
Здравствуйте!

Подскажите, пожалуйста, производится ли в режиме отладки мониторинг изменения регистров ядра? Попробуйте самостоятельно перенести адрес Reset_Handler в регистр ядра R15(PC) и проверьте, запустится ли Ваше приложение. Спасибо.
Попробовал переставить Reset Handler вручную на этот адрес - не помогает. После этого отладчик не видит процессора. Приходится перезапускать по питанию.
Вложение:
IMG_20210924_130508.jpg [267.92 КБ]
0 скачиваний
Не могли бы Вы дать тестовый пример с подобным переходом?


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 18:46 
Не в сети
Support
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 448
Организация: АО «ПКК Миландр»
Откуда: Зеленоград
Andrey.Microteh писал(а): *
Lampadov писал(а): *
Andrey.Microteh писал(а): *
Вопрос по переходу на адрес приложения:
Работаю из флэш, текущее приложение лежит в диапазоне 0x01000000-0x01007FFF.
Загрузил я свое приложение во флэш в диапазон 0x01008000-0x010FFFFF.
Теперь нужно из текущего приложения перейти на загруженное.
По идее должно выглядеть примерно так:
typedef void(*pHandler)(void);
void GoToNewApp(uint32_t NewAppAddr)
{
SysTick->CTRL = 0x0;
__disable_irq();
SCB->VTOR = NewAppAddr;
register pHandler ResetHandlerPfunc = (pHandler)(*(volatile uint32_t*)(NewAppAddr+4));
__set_MSP(*(uint32_t*)NewAppAddr);
ResetHandlerPfunc();
}
Выполняю переход GoToNewApp(0x01008000) - и тишина.
Загруженное приложение не запускается.
Такое ощущение, что надо сделать что-то ещё.
I need help!
Здравствуйте!

Подскажите, пожалуйста, производится ли в режиме отладки мониторинг изменения регистров ядра? Попробуйте самостоятельно перенести адрес Reset_Handler в регистр ядра R15(PC) и проверьте, запустится ли Ваше приложение. Спасибо.
Попробовал переставить Reset Handler вручную на этот адрес - не помогает. После этого отладчик не видит процессора. Приходится перезапускать по питанию.
IMG_20210924_130508.jpg
Не могли бы Вы дать тестовый пример с подобным переходом?
Вероятно, зависание может происходить по причине того, что Flash-память не успевает перейти на исполнение другой программы внутри ПЗУ (к слову, важно понимать, что адрес перехода всегда должен быть нечетным, чтобы указать ядру о переходе на инструкцию THUMB, а не ARM - наиболее частая ошибка в рамках всех запросов, но в Вашем случае адрес Reset_Handler всегда будет нечетным), соответственно, необходимо увеличить задержку в тактах на обращение к памяти, если частота работы микроконтроллера большая, для удобства всегда можно применять следующий фрагмент кода:
Открыть
    MDR_FLASH->KEY = 0x8555AAA1;
    MDR_FLASH->CNTR = ((32 / (1E9/CPU_CLK)) + 1); // WAITCYCLE = (Trd_flash / Tcpu_clk) + 1
    MDR_FLASH->KEY  = 0x00000000;
Закрыть
Также важно то, как именно настроено тактирование микроконтроллера, в случае чего, необходимо производить его переинициализацию. Чтобы предметнее понять это, попробуйте, пожалуйста, исключить вовсе настройку тактирования и выполнить переход на исполнение другой программы с учётом в том числе рекомендаций по задержкам памяти. Спасибо за обращение.

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


Вернуться к началу
СообщениеДобавлено: 2021-сен-24 19:38 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 344
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
Andrey.Microteh писал(а): *
Попробовал переставить Reset Handler вручную на этот адрес - не помогает.
При вызове функций по указателю младший бит адреса функции должен быть 1. Ради интереса посмотрите в вашем .map файле адреса размещения функций - они все нечетные. И это не просто так. И в PC надо заносить не число 0x01008004, а 32-битное число, которое лежит в слове по адресу 0x01008004. Оно должно быть нечетным. Это адрес размещения функции ResetHandler() вашей второй программы - проверьте по map-файлу.

Вобщем, проверьте, что по адресу 0x01008004 лежит число, равное адресу размещения функции ResetHandler() вашего приложения (узнайте его в map-файле). Затем посмотрите отладчиком значение ResetHandlerPfunc перед переходом. Там должно лежать именно это число.

Кстати, первичное тестирование перехода на новую программу можно провести переходом на эту же программу. Ставите точку останова внутри функции ResetHandler(), а в main() вызываете функцию перехода по адресу 0x01000000:
GoToNewApp(0x01000000);
После её выполнения должны оказаться в вашем стартапе в функции ResetHandler() на точке останова. Там сравните значения всех регистров после сброса и после перехода. Как минимум PC и SP должны быть одинаковыми. Добейтесь корректного перехода.

Эта строка:
register pHandler ResetHandlerPfunc = (pHandler)(*(volatile uint32_t*)(NewAppAddr+4));
содержит лишнее промежуточное преобразование типа. Оно не нужно, его можно выкинуть и то же самое записать короче:
register pHandler ResetHandlerPfunc = *((volatile pHandler*)(NewAppAddr+4));
Оба варианта записи дадут одинаковый ассемблерный код, но второй короче и понятнее.

А лучше всего представить таблицу векторов в виде структуры и работать с её полями по указателю на неё. Тогда уйдет ручное вычисление смещений (+4), компилятор всё вычислит сам. Всё точно так, как вы работаете с регистрами периферийных устройств в CMSIS-стиле. Посмотрите пример тут.


Вернуться к началу
СообщениеДобавлено: 2021-сен-28 09:52 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Lampadov писал(а): *
Andrey.Microteh писал(а): *
Lampadov писал(а): *


Здравствуйте!

Подскажите, пожалуйста, производится ли в режиме отладки мониторинг изменения регистров ядра? Попробуйте самостоятельно перенести адрес Reset_Handler в регистр ядра R15(PC) и проверьте, запустится ли Ваше приложение. Спасибо.
Попробовал переставить Reset Handler вручную на этот адрес - не помогает. После этого отладчик не видит процессора. Приходится перезапускать по питанию.
IMG_20210924_130508.jpg
Не могли бы Вы дать тестовый пример с подобным переходом?
Вероятно, зависание может происходить по причине того, что Flash-память не успевает перейти на исполнение другой программы внутри ПЗУ (к слову, важно понимать, что адрес перехода всегда должен быть нечетным, чтобы указать ядру о переходе на инструкцию THUMB, а не ARM - наиболее частая ошибка в рамках всех запросов, но в Вашем случае адрес Reset_Handler всегда будет нечетным), соответственно, необходимо увеличить задержку в тактах на обращение к памяти, если частота работы микроконтроллера большая, для удобства всегда можно применять следующий фрагмент кода:
Открыть
    MDR_FLASH->KEY = 0x8555AAA1;
    MDR_FLASH->CNTR = ((32 / (1E9/CPU_CLK)) + 1); // WAITCYCLE = (Trd_flash / Tcpu_clk) + 1
    MDR_FLASH->KEY  = 0x00000000;
Закрыть
Также важно то, как именно настроено тактирование микроконтроллера, в случае чего, необходимо производить его переинициализацию. Чтобы предметнее понять это, попробуйте, пожалуйста, исключить вовсе настройку тактирования и выполнить переход на исполнение другой программы с учётом в том числе рекомендаций по задержкам памяти. Спасибо за обращение.
Добрый день. Отключил PLL, перешел на HSI - действительно произошел нормальный переход и запуск программы.
Наверное тогда правильнее будет совершать переход между программами так:

typedef void(*pHandler)(void);
void GoToNewApp(uint32_t NewAppAddr)
{
__disable_irq();
SysTickDisable();
CLK_SetSystemClock(MAX_CLK_HSI);
SCB->VTOR = NewAppAddr;
register pHandler ResetHandlerPfunc = *((volatile pHandler *)(NewAppAddr+4));
__set_MSP(*(uint32_t*)NewAppAddr);
ResetHandlerPfunc();
}
Спасибо за помощь!


Вернуться к началу
СообщениеДобавлено: 2021-сен-28 11:36 
Не в сети

Зарегистрирован: 2021-авг-09 09:21
Сообщения: 27
Организация: ООО "Предприятие "Микротех"
Еще один вопрос в связи с переходом между приложениями:
Сейчас я использую USB CDC в обоих приложениях (и в том, что стартует по включению питания, и в том, на которое осуществляется переход).
Несмотря на отключение тактов на USB (USB_DevicePowerOff(); MDR_CLK->USBMAC_CLK = 0; MDR_CLK->USB0_CLK = 0;) не происходит перезапуска USB COM в системе.
Подскажите пожалуйста, как правильно отключать USB Device?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 285 сообщений ]  На страницу « 115 16 17 18 19 »

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB