Посты

  • Прячь код и вызывай чужие функции!

    Хорошая техника для уменьшения размера прошивки — перенос функций в бутлоадер. Если в коде есть какие-то большие функции, которые не будут изменяться в будущем (например, настройка периферии или инициализация массивов) — имеет смысл навсегда спрятать их в бутлоадер и не передавать их снова при каждой перепрошивке.

    При разработке бутлоадера мы всегда ограничены размером страницы: он может занимать ровно одну, две или несколько страниц, но не может быть меньше страницы. Это очень упрощает разработку, потому что стирать флеш мы можем только постранично. В случае младших серий STM32F1 это означает, что бутлоадер квантуется по 1 килобайту.

    Если мы сможем уместить бутлоадер в небольшой размер (например, 300 байт), то у нас останется целых 700 байт пустого пространства, которое можно использовать для хранения кода или данных. Соответственно, размер основной прошивки уменьшится на те же 700 байт, а с учётом двукратного её размещения во флеше (текущая и новая) — на все полтора килобайта. Это уменьшает требования к объёму памяти микроконтроллера, ускоряет передачу прошивки, и конечно ускоряет её компиляцию и сборку.

    Чем больше выделяемый кусок кода — тем выгоднее. Вынос lwIP в бутлоадер экономит вам 55 килобайт, которые можно использовать для других задач, или взять кристалл с меньшим объёмом памяти, а то и обеспечить хранение трёх прошивок в памяти (текущая, новая и резервная) для увеличения надёжности.

  • Push-Pull преобразователь с использованием STM32F103

    Автор: Dzinn

    Введение

    Так уж сложилось, что интересная тема в вузе потребовала собрать интересный импульсный блок питания. До этого момента, автор уже много раз собирал однотактные преобразователи: прямоходовые и обратноходовые, на основе микроконтроллеров STM32F031 и STM32F103 и собственных печатных плат. Но тут встал вопрос с двухтактными преобразователями, которые требуют принципиально другого управления, что первоначально поставило в тупик. Решение ряда проблем, с которыми столкнулся автор приведено в данной статье.

    Железо

    Так уж случилось, что силовые платы разводить приходится с завидным постоянством, поэтому немного думая, использую компоненты, которых было навалом от старых проектов, была собрана простенькая отладочная плата для проверки расчетов и подготовке к «большому проекту». Схема предоставлена на рис.1, разводка платы на рис.2, и получившийся внешний вид на рис.3.

    1

    Рис.1. Схемотехническое описание отладочной платы

  • Вставка файлов в прошивку

    Часто бывает нужно использовать в прошивке какой-то файл: картинку, музыку, набор файлов для создания веб-страницы, а иногда и ещё одну прошивку.

    Есть программы вроде bin2h, но по-моему скачивать программу на один раз неудобно. Поэтому я написал онлайн-сервис для конвертирования бинарных файлов в сишный header.

    Принцип работы конвертера

    Работает всё очень просто. загружаете файл, выбираете ширину слова данных (можно выбрать 1, 2 или 4 байта), смотрите в текстовом поле как будет выглядеть файл, и скачиваете готовый хедер себе. В текстовом поле отображается только первые символы файла, потому что объём хедера может достигать десятков мегабайт. Довольно тяжело отобразить такой объём в браузере, поэтому скачивайте файл.

    generator

    Например, бинарный файл <7c f0 00 20 61 ef 01 00 65 e8 01 00 6d e8 01 00 75 e8 01 00 75> мой сервис превратит в

    char data[] = {0x7C, 0xF0, 0x00, 0x20, 0x61, 0xEF, 0x01, 0x00, 0x65, 0xE8, 0x01, 0x00, 0x6D, 0xE8, 0x01, 0x00, 0x75, 0xE8, 0x01, 0x00, 0x75}

    Теперь можно либо скопировать текст файла в вашу программу, либо подключить файл директивой #include.

    В заключение хочу сказать что для этих целей можно использовать SD-карту, но это не очень удобно, особенно в массовом производстве. SD-разъём и карта стоят денег, на них нужно отдельно закачивать данные, они требуют использования библиотек для работ с картой и файловой системой.

  • Разбор .svd-файлов из IAR (описания регистров STM32)

    Для одной задумки с битбэндингом мне потребовался полный список регистров всех модулей STM32. Моя старшая сестра (лень вперёд меня родилась) запретила мне рыскать по даташитам на все контроллеры и выписывать данные о регистрах, поэтому в IARе нашлись файлы вида stm32f100xx.svd.

    Это xml-файл с кучей инфы про модули STM: модули, их регистры, начальные значения и отдельные биты регистров, прерывания. Про каждую сущность есть сводка, например каждый модуль имеет название, описание и стартовый адрес.

    Для регистров и битов тоже есть название, описание и смещение относительно базового адреса.

    Прерывания — название, описание и номер.

    Инфы много, она полезная, и можно не парсить даташиты. Будем парсить этот файл — перетащим его в js, оставим только нужные данные, и превратим относительные адреса в абсолютные.

  • BitBanding в ARM Cortex — доступ к отдельным битам регистров

    В ядрах ARM Cortex есть удобный способ для доступа к отдельным битам регистров. Каждый бит получает свой виртуальный регистр, в который можно записать 0 или 1.

    Номера регистров битбэндинга формируются так:

    0x42000000 + (регистр - 0x40000000) * 0x20 + номер_бита * 4.

    Использование битбэндинга

    Рассмотрим пример. Вам нужно выполнить операцию

    GPIOC->CRH |= GPIO_CRH_MODE9_0;

    Эта операция в ассемблерном коде занимает 6 полуслов = 12 байт:

    0x4815          LDR.N    R0, [PC, #0x54]
    0x6800          LDR      R0, [R0]
    0xf050 0x0010   ORRS.W   R0, R0, #16
    0x4913          LDR.N    R1, [PC, #0x4C]
    0x6008          STR      R0, [R1]

    Теперь то же самое через битбэндинг. Требуется установить четвёртый бит регистра № 0x40011004, вычисляем адрес бита: 0x42000000 + (0x40011004 — 0x40000000) * 0x20 + 4 * 4 = 0x42220090. Устанавливаем бит (достаточно записать 1 в этот регистр):

    *(uint32_t*)0x42220090 = 1;

    Ассемблерный код теперь занимает в два раза меньше места:

    0x2001          MOVS     R0, #1
    0x4914          LDR.N    R1, [PC, #0x50]
    0x6008          STR      R0, [R1]

    Для удобства вычислений я сделал онлайн-калькулятор битбэндинга, он даже сразу генерирует код.

subscribe via RSS