Посты

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

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

При разработке бутлоадера мы всегда ограничены размером страницы: он может занимать ровно одну, две или несколько страниц, но не может быть меньше страницы. Это очень упрощает разработку, потому что стирать флеш мы можем только постранично. В случае младших серий 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]

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