Тестовая версия UART загрузчика для STM8.
Ранее рассмотренный прототип UART-загрузчика для микроконтроллеров STM8S103F3P/STM8S003F3P перешел в стадию пробной версии. Пробной версии в смысле бета-тестирования. Ни каких ограничений по времени и количествам запусков он не имеет.
Проект был написан в среде разработки STVD на языке ST Assembler. Код в статье приводить не буду, уж слишком объемный он, просто дам ссылку на него.
Характеристики
Я уже озвучивал требования. Теперь приведу характеристики написанного загрузчика:
- область занимаемой памяти: 0x9C00-9FFF и 0x8000-0x8003*;
- время перехода к целевой программе: ~10 мкс**;
- активация загрузчика: вывод отладчика (SWIM/PD1);
- формат для загружаемой прошивки: Intel HEX;
- интерфейс: терминал/UART;
- метод программирования: побайтовая запись;
- скорость программирования: ~75 байт/с.
(**) Начальный код проверки необходимости запуска загрузчика и последующего освобождения используемых ресурсов занимает ~45 байт и просит ~30тактов. Таким образом, можно считать, что при частоте в 2МГц время выполнения проверки составит не более 10мкс. На практике время не замерял.
Что не реализовано
Далее приведу список желаемых доработок в порядке снижения их приоритета:
- программирование Option bytes - [необходимо];
- аналог Readout protection, стирание прошивки перед записью новой - [желательно];
- разбор Motorola S-record вместо Intel HEX;
- запись словами (Word programming) при возможности;
- отдельная версия загрузчика для защищенной от записи области (для встраивания в проекты).
Предложения и пожелания оставляйте через мои контакты или коммментаиями в сообществе к соответствующему посту
Прошивку удалось поместить в 1кБайт памяти. Ещё имеется возможность оптимизации, что будет полезно при последующей доработке.
Как пользоваться
Прошивку самого загрузчика в микроконтроллер придется загружать в помощью какого-нибудь программатора и соответствующего ПО. С этим ничего не поделаешь. Предположим, что вы уже это сделали.
К выводам RX и TX подключаем преобразователь интерфейса UART, подключенный к компьютеру. На компьютере открываем соответствующий COM-порт и настраиваем его на: 9600бод, 8бит данных, без бита четности, 1 стоп бит. Так же указываем программный контроль передачи данных (XON/XOFF). Надо отметить, что загрузчик эгоист, и использует контроль только в своих целях, чтобы ему не слали данные, сам при этом совершенно игнорирует таковые указания. В прочем для компьютера это не проблема, при работе с загрузчиком компьютеру достаточно своего буфера данных и он не пытается запретить передачу данных загрузчиком.
Что бы активировать загрузчик, надо прижать к земле вывод SWID/PD1 (для версии stm8boot_d2 проверяется вывод PD2) и произвести сброс микроконтроллера/подать питание. В терминале должно появится приветствие:
STM8 ASM TopFlash bootloader (q - quit)Загрузчик активировался и готов к приему прошивки.
Копируем текст целевой прошивки в окно терминала. Каждую строку кода загрузчик обрабатывает отдельно и подтверждает в случае успешного завершения программирования:
:1080000082008178820081A4820081A4820081A400 Ok.
:10801000820081A4820081A4820081A4820081A4C4 Ok.
:10802000820081A4820081A4820081A4820081A4B4 Ok.
:10803000820081A4820081A4820081A4820081A4A4 Ok.
Если же при вводе возникли ошибки или прошивка содержит недопустимый адрес, будет выдано сообщение об ошибке:
:109C0000FFFFFFFFAE03FF94721350117212501248 Error duaring process.
Надо заметить, что прошивку следует вводить без ошибок, т.к. не поддерживается возможность исправления вводимой строки. Так нет обработки backspace, delete, стрелок навигации и прочих служебных клавиш. Правильно будет именно копировать прошивку из файла (ну или просто направить файл на вывод в порт). Или просто игнорируйте сообщение об ошибке при неправильном вводе и повторно вводите строку.
В случае ввода недопустимой команды будет выведено сообщение:
Wrong format.Оно же выводится и при получении пустых строк (простое нажатие клавиши <Enter>).
Для выхода из режима программирования надо набрать строку, начинающуюся с символа q или Q (не забудьте завершить ввод строки клавишей <Enter>). Проверяется только первый символ строки, поэтому остальные символы не имеют значения. Если микроконтроллер не содержит прошивку, то выход не возможен и будет выдано сообщение:
Firmware missed.Если же прошивка была загружена (сейчас или раннее), то ей будет передано управление.
Так же можно выйти, освободив вывод SWIM/PD1 (может быть освобожден в любое время после активации загрузчика) и сбросив микроконтроллер.
Ститать домустимым cообщение об ошибке для строки с кодом 04, например в строке:
:020000040000FA
Это запись из формата Intel HEX Extended для задания более 64кБ и в нашем случае всегда имеет нулевое значение.
Результат
видео процесса загрузки двух тестовых прошивок
Первая прошивка ~436 байт мигает светодиодом на выводе PD3. Вторая ~526 байт использует встроенный модуль BEEPER для выдачи звука на вывод PD4. Обе прошивки выводят в терминал сообщения (скорость та же 9600бод).
Кто хочет проверить
Прошивки загрузчика и тестовых программ для stm8s103f3 - тут.
Подключение:
// PD5 - 2 in TSSOP20 - tx
// PD6 - 3 in TSSOP20 - rx
// PD4 - 1 in TSSOP20 - beeper - для тестовой программы testsound
// PD3 - 20 in TSSOP20 - led - для тестовой программы testblink
// PD2 - 19 in TSSOP20 - boot switch - для загрузчика *_d2.s19
// PD1 - 18 in TSSOP20 - boot switch - для загрузчика *_d1.s19
Прошивка stm8boot_d1 использует для активации вывод SWIM/PD1.Прошивка stm8boot_d2 использует вывод PD2 и имеет команду d - распечатывающую содержимое EEPROM-памяти микроконтроллера. Для проверки можно использовать следующие заготовки:
Fill EEPROM up
:1040000000112233445566778899AABBCCDDEEFFB8
:00000001FF
Clear EEPROM up
:1040000000000000000000000000000000000000B0
:00000001FF
Fill EEPROM 0x20
:01402000346B
:00000001FF
Clear EEPROM 0x20
:01402000009F
:00000001FF
Проект для среды STVD с исходными кодами загрузчика для stm8s103f3 - тут.
Проект и не имеет никаких ограничений на использование. Хоть копируйте, хоть продавайте, но я не несу ответственности за ваши действия и последствия использования кода. Так сказать лицензия типа BSD.