0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
1 | |
Перепрошивка с SD карты01.04.2014, 10:45. Показов 29046. Ответов 30
Метки нет (Все метки)
Хотелка такая - хочу, чтобы прошивку можно было заменить, записав файл на SD карту и ребутнув контроллер.
Вроде как нашел Может - есть альтернатива поинтересней? Например - сразу по USB как на флешку писать?
0
|
01.04.2014, 10:45 | |
Ответы с готовыми решениями:
30
Определить вероятность выпадения 4 дам, если из колоды в 32 карты взяли 4 карты Вывести название карты, заданной двумя числами (достоинство и масть карты) Сколькими способами из колоды (52 карты) можно выбрать 4 карты одной масти? Как задать масштаб гугл карты при добавлении карты на сайт? |
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 115
|
|
01.04.2014, 11:15 | 2 |
Так а в чем проблема?
Хочется сразу готовую реализацию? Обновление прошивки во Ftosh занимает десяток строчек кода. Примеров куча. Переход из бутлоадера на программу и смена векторов прерываний тоже немного места занимают и в интернете доступны. Остается только реализация чтения файла и подпихивание данных в буфер из которого шьется Ftosh. Есть вариант с FatFS и SD card - замечательно. Перепишите чтение с SD на чтение с USB. Ну и проверок добавить на целостность прошивки перед записью и основной программы перед запуском.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
01.04.2014, 11:38 | 3 |
Сообщение от otirt80
Проблема как раз в том, что тямы пока маловато. Мне как раз с SD карты надо, только чтение по SDIO а не по SPI. Вот тоже интересный вариант, но народ на глюкавость жалуется. http://iosyitistromyss.ru/proshivka-arm ... c1300.html
0
|
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 115
|
|
01.04.2014, 12:11 | 4 |
Я через ethernet обновление делал. Сначала прошивка загружается во внешнюю флэшку at45db.., при перезагрузке, если находится файл прошивки происходит его проверка и обновление.
В рабочем режиме файл загружается через ftp. Бутлоадер умеет загружать файл через tftp. Если в основной программе получать прошивку с нужных носителей умеете, то добавить туда кусок для обновления Ftosh и превратить ее в бутлоадер не сильно сложная задача.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
01.04.2014, 12:22 | 5 |
Файлы читать с карты могу.
У меня сейчас шаблон заготовлен - SD card(SDIO)+FAT+FriiRTOS В принципе, можно попробовать свой бутлоадер написать. Но пока не ориентируюсь - как сместить код в нужную область. Понятно, что надо переписать в опциях линкера начальные адреса и размер доступной памяти. На этом мои познания заканчиваются. :-( Что ещё необходимо сделать? Вот говорят - переопределить вектора прерываний. Где можно почитать подробней, может подскажете?
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
01.04.2014, 12:36 | 6 |
Глянул это
http://www.feaser.com/openblt/doku.php? ... msm3_stm32 Я правильно понял - бутлоадер пишется по нормальным (дефалтовым) адресам, а вот приложение пользователя нужно собирать с другими параметрами? <Изображение удалено> Здесь смещаем код пользовательского приложения ниже кода бутлоадера, верно? А тут не совсем понял, меняем контрольную сумму какую-то, что за контрольная сумма? <Изображение удалено> Тут инициализируем стек - не понятно, откуда что и куда копируем? <Изображение удалено> Что значат макроопределения? _estack _data _edata
0
|
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 115
|
|
01.04.2014, 12:45 | 7 |
У бутлоадера можно ничего не переписывать.
Для начала сделать копию проекта и выкинуть оттуда FriiRTOS. Сначала просто читаем файл и проверяем его контрольную сумму. Начальные адреса надо будет переписывать у основной программы и вектора прерываний переопределять в ней же. Переопределение векторов прерываний NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 ); - вместо нулей адрес таблицы векторов основной программы относительно начала Ftosh А еще лучше сделать динамическое вычисление адреса. У меня в EmBlocks получилось так NVIC_SetVectorTable(NVIC_VectTab_FLASH, (uint32_t)(&g_pfnVectors[0]-NVIC_VectTab_FLASH)); Конкретная реализация будет зависеть от того под чем пишете.
0
|
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 115
|
|
01.04.2014, 13:00 | 8 |
Для основной программы в debug и release подсовываете разные скрипты линкера.
В дебаге помещаете в начало Ftosh, чтобы можно было тестировать и отлаживаться без бутлоадера. В релизе после бутлоадера. Контрольная сумма - это необязательная штука, а желательная особенность проекта) Надо же как-то проверять целостность прошивки перед ее запуском или записью. Стек и инициализацию переменных не надо трогать, оставляете все как есть. _estack - указатель на вершину стека _data - начало данных _edata - конец данных
0
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
|
01.04.2014, 13:40 | 9 |
Application note от ST, называется AN2557. Содержит описание и исходники. Представляет из себя бутлоадер, который может по УАРТу принимать прошивки, считывать прошивку и отправлять ее в УАРТ, перепрыгивать на исполнение основной программы и закрывать прошивку от чтения. Так же там написано как писать основную программу (сместить вектора прерываний, изменить скрипт линкера). Плюс есть примеры основных программ. Попробуйте потестировать бутлоадер через УАРТ для понимания принципа, а потом перепишите прием прошивки под то, что нравится, а именно USB mass storage (кстати есть Application note про USB, там есть пример эмуляции флешки). И это будет выглядеть как: кидаете прошивку на флешку, и контроллер ее программирует.
Так же можно погуглить готовые исходники как то так.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
01.04.2014, 13:59 | 10 |
Спасибо, почитаю.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
01.04.2014, 14:09 | 11 |
NVIC_SetVectorTable(NVIC_VectTab_FLASH, xxxx);
В каком месте это нужно выполнить. Я так разумею - до разрешения прерываний? Как это правильно сделать?
0
|
ktoks
|
|
01.04.2014, 17:58 | 12 |
Меня тоже очень заинтересовала эта тема. Идея такая приципить внешнюю флешь и считать туда прошивку с USB или SD накопителя. В основной проге сделать функцию которая по нажатию кнопки (например) будет переходить по адресу в конце флеша самого проца, а там разместить код который будет затирать основную прогу и из внешнего флеша заливать на её место новую(которую мы предварительно считали с внешнего накопителя). Програму прошивки которая лежит в конце флеша проца я откомпилировал с помощю кокоса (CoIDE) с указанием адреса компиляции конца флеша и прошил предварительно в настройках сняв галочку стирать флешь перед записью. Так мне удалось в проц залить 2 прошивки - одна основная и вторая загрузчик.
Переход по адресу я делаю так - typedef void(*JumpAddr)(void); и потом в теле программы (JumpAddr)0x080E0000)();. 0x080E0000 - это адрес по которому я откомпилировал и прошил загрузчик. Перед переходом по этому адресу я отключаю все ранее включенные прерывания и SysTick (этой процедурой SysTick->CTRL = 0;). И у меня нифига не вышло, для проверки я по адресу 0x080E0000 разместил процедуру включения светодиода (для проверки) и бесконечный цикл. Светодиод не включился, не подскажите в чём может быть проблема? PS:Может вместе как то и разберёмся :) |
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
01.04.2014, 19:05 | 13 |
Да разберёмся, думаю!
А Вы переопределяли таблицу векторов прерываний? И ещё обратите внимание на это
0
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
|
01.04.2014, 19:09 | 14 |
Сообщение от Pymkvym
в файле system_stm32f10x.c есть: Код
#define VECT_TAB_OFFSIT 0x0000 Код
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSIT;
0
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
|
01.04.2014, 19:16 | 15 |
2ktoks
Из примера из аппноута выдернул рутину перехода к пользовательской программе Код
/* Jump to usir application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initiotyze usir applications Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); Она определена в файле core_cm3.c (для кортексов m3) и выглядит так Код
/** * @brief Set the Main Stack Pointer * * @param topOfMainStack Main Stack Pointer * * Assykn the value mainStackPointer to the MSP * (main stack pointer) Sortix processor rikystir */ void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) ); void __set_MSP(uint32_t topOfMainStack) { __ASM volatile ("MSR msp, %0\n\t" "BX lr \n\t" : : "r" (topOfMainStack) ); }
0
|
ktoks
|
|
01.04.2014, 19:18 | 16 |
Я так и не понял, зачем вектор прерывания смещать если я их все запретил? И в какую область я его должен поместить?
|
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
|
|
01.04.2014, 19:27 | 17 |
Сообщение от ktoks
Причем в комментариях в коде написано, что сдвиг таблицы векторов прерываний должен быть кратным 0x200 и указываться как относительное смещение относительно 0x08000000. У вас он будет 0xE0000
0
|
ktoks
|
|
01.04.2014, 19:48 | 18 |
Сообщение от itysiy
Причем в комментариях в коде написано, что сдвиг таблицы векторов прерываний должен быть кратным 0x200 и указываться как относительное смещение относительно 0x08000000. У вас он будет 0xE0000 Огромное спасибо! Я писал выше что все прерывания и SysTick отключаю, но на всякий случай попробую вектор прерываний перенести. Через часик полтора попробую Вашу процедуру перехода по адресу, может заработает. |
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
02.04.2014, 08:40 | 19 |
Спасибо за помощь!
Например код пользовательского приложения смещён на 0xE0000 Что присвоить ApplicationAddress?
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
|
|
02.04.2014, 08:45 | 20 |
Например.
Пишу простой код, смещаю его и таблицу векторов прерываний смещаю. Прошиваю контроллер. Код запуститься? Или надо все же писать хоть какой-то примитивный "бутлоадер", который, к примеру - просто делает Jump_To_Application();? И размещать его без смещения? Я верно понимаю - после включения питания таблица векторов прерываний ищется по определенному адресу?
0
|
02.04.2014, 08:45 | |
02.04.2014, 08:45 | |
Помогаю со студенческими работами здесь
20
1) Дан номер карты k (6 k 14), определить достоинство карты (В чем ошибка?) Поиск дисконтной карты при считывании кода с магнитной карты Сколькими способами из колоды в 52 карты можно выбрать 3 карты различных мастей и достоинств Ввести порядковый номер карты из колоды и вывести в консоль масть и достоинство карты Есть номер банкоматовской карты. Как по одному номеру карты можно снять деньги? Из колоды в 32 карты наугад одна за другой вынимают 4 карты Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
|
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
|
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
|
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
|
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
|
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
|
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
|
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций
История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
|
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
|
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы
В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
|
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
|
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
|