Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Собственный Bootloader для MSP430
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Pavel V.
Здравствуйте!

Интересно, писал ли кто-нибудь собственный бутлоадер для контроллеров MSP? Хочется обновлять прошивку через стандартный UART, с помощью которого плата общается с управляющим компьютером. Для AVR встречал множество примеров, а для MSP никак не могу найти. По идее технически это возможно, но где бы посмотреть пример?

Буду рад любой помощи и ссылке где почитать.
VVlad
Пробовал по приложенной ссылке, но пока без успеха.
Сергей Борщ
Цитата(Pavel V. @ May 18 2010, 13:01) *
Для AVR встречал множество примеров, а для MSP никак не могу найти.
Портировал AVR231 - никаких проблем. Фактически там надо переписать процедуру записи во флеш, инициализацию и обработку uart.
rezident
Цитата(Pavel V. @ May 18 2010, 16:01) *
По идее технически это возможно
Технически - да, это несложно. Техника самопрограммирования Flash в MSP430 весьма неплохая. Однако, как это часто бывает, "дьявол кроется в мелочах".
Во-первых, напомню, что во всех MSP430 (кроме самых маленьких из серии MSP430F20xx) есть встроенный BootStrip Loader, который описан в документации. Если нет нехватки пинов МК, то часто его можно совместить с UART. Добавив два преобразователя уровня для сигналов TEST/TCK и RESET, можно программировать через тот же порт, к которому подключены пины UART. Протокол BSL описан. Имеется возможность патчить его. Тщательно этот вопрос не исследовал, но по-моему имеется возможность перенаправить порт В/В для BSL на один из реальных UART.
Во-вторых, следует прояснить, вам нужен bootloader для настольного или "полевого" варианта устройства? Имеется в виду, есть к устройству физический доступ или оно работает где-то в сети и внутрь его влезть невозможно? Если вариант настольный, то я опять же голосую за встроенный BSL. Лично я в устройствах, где не предполагается смена ПО в полевых условиях обычно вывожу 6 пинов для BSL и все. Нужно перепрограммировать - снял крышку с прибора, подключил преобразователь уровней от COM-порта, прижав его разъем к отверстиям в плате, и за пару минут перешил.
Если же нужен "полевой" вариант бутлоадера, то следует учитывать такой нюанс. Все вектора прерываний у MSP430 находятся в одном секторе Flash. Следовательно при смене ПО, использующего прерывания, нужно этот сектор стирать и переписывать. Но если сбой произойдет именно в момент стирания/перезаписи, то все. Капут. Ваш бутлоадер уже больше не стартанет, т.к. будет запорчен (стерт) вектор сброса, где располагается адрес перехода на ваш бутлоадер. Поэтому сегмент с прерываниями стирать нельзя крайне нежелательно. Вместо этого сами вектора следует отмаппировать в другой сегмент Flash или в ОЗУ. Тут на форуме где-то уже давали вариант исходника маппирования векторов прерываний в ОЗУ. Но следует учитывать, что компиляторы про такое маппирование даже не будут подозревать, бо это нештатный хук. Поэтому вам самому придется писать ПО с учетом такого маппирования. И соответственно одной из функций бутлоадера должна быть проверка валидности "перемещенных" векторов прерываний. "Перемещенных" в кавычках, т.к. маппирование получается виртуальное и адреса векторов физически не перемещаются. Векторы прерываний при этом лишь содержат адрес ячейки памяти, где должен стоять JMP на адрес реального обработчика прерывания.
Вот такие мысли. laughing.gif
Сергей Борщ
Цитата(rezident @ May 18 2010, 22:04) *
Вместо этого сами вектора следует отмаппировать в другой сегмент Flash или в ОЗУ.
Все верно. Именно так и делал. Копировал вектора в ОЗУ. Особых сложностей с объяснением компилятору линкеру такого их расположения не возникло. Для приложения все свелось к расположению векторов по другому адресу.
MrYuran
Цитата(rezident @ May 18 2010, 23:04) *
Нужно перепрограммировать - снял крышку с прибора, подключил преобразователь уровней от COM-порта, прижав его разъем к отверстиям в плате, и за пару минут перешил.

А теперь представим, что на складе лежит штук 100 готовых изделий, по 6 винтов в крышечке.
Плюс герметизирующая резинка, которая прилипает, и крышку иногда отколупывать приходится с помощью какой-то матери, стараясь не повредить эмаль корпуса.
Также представим, что я выпускаю извещение на ПО и иду с ним к регулировщикам...
Далее следует непереводимая игра слов...
Вот появилась идея вызывать вшитый BSL по какой-либо сервисной команде, тогда для перепрошивки достаточно объединить UART с пинами BSL и перепрошивать без вскрытия через имеющийся канал связи.
Но это вариант только для внутреннего применения, т.к. прошивка не шифруется.
Shread
Есть вот такая аппликуха:
http://focus.ti.com/general/docs/litabsmul...eNumber=slaa341
Вполне себе работоспособная. Я портировал на 2xx, никаких особых трудностей не возникло: переписал программировние флеш и UART, добавил дефайны для 2xx. Очень удобно, с точки зрения того, что для обновления нужен только терминал.
MrYuran
Цитата(Shread @ May 20 2010, 12:58) *
Есть вот такая аппликуха:
[url="http://focus.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=slaa341"]http://focus.ti.com/general

Можно, конечно...
Но как минимум, нужно зашифровать вход в монитор, чтобы первый залётный дятел всё не сломал или не слил прошивку.
Я в своё время очень хотел в качестве монитора forth-машину встроить, да всё никак времени не было, а сейчас вообще...
Pavel V.
Большое спасибо всем за ответы, особенно Сергею и Shread! Мне шифрование сейчас ни к чему (случай как с неуловимым Джо, которого никто не ловит, потому что он никому не нужен), желательно максимально простое решение.
xgcyo
Мы делали следующим образом. Бутлоадер зашивался по джэйтэгу, ну а прошивка в зашифрованном виде по уарту. DTR и RTS линии использовалисть для сброса МК и переключения между бутлоадером и рабочей программой соответственно. К МК подключен мост от FTDI, который по 7-8 долларов у нас. Бутлоадер компилировался обычным образом, никаких "перемещений" векторов в нём нет. Функции всех прерываний бутлоадера содержали инструкцию безусловного перехода (branch) по адресам "сдвинутых" прерываний рабочей программы. Эти адреса задавались в скрипте для компоновщика. "Сдвинутые" прерывания находятся во флеше, сначала были в RAM, но от этой идеи отказались, т.к. возможны неприятные последствия, какие именно уже не помню.
Ещё надо разграничить адресное пространство для бутлоадера и рабочей программы, чтоб не перекрывались. Вот команды для компоновщика IAR, включая "перемещённые" вектора прерываний рабочей программы.

Для бутлоадера.
Код
// Constant data
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=EA00-FFDF

// Code
-Z(CODE)CSTART,ISR_CODE=EA00-FFDF
-P(CODE)CODE=EA00-FFDF

// Interrupt vectors
-Z(CODE)INTVEC=0xFFE0-0xFFFF
-Z(CODE)RESET=FFFE-FFFF


Для рабочей программы.
Код
// Constant data
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=4040-FFFF

// Code
-Z(CODE)CSTART,ISR_CODE=4040-FFFF
-P(CODE)CODE=4040-FFFF

// Interrupt vectors
-Z(CODE)INTVEC=0x4000-0x403F
-Z(CODE)RESET=403E-0x403F


Чтоб задействовать в IARе: Project -> Options -> Linker -> Config -> Linker command file -> Override default снять. Скопировать файл, который там указан в директорию своего проекта и добавить вышеописанные команды. Вы разберётесь.
Вобщем всё это интересно, можно свою мини-ось написать с отдельными экзешниками, мультизадачностью... Был бы вагон времени только. smile.gif
Сергей Борщ
Цитата(xgcyo @ May 24 2010, 16:23) *
"Сдвинутые" прерывания находятся во флеше, сначала были в RAM, но от этой идеи отказались, т.к. возможны неприятные последствия, какие именно уже не помню.
У меня с точностью до наоборот - прерывания в ОЗУ чтобы можно было в приложении и в загрузчике использовать разные обработчики на одних и тех же векторах без дополнительных ветвлений. А неприятные последствия только одни - случайное затирание этой таблицы в ОЗУ. Ну так к таким же последствиям может привести и случайное затирание стека.
Rud0x1
Здравствуйте.

Правильно ли я понимаю, что для F5529, в котором есть remapping таблицы векторов в RAM,я могу сделать следующее:

0. Сначала, через JTAG, в контроллер заливается bootloader.
1. Все вектора bootloader во flash (FF80-FFFE), кроме RESET, содержат адреса функций-трамплинов: BR <адрес ф-ции обработчика в главной программе>.
2. На старте bootloader выставляет бит SYSRIVECT. Таблица векторов маппится в RAM.
3. Меняем нужные вектора в RAM на адреса обработчиков bootloader, которые во flash, что б не бедствовать без прерываний в bootloader'е.
4. Используем прерывания в bootloader, заливаем прошивку во flash.
5. Делаем RESET через WDT из bootloader по окончанию работы.
thodnev
Интересно, кто-то заморачивался созданием usb-бутлоадера без всяких преобразователей и с минимальной обвязкой?
Shread
Цитата(thodnev @ Feb 4 2013, 17:42) *
Интересно, кто-то заморачивался созданием usb-бутлоадера без всяких преобразователей и с минимальной обвязкой?

Если речь про процессоры с 55xx, то да - TI заморачивался - юзаем оригинальный(с программной инициализацией)- вполне довольны.
Ave
Добрый день.
Не могли бы подсказать где находится оригинальный bootloader от TI.
Сейчас пытаюсь с компилировать из примеров. Компилятор говорит что мало место под прошивку в области BSL.
rezident
Цитата(Ave @ Apr 4 2013, 15:52) *
Не могли бы подсказать где находится оригинальный bootloader от TI.
Сейчас пытаюсь с компилировать из примеров. Компилятор говорит что мало место под прошивку в области BSL.

Про какой именно кристалл MSP430 вопрошаете?
Ave
Интересует кристалл MSP430F5528. И возможно прошить область BSL под работу с USB.
Shread
Цитата(Ave @ Apr 5 2013, 11:46) *
Интересует кристалл MSP430F5528. И возможно прошить область BSL под работу с USB.

Открываете оригинальный даташить на контроллер:
http://www.ti.com/lit/ds/symlink/msp430f5528.pdf и поиском по слову memory находим на 22й странице "Table 6. Memory Organization"
Как видно из таблицы часть флеш памяти отведена под USB bootloader "Bootstrap loader (BSL) memory (flash)"
Если памяти мало и бутлоадер родной не нужен, можно эту память использовать для своих нужд.
Ave
Добрый день

Спасибо за ответ. Пробывал передать управление в область BSL виснет процессор.
Смотрю в отладчике значение памяти 0x3fff. Возникает сомнение в наличие там кода.
Чем можно записать BSL область или как правильно передать управление.
jack_avenger
Цитата(Ave @ May 3 2013, 12:56) *
Добрый день

Спасибо за ответ. Пробывал передать управление в область BSL виснет процессор.
Смотрю в отладчике значение памяти 0x3fff. Возникает сомнение в наличие там кода.
Чем можно записать BSL область или как правильно передать управление.

Скорее всего Вы затерли BSL. Вот здесь есть софт чтоб перезаписать в область BSL, а вот где сам код взять - не знаю, наверное на TI
Ave
Спасибо за ответы.
Разобрался у MSP430F55xx стандартный загрузчик HID устройство с PID 0x0200 VID 0x2047.
Я в программе на РС изменил PID на 0x0301 и устройство не определялось.
slavokhire5
Привет всем. Делаю блютуз-бутлоадер для msp430. Флеш будет разбит на 2 части. По стартовым адресам сидит бутлоадер и проверяет, есть ли новый файл прошивки. Если есть - шьет. Если нет - переходит в область флеш, где записана основная прошивка.
Вопрос: как правильно настроить ИАР, чтобы он генерировал файл без отладочной инфо и всякого барахла, чтобы бутлоадр мог его писать сразу во флеш?

поставил во вкладку options->linker->output маркер other, выбрал output format: msp430-txt.
но меня смущает размер данных в получившемся файле - 2.5 кБ, а при билде иар сообщает, что размер кода должен быть около 900 байт. Что нужно еще настроить?
controller_m30
Если вместо формата "msp430-txt" выбрать в том-же списке формат "raw-binary" - то получится файл с расширением *.BIN, и готовым машинным кодом.
d7d1cd
Цитата(jack_avenger @ May 3 2013, 21:55) *
Скорее всего Вы затерли BSL.

Разве BSL можно стереть??? blink.gif
slavokhire5
Привет всем. Пишу бутлоадер для msp430f6721 в IAR.
Память разбил на 3 части:
- бутлоадер (E000-FFFF) - в памяти пока записан только он;
- рабочая программа (B000-DFFF);
- файл прошивки (8000-AFFF);
Пытаюсь записать бутлоадером тестовую страницу памяти (512 байт) по адресу 0x8000 - пишет правильно, но после повторного запуска отладки страница оказывается забита какими-то левыми данными.
Когда пытаюсь писать по адресу 0xC000 - все ок.
Помогите пожалуйста разобраться. грешу на настройки линкера. на всякий случай вот ф-ция записи флеш:
CODE
uint8_t flash_write(int addr, uint8_t *data)
{
flash_erase(addr);

char *addr_ptr;
char *data_ptr;
addr_ptr = (char*)(addr);
data_ptr = (char*)(data);

__disable_interrupt();
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation

for (uint16_t i = 0; i < MCU_PAGE_SIZE; i++)
{
*addr_ptr++ = *data_ptr++;
}

FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
while(BUSY & FCTL3);
__enable_interrupt();

addr_ptr = (char*)(addr);
data_ptr = (char*)(data);
for (uint16_t i = 0; i < MCU_PAGE_SIZE; i++)
{
if ((*data_ptr++) != (*addr_ptr++))
{
return MCU_FLASH_WRITE_ER;
}
}
return MCU_FLASH_WRITE_OK;
}


вот файл линкера для бутлоадера:
// -------------------------------------
// Code
//

-Z(CODE)CSTART,ISR_CODE,CODE_ID=E000-FF7F
-P(CODE)CODE,CODE16=E000-FF7F

// -------------------------------------
// Interrupt vectors
//

-Z(CODE)INTVEC=FF80-FFFF
-Z(CODE)RESET=FFFE-FFFF
KARLSON
Цитата(slavokhire5 @ Aug 28 2015, 13:50) *
но меня смущает размер данных в получившемся файле - 2.5 кБ, а при билде иар сообщает, что размер кода должен быть около 900 байт.

Это нормально. Т.к. значение байта во флеше отображено обычными символами (формат то текстовый выбрали), причём тремя. 1 символ на каждую декаду байта плюс пробел. Вот и получается 900 * 3 = 2700 байт.
slavokhire5
Привет всем. Пытаюсь разобраться с разблокированием JTAG на msp430f6721. Использую программатор MSP-FET (который черный, версия прошивки по утверждению MSPFlasher_1.3.8 - последняя), в качестве ПО - BSL_scripter v3.1.0.0. Win7 x64
после чтения бесчисленной документации от TI я пришел к выводу, что можно через BSL залить в МК прошивку, которая стирает адреса 0x17fc-0xf17ff (устанавливает в ff), тем самым сбрасывая лок JTAG-a
Проблема в том, что я не могу достучаться через BSL до МК - скриптер пытается что-то делать, довольно долго. Но содержимое флеш не меняется
Вот мой скрипт:
Код
LOG
MODE 6xx UART COM5
VERBOSE
RX_PASSWORD pass32_wrong.txt
MASS_ERASE
RX_DATA_BLOCK jtag_unlock.txt
TX_DATA_BLOCK 0x17f0 0x10 Data_Read.txt

COM5 в моей системе - MSP Application UART1

Схема включения:
Код
МК                      MSP-FET
RST/SBWTDO  -    TDO/TDI (pin1)
TEST/SBWTCK -    TCK       (pin7)
VCC            -    VCC_TOOL (pin2)
GND            -     GND (pin9)
BSL_TX        -     UART_TXD (pin12)
BSL_RX        -     UART_RXD (pin14)


пробовал эту схему включения, тоже без результата https://e2e.ti.com/cfs-file/__key/community...-Connection.png
mcheb
Для обращения к области BSL её надо разблокировать, иначе - сброс по ресету.
slavokhire5
Цитата(mcheb @ Mar 27 2016, 08:49) *
Для обращения к области BSL её надо разблокировать, иначе - сброс по ресету.


да, я знаю. я пробовал лочить JTAG из кода - получается. Теперь тем же кодом хочу его разлочить (только записывая ff). Но не могу его залить с помощью MSP-FET и BSL Scripter
mcheb
BSL Scripter должен уметь разлочивать область BSL. Пишите свой BSL Scripter.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.