3.9 KiB
3.9 KiB
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]в диапазоне частот 100–8000 Гц, шаг частоты ( \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: CRC‑8/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
- Прошивка (через ST‑Link):
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 |