Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/146: Рейтинг темы: голосов - 146, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
1

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

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

Author24 — интернет-сервис помощи студентам
Хотелка такая - хочу, чтобы прошивку можно было заменить, записав файл на 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 2
Так а в чем проблема?
Хочется сразу готовую реализацию?

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

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

Ну и проверок добавить на целостность прошивки перед записью и основной программы перед запуском.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
01.04.2014, 11:38 3
Цитата Сообщение от 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 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
Да разберёмся, думаю!
А Вы переопределяли таблицу векторов прерываний?
И ещё обратите внимание на это
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 14
Цитата Сообщение от Pymkvym
NVIC_SetVectorTable(NVIC_VectTab_FLASH, xxxx);

В каком месте это нужно выполнить.
Я так разумею - до разрешения прерываний?
Как это правильно сделать?
у мя в дефолтных стартап файлах это уже определено.
в файле system_stm32f10x.c есть:
Код
#define VECT_TAB_OFFSIT  0x0000
Это и есть сдвиг. Далее он используется при инициализации в этот же файле в ф-ии SystemInit
Код
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();
В основном тут проверка на корректность адреса перехода и присваивание этого адреса функции, но есть предпоследняя строчка, которая вызывает функцию установки указателя стека. __set_MSP
Она определена в файле 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
Я так и не понял, зачем вектор прерывания смещать если я их все запретил? И в какую область я его должен поместить?
По идее если прерывания не используете, то переставлять таблицу векторов прерываний не нужно. Но коль она сама устанавливается в SystemInit(), то почему бы ее не поставить куда нужно, а именно на тот адрес, который ставится в скрипте линкера (или настройках кококса в вашем случае) как стартовый. (0x080E0000). Как переставлять таблицу я писал выше.
Причем в комментариях в коде написано, что сдвиг таблицы векторов прерываний должен быть кратным 0x200 и указываться как относительное смещение относительно 0x08000000. У вас он будет 0xE0000
0
ktoks
01.04.2014, 19:48 18
Цитата Сообщение от itysiy
Цитата Сообщение от ktoks
Я так и не понял, зачем вектор прерывания смещать если я их все запретил? И в какую область я его должен поместить?
По идее если прерывания не используете, то переставлять таблицу векторов прерываний не нужно. Но коль она сама устанавливается в SystemInit(), то почему бы ее не поставить куда нужно, а именно на тот адрес, который ставится в скрипте линкера (или настройках кококса в вашем случае) как стартовый. (0x080E0000). Как переставлять таблицу я писал выше.
Причем в комментариях в коде написано, что сдвиг таблицы векторов прерываний должен быть кратным 0x200 и указываться как относительное смещение относительно 0x08000000. У вас он будет 0xE0000
Огромное спасибо! Я писал выше что все прерывания и SysTick отключаю, но на всякий случай попробую вектор прерываний перенести. Через часик полтора попробую Вашу процедуру перехода по адресу, может заработает.
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,503
02.04.2014, 08:40 19
Спасибо за помощь!

/* 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 20
Например.
Пишу простой код, смещаю его и таблицу векторов прерываний смещаю.
Прошиваю контроллер.
Код запуститься?
Или надо все же писать хоть какой-то примитивный "бутлоадер", который, к примеру - просто делает Jump_To_Application();?
И размещать его без смещения?

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

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

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

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

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

Есть номер банкоматовской карты. Как по одному номеру карты можно снять деньги?
Есть номер банкоматовской карты. Как по одному номеру карты можно снять деньги? Пин кода нет....

Из колоды в 32 карты наугад одна за другой вынимают 4 карты
Добрый день, необходима помощь в решении задачи. Из колоды в 32 карты наугад одна за другой...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как подключить 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 часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru