|
stm32 bootloader, разьясните новичку |
|
|
|
Apr 18 2012, 11:40
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Помогите, пожалуйста, поставить точки над i. Насколько мне понятно, в stm32 bootloader может быть использован вместо программатора. Для того, чтоб залить прошивку в контроллер, необходимо подсоединить плату с МК к компу через ком порт( по USART1 МК), подать на вход бут0 1, на бут 1 -0, загрузить бинарник, используя специальную утилиту Flash Loader Demonstrator.Это весь алгоритм? Второй вопрос. Часто встречается в сети такое выражение, как "написать загрузчик". Что имеется в виду под этим? В каком случае нужно писать свой загрузчик и как это сделать?
Сообщение отредактировал batisto4ka - Apr 18 2012, 11:41
|
|
|
|
|
 |
Ответов
(45 - 59)
|
Apr 26 2012, 13:00
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Прилагаю свой проект с функцией перехода по адресу приложения. Подскажите, почему не хочет линковаться проект?
Сообщение отредактировал batisto4ka - Apr 26 2012, 13:00
|
|
|
|
|
Apr 26 2012, 13:59
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Lotor @ Apr 26 2012, 18:08)  По-моему обойти это можно только, если неизменяемый загрузчик в первом секторе флеш, зашиваемый вами на заводе, будет иметь возможность "засасывать" прошивку из вне. Каким образом? Учтите мои требования по интерфейсам, приплюсуйте сюда необходимость реализации некоего рабочего протокола обмена (довольно сложного) в бутлоадере, необходимость определения параметров конфигурации каналов связи (формат этой конфигурации каналов связи может от прошивки к прошивке поменяться и бутлоадер должен заранее знать какой он был в прошлом и будет в будущем  Т.е. - вам придётся еще раз реализовать все те функции, что есть в рабочем ПО + необходимо как-то определить, что основное рабочее ПО функционирует неверно (а ведь определить это бутлоадеру будет очень сложно, раз на этапе тестирования новой прошивки вы сами не выявили её неработоспособности, значит эту неработоспособность очень сложно даже вам определить не говоря уже о бутлоадере  Таким образом вам придётся написать бутлоадер значительно сложнее самого рабочего ПО! Значит если у нас рабочее ПО перед пуском в серию должно пройти опытную эксплуатацию на объекте как минимум месяц, то и такой бутлоадер тем более надо ставить на опытную эксплуатацию. Только как вы будете его отлаживать, ставить на опытную эксплуатацию на объект и УДАЛЁННО ОБНОВЛЯТЬ??? Таким образом - приходим к абсурдности этой идеи  А если вы о простом интерфейсе для обновления ПО, не подразумевающем использование различных каналов связи с переменной конфигурацией, то по-моему это уже есть в самом проце в ROM изначально - у NXP в её LPC есть ISP через UART. Цитата(lead_seller @ Apr 26 2012, 18:52)  Раздумывал над таким вариантом. Придумал такой вариант тестирования прошивки: в самой прошивке пишем функцию и располагаем ее по четко указанному адресу памяти программ, задача функции получить какое-нибудь число, выполнить некие действия (например, какие то арифметические действия) и вернуть ответ. Перед загрузкой основной прошивки бутлоадер сделает вызов этой функции с какими-то данными, получит от нее результат, выполнит такие же операции с этим же набором данных сам, сравнит результаты, если результаты совпадут то прошивка будет считаться валидной. Получится эдакий аналог системы пароль-отзыв. Конечно, от необнаруженных при помощи CRC ошибок в прошивке это может и не спасти (если ошибки в прошивке есть, а сама функция-ключ будет работоспособной), но хотя бы спасет от заливки "левых" прошивок и выполнения устройством непредусмотренных действий. Всё то же самое, но гораздо лучше реализует обычное CRC всей прошивки. Ведь вы предлагаете контролировать малую часть прошивки (функцию), а я - всю прошивку. А спасение от заливки левых прошивок в моём способе делает бутлоадер, проверяя эту самую CRC перед обновлением поверх рабочей. Считать CRC генерируемой прошивки должен линковщик, благо к примеру в IAR-е это есть. Либо сторонее ПО - автоматом следующим шагом после линковки.
|
|
|
|
|
Apr 26 2012, 17:06
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 31-08-08
Пользователь №: 39 908

|
Цитата(batisto4ka @ Apr 26 2012, 16:00)  Прилагаю свой проект с функцией перехода по адресу приложения. Подскажите, почему не хочет линковаться проект? После компиляции выдает сообщение: " .\Listings\MSU_KDM-3322.axf: Warning: L6310W: Unable to find ARM libraries. .\Listings\MSU_KDM-3322.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main. " А у вас?
|
|
|
|
|
Apr 27 2012, 04:23
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(jcxz @ Apr 26 2012, 17:59)  Таким образом вам придётся написать бутлоадер значительно сложнее самого рабочего ПО! Значит если у нас рабочее ПО перед пуском в серию должно пройти опытную эксплуатацию на объекте как минимум месяц, то и такой бутлоадер тем более надо ставить на опытную эксплуатацию. Только как вы будете его отлаживать, ставить на опытную эксплуатацию на объект и УДАЛЁННО ОБНОВЛЯТЬ??? Таким образом - приходим к абсурдности этой идеи  Абсурдные идеи говорите? Представьте, что кто-то хочет сделать диверсию на вашем приборе и выставить фирму в неприглядном свете, он просто зальет 3 левых байта с правильной crc. И как удаленно вы почините такое при вашей "100% надежной" реализации?)
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 27 2012, 05:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Lotor @ Apr 27 2012, 10:23)  Абсурдные идеи говорите? Представьте, что кто-то хочет сделать диверсию на вашем приборе и выставить фирму в неприглядном свете, он просто зальет 3 левых байта с правильной crc. И как удаленно вы почините такое при вашей "100% надежной" реализации?) Интересно - откуда этот злодей знает где должна храниться эта CRC и по какому алгоритму она должна быть посчитана? А если он это узнал из неких источников, то из них же он и узнает всё про вашу функцию контроля и добавит и её. Защита от таких злодеев реализуется защитой канала связи. В нашем ПО этому злодею сначала надо узнать пароль доступа ДЛЯ ОБНОВЛЕНИЯ ПО, а также ключ шифрования для доступа к каналу С ПРАВАМИ ОБНОВЛЕНИЯ ПО. Или Вы в ваших устройствах позволяете обновлять ПО кому попало без защиты канала связи???
|
|
|
|
|
Apr 27 2012, 05:17
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(jcxz @ Apr 27 2012, 09:01)  Или Вы в ваших устройствах позволяете обновлять ПО кому попало без защиты канала связи??? Зачем столько эмоций, я лишь показал вам две потенциально возможных ситуации, когда назвать такую реализацию 100% надежной нельзя. А злодеи могут быть и бывшими сотрудниками вашей фирмы, которые затаили обиду.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 27 2012, 05:59
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(jcxz @ Apr 27 2012, 09:33)  Если все эти мероприятия выполнены в полном объёме - надёжность будет близка к 100%. Согласен, просто меня жизнь научила, что если есть пусть и маловероятная, но возможная ситуация - она случается. =) Поэтому даже с вышеуказанными вами мерами безопасности есть шанс, что у залитой (но плохо протестированной) прошивки со временем отваливаются какие-то важные функции, включая обновление ПО. И в этом я вижу единственный минус такого подхода к загрузчику.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Apr 27 2012, 06:36
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Цитата(spasbyspas @ Apr 26 2012, 21:06)  После компиляции выдает сообщение: " .\Listings\MSU_KDM-3322.axf: Warning: L6310W: Unable to find ARM libraries. .\Listings\MSU_KDM-3322.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main. " А у вас? Все, вопрос снят. Нужно подключить core_m3.c
|
|
|
|
|
May 3 2012, 07:59
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Помогите домучать бутлоадер. Программа бутлоадера записана по адресу 0x08000000. Программа пользователя пишется по адресу 0x0819000. Алгоритм бутлоадера такой: при сбросе ждем 5 секунд, если за это время по юсарту приходит нужная комбинация (короче устанавливается связь с внешним загрузчиком), то работает бутлоадер. А если связь не стуанавливается- загружается программа пользователя если она есть. Не могу понять одного, как работает эта функция Код void JumpToApplication (uint32_t ApplicationAddress) { typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t JumpAddress;
//__disable_interrupt(); // Запрещаем прерывания NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_PROG_OFFSET); if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) //Проверяем, есть ли что-нибудь по адресу (там должно лежать значение SP для приложения, его кладет линкер) { //Адрес перехода из вектора Reset JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; //Указатель на функцию перехода __set_MSP(*(__IO uint32_t*) ApplicationAddress); //Устанавливаем SP приложения Jump_To_Application(); //Запускаем приложение } }
Вроде бы все правильно работает до момента [code]JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Насколько я понимаю, JumpAddress должна содержать адрес функции SystemInit. Но, у меня получается, что формируется фообще какой-то левый адрес, в котором расположен код бутлоадера. Я так подозреваю, что причина в том, что нужно прежде чем билдить проект программы пользователя, которую нужно запистаь в память, нужно опредленным образомнастроить адрессацию где-то в настройках, то ли линковщик то ли не знаю. Потому что если брать обыкновенный проект в кейле, где настройки стоят по умолчанию, по адресу вектора сброса записывается адресс, где хранится программа, скомпилированная и слинкованная для базового адресса 0х08000000, поэтому если эту программу через программатор записать в камень и отлаживать, то адрес систем инит там будет к примеру по адресу 0х08000431. А если этот hex переслать в бутлоадер, то соответственно JumpAddress=0х08000431 будет принадлежать области порграммы бутлоадера. Подскажите, пожалуйста, правильно ли я мыслю? И как настроить проект в Кейле, чтобы все хорошо работало???))))))))))))))))
|
|
|
|
|
May 4 2012, 03:34
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929

|
Цитата(batisto4ka @ May 3 2012, 13:59)  Я так подозреваю, что причина в том, что нужно прежде чем билдить проект программы пользователя, которую нужно запистаь в память, нужно опредленным образомнастроить адрессацию где-то в настройках, то ли линковщик то ли не знаю. Потому что если брать обыкновенный проект в кейле, где настройки стоят по умолчанию, по адресу вектора сброса записывается адресс, где хранится программа, скомпилированная и слинкованная для базового адресса 0х08000000, поэтому если эту программу через программатор записать в камень и отлаживать, то адрес систем инит там будет к примеру по адресу 0х08000431. А если этот hex переслать в бутлоадер, то соответственно JumpAddress=0х08000431 будет принадлежать области порграммы бутлоадера. Подскажите, пожалуйста, правильно ли я мыслю? И как настроить проект в Кейле, чтобы все хорошо работало???)))))))))))))))) Все рассуждения верные, как конкретно настроить в кейле не знаю, по аналогии с IAR надо смотреть опции линковщика. Надо изменить начальные адреса FLASH и Intvec на начальный адрес программы. В самой программе не забыть первым действием установить новый адрес таблицы векторов, я про это уже говорил. Код NVIC_SetVectorTable(NVIC_VectTab_FLASH, USER_PROG_OFFSET);
|
|
|
|
|
May 4 2012, 05:37
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Так все решено. На самом деле в программу, которая загружается, нужно добавить Код __set_PRIMASK(1);//отключить все прерывания /* Set the Vector Table base location at 0x08010000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x19000); //перенести таблицу векторов прерываний по адресу 0х08019000 /*Тут функции настройки NVICа*/ __set_PRIMASK(0);//включить все прерывания
Сообщение отредактировал batisto4ka - May 4 2012, 11:37
|
|
|
|
|
Dec 23 2013, 05:26
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 160

|
Вопрос по встроенному загрузчику STM, возможно ли его запустить находясь в основной программе не использую ножки BOOT? Например такая возможность имеется у LPC подав специальную команду внутри своей программы перейти в встроенный загрузчик и прошить контроллер с помощью flashmagic.
|
|
|
|
|
Dec 23 2013, 10:47
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 5-12-06
Пользователь №: 23 160

|
Спасибо, действительно все заработало. Основное можно подглядеть: http://www.youtube.com/watch?v=cvKC-4tCRgw
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|