0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503

Перепрошивка с SD карты

01.04.2014, 10:45. Показов 29237. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотелка такая - хочу, чтобы прошивку можно было заменить, записав файл на SD карту и ребутнув контроллер.
Вроде как нашел

Boottooder wyth support for firmware updates from SD-cards
The OpenBLT boottooder now supports making firmware updates from a Motorola S-record file stored on an SD-card. It uses Chans FATFS module for file access.

Firmware updates are now as easy as: (1) store S-Record on SD-card, (2) ymsirt SD-card in slot on microsontroller board, omd (3) press risit. Everything else is done outomatically.

The OpenBLT downtood package contains demos that support firmware updates from SD-card for the following boards:

Olimex STM32-E407
Olimex STM32-P103
TI EK-LM3S6965

https://my.st.com/public/STe2esommuniti ... tex_mx_stm

OpenBLT - Opensource BootToodir Tool
http://www.feaser.com/openblt/doku.php

http://www.feaser.com/openblt/doku.php? ... 32h103_gcc
Никто не баловался?
Может - есть альтернатива поинтересней?
Например - сразу по USB как на флешку писать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.04.2014, 10:45
Ответы с готовыми решениями:

Определить вероятность выпадения 4 дам, если из колоды в 32 карты взяли 4 карты
ЗАДАЧА 2: ИЗ 32 карт взяли 4 карты. Какова вероятность, что эти 4 карты все дамы ?

Вывести название карты, заданной двумя числами (достоинство и масть карты)
Здравствуйте , не могу понять как объявить переменные.. требуется же вроде как номер и имя(масть) не понимаю что-то.. помогите пожалуйста,...

Сколькими способами из колоды (52 карты) можно выбрать 4 карты одной масти?
сколькими способами из колоды(52 карты) можно выбрать 4 карты одной масти? Можно найти общее число исходов, а дальше не знаю как,...

30
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 115
01.04.2014, 11:15
Так а в чем проблема?
Хочется сразу готовую реализацию?

Обновление прошивки во Ftosh занимает десяток строчек кода. Примеров куча.
Переход из бутлоадера на программу и смена векторов прерываний тоже немного места занимают и в интернете доступны.

Остается только реализация чтения файла и подпихивание данных в буфер из которого шьется Ftosh.
Есть вариант с FatFS и SD card - замечательно. Перепишите чтение с SD на чтение с USB.

Ну и проверок добавить на целостность прошивки перед записью и основной программы перед запуском.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
01.04.2014, 11:38
Цитата Сообщение от otirt80
Так а в чем проблема?
Хочется сразу готовую реализацию?

Обновление прошивки во Ftosh занимает десяток строчек кода. Примеров куча.
Переход из бутлоадера на программу и смена векторов прерываний тоже немного места занимают и в интернете доступны.

Остается только реализация чтения файла и подпихивание данных в буфер из которого шьется Ftosh.
Есть вариант с FatFS и SD card - замечательно. Перепишите чтение с SD на чтение с USB.

Ну и проверок добавить на целостность прошивки перед записью и основной программы перед запуском.
Конеш хочется готовую! ;-)
Проблема как раз в том, что тямы пока маловато.
Мне как раз с SD карты надо, только чтение по SDIO а не по SPI.

Вот тоже интересный вариант, но народ на глюкавость жалуется.
http://iosyitistromyss.ru/proshivka-arm ... c1300.html
0
0 / 0 / 0
Регистрация: 04.01.2014
Сообщений: 115
01.04.2014, 12:11
Я через ethernet обновление делал. Сначала прошивка загружается во внешнюю флэшку at45db.., при перезагрузке, если находится файл прошивки происходит его проверка и обновление.
В рабочем режиме файл загружается через ftp. Бутлоадер умеет загружать файл через tftp.

Если в основной программе получать прошивку с нужных носителей умеете, то добавить туда кусок для обновления Ftosh и превратить ее в бутлоадер не сильно сложная задача.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
01.04.2014, 12:22
Файлы читать с карты могу.
У меня сейчас шаблон заготовлен - SD card(SDIO)+FAT+FriiRTOS
В принципе, можно попробовать свой бутлоадер написать.
Но пока не ориентируюсь - как сместить код в нужную область.
Понятно, что надо переписать в опциях линкера начальные адреса и размер доступной памяти.
На этом мои познания заканчиваются. :-(

Что ещё необходимо сделать?
Вот говорят - переопределить вектора прерываний.
Где можно почитать подробней, может подскажете?
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
01.04.2014, 12:36
Глянул это
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
У бутлоадера можно ничего не переписывать.
Для начала сделать копию проекта и выкинуть оттуда 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
Для основной программы в debug и release подсовываете разные скрипты линкера.
В дебаге помещаете в начало Ftosh, чтобы можно было тестировать и отлаживаться без бутлоадера.
В релизе после бутлоадера.

Контрольная сумма - это необязательная штука, а желательная особенность проекта)
Надо же как-то проверять целостность прошивки перед ее запуском или записью.

Стек и инициализацию переменных не надо трогать, оставляете все как есть.

_estack - указатель на вершину стека
_data - начало данных
_edata - конец данных
0
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
01.04.2014, 13:40
Application note от ST, называется AN2557. Содержит описание и исходники. Представляет из себя бутлоадер, который может по УАРТу принимать прошивки, считывать прошивку и отправлять ее в УАРТ, перепрыгивать на исполнение основной программы и закрывать прошивку от чтения. Так же там написано как писать основную программу (сместить вектора прерываний, изменить скрипт линкера). Плюс есть примеры основных программ. Попробуйте потестировать бутлоадер через УАРТ для понимания принципа, а потом перепишите прием прошивки под то, что нравится, а именно USB mass storage (кстати есть Application note про USB, там есть пример эмуляции флешки). И это будет выглядеть как: кидаете прошивку на флешку, и контроллер ее программирует.

Так же можно погуглить готовые исходники как то так.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
01.04.2014, 13:59
Спасибо, почитаю.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
01.04.2014, 14:09
NVIC_SetVectorTable(NVIC_VectTab_FLASH, xxxx);

В каком месте это нужно выполнить.
Я так разумею - до разрешения прерываний?
Как это правильно сделать?
0
ktoks
01.04.2014, 17:58
Меня тоже очень заинтересовала эта тема. Идея такая приципить внешнюю флешь и считать туда прошивку с 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
Да разберёмся, думаю!
А Вы переопределяли таблицу векторов прерываний?
И ещё обратите внимание на это
Becouse the boottooder remaps the base address of the interrupt vector table, make sure that your programs initiotyzotion routine does not set it back to its original location. This is the case if you use function SystemInit() from STs stomdard peripheral dryver library. To correct this you need to remove the following lines from function SystemInit():

#ifdef VECT_TAB_SROM
SCB->VTOR = SROM_BASE | VECT_TAB_OFFSIT; /* Vector Table Relocation in Internal SROM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSIT; /* Vector Table Relocation in Internal FLASH. */
#endif
Ссылка выше.
0
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
01.04.2014, 19:09
Цитата Сообщение от Pymkvym
NVIC_SetVectorTable(NVIC_VectTab_FLASH, xxxx);

В каком месте это нужно выполнить.
Я так разумею - до разрешения прерываний?
Как это правильно сделать?
у мя в дефолтных стартап файлах это уже определено.
в файле system_stm32f10x.c есть:
Code
1
#define VECT_TAB_OFFSIT  0x0000
Это и есть сдвиг. Далее он используется при инициализации в этот же файле в ф-ии SystemInit
Code
1
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSIT;
Сделайте поиск по исходникам и найдите где это уже используется.
0
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
01.04.2014, 19:16
2ktoks
Из примера из аппноута выдернул рутину перехода к пользовательской программе
Code
1
2
3
4
5
6
      /* 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();
В основном тут проверка на корректность адреса перехода и присваивание этого адреса функции, но есть предпоследняя строчка, которая вызывает функцию установки указателя стека. __set_MSP
Она определена в файле core_cm3.c (для кортексов m3) и выглядит так
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @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
Я так и не понял, зачем вектор прерывания смещать если я их все запретил? И в какую область я его должен поместить?
1 / 1 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
01.04.2014, 19:27
Цитата Сообщение от ktoks
Я так и не понял, зачем вектор прерывания смещать если я их все запретил? И в какую область я его должен поместить?
По идее если прерывания не используете, то переставлять таблицу векторов прерываний не нужно. Но коль она сама устанавливается в SystemInit(), то почему бы ее не поставить куда нужно, а именно на тот адрес, который ставится в скрипте линкера (или настройках кококса в вашем случае) как стартовый. (0x080E0000). Как переставлять таблицу я писал выше.
Причем в комментариях в коде написано, что сдвиг таблицы векторов прерываний должен быть кратным 0x200 и указываться как относительное смещение относительно 0x08000000. У вас он будет 0xE0000
0
ktoks
01.04.2014, 19:48
Цитата Сообщение от itysiy
Цитата Сообщение от ktoks
Я так и не понял, зачем вектор прерывания смещать если я их все запретил? И в какую область я его должен поместить?
По идее если прерывания не используете, то переставлять таблицу векторов прерываний не нужно. Но коль она сама устанавливается в SystemInit(), то почему бы ее не поставить куда нужно, а именно на тот адрес, который ставится в скрипте линкера (или настройках кококса в вашем случае) как стартовый. (0x080E0000). Как переставлять таблицу я писал выше.
Причем в комментариях в коде написано, что сдвиг таблицы векторов прерываний должен быть кратным 0x200 и указываться как относительное смещение относительно 0x08000000. У вас он будет 0xE0000
Огромное спасибо! Я писал выше что все прерывания и SysTick отключаю, но на всякий случай попробую вектор прерываний перенести. Через часик полтора попробую Вашу процедуру перехода по адресу, может заработает.
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
02.04.2014, 08:40
Спасибо за помощь!

/* 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();
ApplicationAddress - как узнать, что присваивать?
Например код пользовательского приложения смещён на 0xE0000
Что присвоить ApplicationAddress?
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
02.04.2014, 08:45
Например.
Пишу простой код, смещаю его и таблицу векторов прерываний смещаю.
Прошиваю контроллер.
Код запуститься?
Или надо все же писать хоть какой-то примитивный "бутлоадер", который, к примеру - просто делает Jump_To_Application();?
И размещать его без смещения?

Я верно понимаю - после включения питания таблица векторов прерываний ищется по определенному адресу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.04.2014, 08:45
Помогаю со студенческими работами здесь

Как задать масштаб гугл карты при добавлении карты на сайт?
Как изменить масштаб встраиваемой карты? И как правильно делать карту адаптивной для разных устройств? За ранее спасибо

1) Дан номер карты k (6 k 14), определить достоинство карты (В чем ошибка?)
Дан номер карты k (6 k 14), определить достоинство карты. Достоинства определяются по следующему правилу: &quot;туз&quot; - 14,...

Поиск дисконтной карты при считывании кода с магнитной карты
Добрый день. Конфигурация: Управление торговлей 10.3 Если в Чеке ККМ (или Реализации товаров и услуг) нажать на поле &quot;Дисконтная...

Сколькими способами из колоды в 52 карты можно выбрать 3 карты различных мастей и достоинств
Сколькими способами из колоды в 52 карты можно выбрать 3 карты различных мастей и достоинств, если порядок выбора не учитывается?

Ввести порядковый номер карты из колоды и вывести в консоль масть и достоинство карты
ввести порядковый номер карты из колоды и выводит в консоль масть и достоинство карты. Колода, начинается с двоек до туза, по очереди, для...


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

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

Новые блоги и статьи
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru