Files

firmware/

Цель

Прошивка для Blue Pill, которая снимает аудио с MAX4466, считает уровень в dBFS и доминантную частоту, мигает LED с частотой звука и публикует метрики по USB CDC в формате фиксированного бинарного пакета.

Железо

  • STM32F103C8T6 (Blue Pill, 72 МГц, 64К Flash, 20К RAM).
  • Микрофон: MAX4466 (выход → PA1 / ADC1_IN1, питание 3.3 В).
  • USB FS через TinyUSB CDC (Virtual COM).
  • Светодиод: PC13 (on = 0, off = 1).

Обработка аудио (DSP)

  • Частота дискретизации: 22050 Гц (AUDIO_SAMPLE_RATE).
  • DMAбуфер: 2×512 выборок uint16_t (двойная буферизация через half/full interrupt).
  • RMS считается по формуле (\mathrm{RMS} = \sqrt{\frac{1}{N}\sum_{i=1}^{N} x_i^2}) после удаления среднего и нормализации к диапазону около ([-1, 1]).
  • Перевод в dBFS: (\mathrm{dBFS} = 20 \log_{10} (\mathrm{RMS} + \varepsilon)), где (\varepsilon) — малый стабилизатор для нуля.
  • FFT: arm_rfft_fast_f32 на 512 точках, Hannокно рассчитывается “на лету” через arm_cos_f32.
  • Поиск пика по модулю mag[k] в диапазоне частот 1008000 Гц, шаг частоты ( \Delta f = \frac{22050}{512} \approx 43 \text{ Гц} ).

Протокол

Пакет фиксированного размера 12 байт:

// firmware/App/Inc/protocol.h + protocol.c
[SOF=0xAA][TYPE=0x02][LEN=0x08]
[timestamp_ms: uint32]
[rms_db_x10: int16]      // dBFS * 10, ожидается -50.0 .. 0.0
[frequency_hz: uint16]   // 100 .. 8000
[crc8: uint8]            // CRC-8/ATM
  • CRC: CRC8/ATM (poly=0x07, init=0x00, без отражения), считается по байтам с индексами 1..10.

FreeRTOS задачи

  • audio_process_task

    • Ждёт уведомление от ISR DMA, обрабатывает последний буфер (512 сэмплов).
    • Вычисляет метрики, обновляет режим LED, отправляет метрику в очередь для USBзадачи.
  • cdc_task

    • Читает из очереди, упаковывает в protocol_pack_v1, пишет в USB CDC, целевая частота ~10 Гц.
  • health_led_task

    • Настраивает PC13 и мигает в зависимости от частоты/уровня сигнала, плюс подкармливает watchdog.

Сборка и прошивка

  • Зависимости: arm-none-eabi-gcc, make, st-flash.
  • Сборка:
cd firmware
make
  • Прошивка (через STLink):
make flash

Зависимости

Библиотека Путь Репозиторий
CMSIS-Core firmware/Drivers/CMSIS/Core ST GitHub
CMSIS-Device F1 firmware/Drivers/CMSIS/Device/ST/STM32F1xx ST GitHub
FreeRTOS firmware/Middlewares/FreeRTOS FreeRTOS-Kernel
TinyUSB firmware/Middlewares/TinyUSB hathach/tinyusb
CMSIS-DSP firmware/Middlewares/CMSIS-DSP ARM-software/CMSIS-DSP