Программатор flash‑памяти микроконтроллера MC68HC908JB8 (семейство HC08, Motorola/Freescale) для Linux. Состоит из программы для KDE 3 и простого адаптера на MAX232, который подключается к COM‑порту компьютера. Работает через ROM‑монитор, встроенный в микроконтроллер, поэтому заранее записывать в него загрузчик не нужно. Написан в 2007–2009 годах.
- Вход в режим монитора: передача 8‑байтового кода защиты и проверка результата (индикатор Security check: зелёный — доступ к flash открыт, красный — код не подошёл).
- Чтение, программирование и верификация flash (
$DC00–$FBFF, 8 КБ) и векторов прерываний ($FFF0–$FFFF). При ошибке верификации выводится окно с адресом. - Полное стирание flash (после подтверждения).
- Чтение и запись RAM (
$0040–$013F). - Загрузка прошивки из файла Motorola S‑record (
*.s19,*.sx): записи раскладываются по буферам flash, векторов и RAM, контрольные суммы проверяются. - Просмотр буферов RAM, flash и векторов в hex‑виде.
- Проверка связи миганием светодиодов на выводах PTD0 и PTD1 целевой платы.
- Сброс микроконтроллера линией DTR.
Если при выходе из сброса на вывод ~IRQ подано повышенное напряжение, микроконтроллер запускает не прошивку, а ROM‑монитор. Адаптер держит это напряжение на ~IRQ постоянно, а сбросом управляет программа через линию DTR.
Монитор общается с компьютером по одному проводу (линия DAT) на скорости 9600 бод, 8N1. Адаптер сводит на эту линию и передатчик, и приёмник COM‑порта, поэтому каждый отправленный байт возвращается дважды: сначала «аппаратное» эхо с самой линии, затем эхо монитора. Программа проверяет оба.
Сразу после сброса программа передаёт 8 байт кода защиты. Монитор сравнивает
их с байтами $FFF6–$FFFD во flash. Если они совпали, доступ к flash открыт
и бит 6 байта по адресу $0040 установлен — по нему программа и включает
индикатор.
Команды монитора, которыми пользуется программа:
| Код | Команда |
|---|---|
$4A |
READ — прочитать байт по адресу |
$49 |
WRITE — записать байт по адресу |
$1A |
IREAD — прочитать два следующих байта |
$19 |
IWRITE — записать следующий байт |
$0C |
READSP — прочитать указатель стека |
$28 |
RUN — выйти из монитора и выполнить программу |
Монитор умеет только читать и писать память, поэтому flash программируется
подпрограммами, зашитыми в ПЗУ микроконтроллера. Программа снимает защиту
flash (FLBPR = $FF), записывает частоту шины в переменную CPUSPD и для
каждого блока в 64 байта:
- загружает данные блока в буфер RAM
$004C–$008B, а адрес его последнего байта — в переменнуюLADDR; - кладёт в RAM по адресу
$0040заглушку из трёх команд:LDHX #адрес,JSR $FC09,SWI; - заменяет в кадре стека монитора адрес возврата на
$0040и подаёт команду RUN. Заглушка вызывает подпрограмму записи из ПЗУ, аSWIвозвращает управление монитору.
Блоки, целиком состоящие из $FF, пропускаются. Верификация устроена так же,
но вызывает $FC03, а затем читает из стека регистр CCR: сброшенный флаг C
означает расхождение. Полное стирание — вызов $FC06 с битом 6
в переменной CTRLBYT.
Карта памяти MC68HC908JB8 (как в src/serialio.h):
| Область | Адреса |
|---|---|
| RAM | $0040–$013F |
| Заглушка, которую запускает программа | с $0040 |
Переменные подпрограмм ПЗУ CTRLBYT, CPUSPD, LADDR |
$0048, $0049, $004A–$004B |
| Буфер данных подпрограмм ПЗУ | $004C–$008B |
| Flash | $DC00–$FBFF |
| ПЗУ монитора | $FC00–$FDFF, $FE10–$FFDF |
Регистры flash FLCR, FLBPR |
$FE08, $FE09 |
| Векторы прерываний | $FFF0–$FFFF |
Уровни RS‑232 преобразует MAX232 (IC1).
- DAT. Линия подтянута к VCC резистором R4. Сигнал TXD проходит через приёмник MAX232 и диод D1, который может только прижать DAT к нулю, поэтому линию по очереди используют и компьютер, и микроконтроллер. Состояние DAT через передатчик MAX232 попадает на RXD — отсюда «аппаратное» эхо.
- ~RST. Сигнал DTR через приёмник MAX232 подаётся на ~RST (подтяжка — R3): пока DTR включена, микроконтроллер в сбросе.
- ~IRQ. Повышенное напряжение для входа в монитор берётся с вывода V+ MAX232 через резистор R2. Стабилитрон D2 ограничивает его, конденсатор C7 сглаживает.
- Питание. +7 В с контакта 5 разъёма PC через предохранитель F1 и стабилизатор 7805 (IC2) превращаются в +5 В (VCC). VCC выведено и на контакт 2 разъёма ICD. Зелёный светодиод LED1 показывает наличие питания.
Разъёмы (5 контактов):
| Контакт | ICD (к микроконтроллеру) | PC (к COM‑порту) |
|---|---|---|
| 1 | GND | GND |
| 2 | VCC (+5 В) | RXD |
| 3 | ~IRQ | TXD |
| 4 | ~RST | DTR |
| 5 | DAT | +7 В |
Детали: MAX232, стабилизатор 7805L, предохранитель F1, зелёный светодиод, резисторы 220 Ом (R1), 2 кОм (R2), 10 кОм (R3, R4), конденсаторы 1 мкФ (C1–C5, C7), 10 мкФ (C6), 100 нФ (C8), диод D1, стабилитрон D2.
Плата односторонняя:
![]() Разводка |
![]() Сторона компонентов с маркировкой |
![]() 1. Рисунок дорожек на меди перед травлением |
![]() 2. После травления |
![]() 3. После лужения |
![]() 4. Сторона пайки после монтажа |
В окне программы — hex‑просмотр трёх буферов (RAM, flash и векторы), индикатор прогресса и кнопки. В надписях интерфейса flash называется «EEPROM».
| Кнопка | Действие |
|---|---|
| Enter Monitor mode | открыть порт, передать код защиты, показать результат на индикаторе Security check |
| Read EEPROM | прочитать flash и векторы в буферы |
| Prog EEPROM | записать в flash буферы flash и векторов |
| Verify EEPROM | сверить flash и векторы с буферами |
| Erase EEPROM | стереть всю flash |
| Read from RAM | прочитать RAM в буфер |
| Write to RAM | записать буфер в RAM |
| Load from S19 | загрузить файл S‑record в буферы |
| Save to S19 | не реализовано |
| LED Flash Test | семь раз мигнуть светодиодами на PTD0 и PTD1 |
| Reset microcontroller | сбросить микроконтроллер линией DTR |
Обычный порядок прошивки: Enter Monitor mode → Load from S19 → Erase EEPROM → Prog EEPROM → Verify EEPROM.
Ход работы и ошибки программа пишет в консоль (qDebug), поэтому её удобно
запускать из терминала.
Параметров командной строки нет, всё задаётся в исходниках:
| Что | Где | По умолчанию |
|---|---|---|
| Последовательный порт | src/hc08progwidget.cpp, buttonEnterMonitor_clicked() |
/dev/ttyS0 |
| Код защиты | там же, securityBytes |
FF FF FF FF DF D6 FF FF |
| Модель микроконтроллера | src/serialio.h, #define JB8 / JB12 / JB16 |
JB8 |
| Скорость порта | src/serialio.h, SPEED |
9600 бод для JB8, 19200 для JB12 и JB16 |
Частота шины (для CPUSPD) |
src/serialio.h, BUS_SPEED |
3 МГц для JB8 (кварц 6 МГц), 6 МГц для JB12 и JB16 (кварц 12 МГц) |
Код защиты должен совпадать с байтами $FFF6–$FFFD прошивки, которая сейчас
записана в микроконтроллер. В исходниках стоит код прошивки «usbgadget»
автора (рядом в комментарии — код «usbgadget2»). У стёртого микроконтроллера
все восемь байт равны $FF.
Для JB12 и JB16 в src/serialio.h заданы свои адреса RAM, flash, векторов
и переменных подпрограмм ПЗУ.
Нужны g++, make, Qt 3 и kdelibs 3 (KDE 3.5) с заголовочными файлами. В современных дистрибутивах KDE 3 нет, поэтому собирать проще в виртуальной машине или контейнере со старым дистрибутивом, где есть KDE 3.5.
Файлы, которые генерирует autotools (configure, Makefile.in и другие),
уже лежат в репозитории:
./configure
make
sudo make installПересоздать их командой make -f Makefile.cvs можно только autotools тех
лет: admin/cvs.sh принимает autoconf 2.5x–2.6x и automake 1.6–1.10.
Проект разрабатывался в KDevelop 3, его файл — hc08prog.kdevelop.
Пользователю нужны права на чтение и запись порта. Обычно достаточно
добавить его в группу dialout и перелогиниться:
sudo usermod -aG dialout "$USER"- Порт, код защиты и модель микроконтроллера задаются только в исходниках. Поле «Security Code» в окне пока ни на что не влияет.
- Сохранение в S19 («Save to S19») не реализовано.
- Из файлов S‑record берутся только записи S1 (16‑битные адреса).
- Ошибки видны в основном только в консоли.
- Программа рассчитана на Linux (termios) и KDE 3.
| Файл | Назначение |
|---|---|
src/main.cpp |
main(): сведения о программе, запуск приложения KDE |
src/hc08prog.h, src/hc08prog.cpp |
главное окно (KMainWindow) |
src/hc08progwidgetbase.ui |
форма окна (Qt Designer) |
src/hc08progwidget.h, src/hc08progwidget.cpp |
обработчики кнопок; буферы RAM, flash и векторов; раскладка S‑записей по буферам |
src/serialio.h, src/serialio.cpp |
порт (termios), команды монитора, чтение и запись RAM, программирование, верификация и стирание flash; карты памяти JB8, JB12, JB16 |
src/srecord.h, src/srecord.cpp |
чтение файлов Motorola S‑record (S0, S1, S9) с проверкой контрольных сумм |
src/qhexview.h, src/qhexview.cpp |
виджет hex‑просмотра на QGridView |
src/hc08progui.rc, src/hc08prog.desktop, src/hi*-app-hc08prog.png |
меню, ярлык и значки для KDE |
admin/, configure.in.in, Makefile.am, Makefile.cvs |
система сборки KDE 3 (autotools) |
hc08prog.kdevelop |
проект KDevelop 3 |
photos/ |
схема, разводка и фотографии платы адаптера |
GNU General Public License версии 2 или (на ваш выбор) любой более поздней,
см. COPYING.
© 2007–2009 Oleg Khudyakov (Олег Худяков), prcoder@gmail.com







