Files
sound-analyze/firmware/README.md

75 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 байт:
```c
// 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`.
- Сборка:
```bash
cd firmware
make
```
- Прошивка (через STLink):
```bash
make flash
```
## Зависимости
| Библиотека | Путь | Репозиторий |
| ------------------- | -------------------------------------------- | ------------------------------------------------------------------- |
| **CMSIS-Core** | `firmware/Drivers/CMSIS/Core` | [ST GitHub](https://github.com/STMicroelectronics/cmsis_core)
| **CMSIS-Device F1** | `firmware/Drivers/CMSIS/Device/ST/STM32F1xx` | [ST GitHub](https://github.com/STMicroelectronics/cmsis_device_f1) |
| **FreeRTOS** | `firmware/Middlewares/FreeRTOS` | [FreeRTOS-Kernel](https://github.com/FreeRTOS/FreeRTOS-Kernel) |
| **TinyUSB** | `firmware/Middlewares/TinyUSB` | [hathach/tinyusb](https://github.com/hathach/tinyusb) |
| **CMSIS-DSP** | `firmware/Middlewares/CMSIS-DSP` | [ARM-software/CMSIS-DSP](https://github.com/ARM-software/CMSIS-DSP) |