1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ecbm-stc8-bootloader-tiny

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
README.md 22 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 8 дней назад 9078b1e

STC8-BOOTLOADER-TINY

Введение

Серия микроконтроллеров STC всегда была известна возможностью загрузки и записи прошивки без использования программатора. Эта возможность реализуется за счет встроенного BootLoader-кода внутри чипа. Код запускается при включении питания микроконтроллера, поэтому STC всегда использовал "холодное" запускание для загрузки.

Однако с появлением STC8 "холодное" запускание стало менее надежным. Это не связано с ошибками программы, а вызвано расширенным диапазоном рабочего напряжения микроконтроллера. У старых 5-вольтовых микроконтроллеров STC напряжение могло снижаться до 3 вольт и восстанавливаться до 5 вольт, чтобы активировать BootLoader. Теперь же STC8 может работать при напряжении всего 1,9 вольта, даже обратный ток через последовательный порт может поддерживать работу микроконтроллера, делая невозможной "холодную" загрузку.

А почему бы вам самим не создать BootLoader? Этот проект поможет вам реализовать свою идею создания BootLoader, если вы понимаете его принцип работы, то сможете легко применять его в продукте!### Преимущества

  • Независимость от протокола связи; можно использовать UART, I2C, SPI или даже создать свой протокол.
  • Независимый BootLoader; даже если загрузка или установка приложения прерывается, это не повредит BootLoader.
  • Независимое приложение; нет необходимости выполнять какие-либо настройки в проекте приложения, не требуется никаких изменений в BIN-файле приложения. Достаточно того, чтобы в приложении не были команды, которые очистят область BootLoader.
  • Различные режимы запуска; можно использовать один вход для запуска BootLoader (классическое использование) или запустить BootLoader после обмена данными между приложением и BootLoader (более гибкий подход).### Недостатки
  • Количество доступной памяти Flash немного уменьшается из-за использования BootLoader.
  • При активации BootLoader используется один из доступных входов.
  • Отсутствие шифрования передачи данных, что увеличивает риск прослушивания.

Но это всё ещё версия Tiny, которая реализует базовую функциональность BootLoader. На её основе можно добавить необходимые компоненты.

Примеры окружения

Версия KEIL V9.59.0.0
C Compiler V9.59.0.0
Ассемблер V8.2.7.0
Линкер V6.22.2.0
Библиотекарь V4.30.1.0
Конвертор HEX V2.7.0.0
DLL CPU V3.122.0.0
DLL Диалог V2.66.0.0

Пример аппаратной конфигурации

Микроконтроллер STC8A8K64S4A12 использует P0.0 как вход для запуска BootLoader.

Расход ресурсов

Уровень оптимизации 8 уровень
Область DATA 28 байт
Область XDATA 512 байт
Область FLASH 1375 байт
  1. Откройте STC-ISP инструмент, выберите модель микроконтроллера. (В данном примере используется STC8A8K64S4A12).
  2. Выберите COM-порт, который фактически подключен, затем нажмите "Открыть программный файл" и выберите hex-файл, сгенерированный BootLoader проектом.
  3. Временные метки и скорость передачи в примерах кода настроены на частоту 24 МГц, рекомендуется выбрать 24 МГц. При выборе другой частоты потребуется изменение кода.
  4. Не забудьте установить пространство EEPROM до максимального значения для данной модели (например, для STC8A8K64S4A12 максимальное значение составляет 64 КБ). Затем нажмите "Загрузить", после чего выполните холодное запуск.
  5. После успешной загрузки подготовка BOOT-конца завершена. Настраиваемая плата теперь поддерживает загрузку через IAP.Использование STC-ISP для загрузки BootLoader

Подготовка APP конца

  1. Для APP конца требуется минимальная настройка. Однако текущий BootLoader поддерживает только bin файлы, поэтому hex файл, сгенерированный в Keil, следует преобразовать в bin файл.
  2. Откройте файл APP программы с помощью инструмента stc-isp, затем нажмите кнопку "Сохранить данные" в правом нижнем углу окна программы. Сохраните его в формате bin.### Шаги загрузки APP Принцип работы BootLoader заключается в "приёме данных -> записи в FLASH". Поэтому можно самостоятельно модифицировать версию для загрузки через SPI или IIC. В данном примере используется последовательный порт, поэтому потребуется последовательный порт помощник. Рекомендуется использовать SSCOM, так как он имеет задержку при отправке данных, что позволяет BootLoader программе записывать полученные данные в Flash во время этой задержки.
  3. Откройте SSCOM, нажмите "Отправить" -> "Настройка задержки при отправке файла" -> "Задержка 50 мс после каждого отправленного пакета размером 256 байт".
  4. Нажмите "Открыть файл", выберите файл bin для загрузки.
  5. Откройте последовательный порт, установите скорость передачи на 115200 бод, если требуется другая скорость, то её следует изменить в коде.
  6. Установите ногу BOOT в высокое состояние (в данном примере нога BOOT определена как P0.0, и она находится в низком состоянии при запуске APP, а в высоком — при запуске BootLoader). После перезапуска микроконтроллера, последовательный порт выведет "[BOOT]", что указывает на успешное вход в BootLoader программу.
  7. Отправьте английскую букву '! ' для разблокировки. Обратите внимание, чтобы не использовался кириллический алфавит ('! '), который занимает два байта вместо одного. 6.После успешной разблокировки микроконтроллер отправит сообщение "[Очистка]" на последовательный порт, что указывает на процесс очистки FLASH, где старый APP будет удален. Через некоторое время будет показано сообщение "[Старт]", после чего достаточно нажать кнопку "Отправить файл" в SSCOM для загрузки bin файла на микроконтроллер.

После получения данных, количество принятых байтов будет отображено на последовательном порту для сравнения. Затем программа автоматически запустится. После этого, достаточно установить ногу BOOT в низкое состояние, чтобы продолжать работу APP.

Аномальные ситуации

  1. Получение «[Time Out]» — это происходит потому что программа BootLoader не может бесконечно ждать. После отправки микроконтроллером сообщения «[Start]», он начинает ждать 2 секунды. Если за эти 2 секунды данные не приходят, микроконтроллер переходит в состояние простоя (timeout). Обычно после простоя автоматически запускается снова программа BootLoader, поэтому достаточно повторной отправки символа '!'.
  2. Получение «[Lock]» — чтобы предотвратить случайное скачивание некорректных данных, сразу после входа в программу BootLoader Flash не очищается. Очистка Flash происходит только после получения символа '!'. Если вместо '!' будет отправлен другой символ, микроконтроллер считает это ошибочным сигналом связи и переходит в заблокированное состояние. В этом состоянии микроконтроллер больше не принимает данные, и требуется его перезапуск.
  3. Количество полученных байтов отличается от количества отправленных байтов — это указывает на то, что при передаче 256 байт верхнее устройство (например, COM Port Monitor) не предоставляет достаточное время для записи данных микроконтроллером. Поскольку во время записи в Flash CPU прекращает реагировать на прерывания, часть данных может быть потеряна.Поэтому рекомендуется использовать SSCom для загрузки через последовательный порт, так как эта программа имеет функцию задержки передачи файла, которая эффективно решает эту проблему.
  4. Получение «[Overflow]», это указывает на то, что объем полученных данных превышает доступное пространство памяти микроконтроллера, вследствие чего микроконтроллер переходит в заблокированное состояние. В этом состоянии микроконтроллер больше не принимает данные, и требуется его перезапуск.

Описание конфигурации BOOT пинов

Изменение отображения BOOT пина

На строке 9 файла main.c.

#define BOOT_PIN P00 //BOOT пин установлен как P0.0.

Измените макрос BOOT_PIN, чтобы назначить конкретный входной/выходной пин в качестве BOOT пина.

Изменение логики работы BOOT пина

На строке 10 файла main.c.

#define BOOT_RUN_APP 0 //Когда уровень BOOT пина низкий, запускается APP.
  • Измените макрос BOOT_RUN_APP на 0, чтобы указать, что при низком уровне BOOT пина запускается APP.
  • Измените макрос BOOT_RUN_APP на 1, чтобы указать, что при высоком уровне BOOT пина запускается APP.

Отключение проверки BOOT пина

Удалите строки с 8 по 10 файла main.c.

/*-----------------------------------------Определение BOOT пина-----------------------------------------*/
#define BOOT_PIN P00 //BOOT пин установлен как P0.0.
#define BOOT_RUN_APP 0 //Когда уровень BOOT пина низкий, запускается APP.

Измените код проверки APP на строках 267–272 файла main.c.

/*------------------------------------------Проверка APP---------------------------------------*/
``````c
jmp_app = (u32) read_boot_addr; // По умолчанию адрес BootLoader передается в адрес APP, чтобы предотвратить случайные переходы.
if ((read_app_flag & PD_APP_OK) == APP_OK) { // Проверьте корректность программы.
    jmp_app = (u32) read_app_addr; // Если программа корректна, передайте адрес APP в функцию перехода.
    if (BOOT_PIN == BOOT_RUN_APP) { jmp_app(); } // Если уровень BOOT пина позволяет переход к APP, выполните переход.
}

Как изменить объем флеш-памяти

Пример кода предназначен для микросхем с флеш-памятью объемом 64 КБ. Если используется микросхема с флеш-памятью объемом 17 КБ, то потребуется внести изменения в следующие места.#### Изменение адреса сохранения состояния Программа BootLoader хранится в последних 2КБ адресов чипа, а состояние BootLoader сохраняется в последнем секторе этих 2КБ. Поскольку один сектор составляет 512 байт, для микросхемы с флеш-памятью объемом 64КБ начальный адрес будет равен 0xFE00.

#define BOOT_STATUS 0xFE00 // FE00 : состояние области BootLoader
#define BOOT_JMP_ADDR 0xFE01 // FE01~FE02 : адрес перехода программы BootLoader
#define APP_START 0xFE03 // FE03 : начало области APP
#define APP_MAX 5 // APP_MAX : размер области APP в секторах
#define APP_STATUS 0xFE03 // FE03 : состояние области APP
#define APP_SIZE 0xFE04 // FE04~FE05 : размер области APP
#define APP_JMP_ADDR 0xFE06 // FE06~FE07 : адрес области APP

Если требуется изменение, то следует изменить строки с 15 по 22 в main.c. Адреса не обязательно должны быть непрерывными, но важно, чтобы они не пересекались!

Например, если использовать микросхему с флеш-памятью объемом 17КБ, то значение BOOT_STATUS можно установить как 0x4200. Остальные значения следует корректировать аналогичным образом.

Изменение количества секторов области APP

При изменении объема флеш-памяти количество используемых секторов области APP также изменится. Для этого достаточно изменить строку 24 в main.c.

#define DATA_MAX 124 // максимальное значение области APP, единица измерения - секторы. Один сектор составляет 512 байт.
```Если последние 2 КБ адресов используются для BootLoader, то это составляет 4 сектора. В случае микросхемы с флеш-памятью объёма 64 КБ общее число секторов равно 128, поэтому `DATA_MAX` устанавливается в 124.Поэтому при увеличении размера BootLoader или использовании микросхемы с меньшим объемом флеш-памяти (`17 КБ`) значение `DATA_MAX` следует уменьшить в соответствии с реальными условиями.

### Как изменить частоту тактового сигнала
Программа по умолчанию работает на частоте 24 МГц. При необходимости снижения энергопотребления или повышения производительности следует учесть несколько моментов, связанных с тактовым сигналом.

#### Изменение внутреннего RC-генератора
Измените фактическую частоту в программе STC-ISP, затем перезагрузите BootLoader. Перед загрузкой убедитесь, что программа BootLoader была изменена для корректной работы таймера, скорости передачи данных и времени ожидания EEPROM.

#### Изменение начального значения таймера
Измените строки с 71 по 74 в main.c. Начальное значение таймера может быть сгенерировано программой STC-ISP.

```c
AUXR = 0x40; // Частота таймера 1 равна Fosc, то есть 1T
TMOD = 0x00; // Установка таймера 1 в режим автоматического перезаполнения 16-битного счетчика
TL0 = 0xC0; // Установка начального значения таймера
TH0 = 0x63; // 20 мс

Изменение скорости передачи данных

Изменение скорости передачи данных влияет на основную частоту тактового сигнала, поэтому оба этих параметра требуют внимательного подхода.

Измените строки 75 и 76 в main.c.```c TL1 = 0xCC; // Установка начального значения


```markdown
TH1 = 0xFF;        // Установка начального значения

EEPROM для STC8A и STC8F

Длительность ожидания при стирании и записи EEPROM этих моделей хранится в регистре IAP_CONTR. Необходимо изменить строки 170 и 190 файла main.c.

IAP_CONTR = 0x81; // Включение IAP

Для конкретных значений рекомендуется обратиться к руководству пользователя для STC8F и STC8A.

EEPROM для STC8G и STC8H

Длительность ожидания при стирании и записи EEPROM этих моделей хранится в регистре IAP_TPS. Необходимо изменить строку 257 файла main.c.

IAP_TPS = 24; // Настройка для STC8G и STC8H, значение по умолчанию — 24 МГц.

Значение должно быть округлено до целого числа в единицах МГц, например, если частота тактирования составляет 11.0592 МГц, то округление будет равно 11.

Комментарий ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/ecbm-stc8-bootloader-tiny.git
git@gitlife.ru:oschina-mirror/ecbm-stc8-bootloader-tiny.git
oschina-mirror
ecbm-stc8-bootloader-tiny
ecbm-stc8-bootloader-tiny
master