Add wiki content pages

- Home: overview, quick start, controls
- BuildGuide: full build instructions, flags, troubleshooting build
- FlashingGuide: UART, SWD, USB flashing methods
- POCSAG: decoder implementation details, BCH algorithm, API
- Troubleshooting: common issues and solutions
- Changelog: v1.0 beta release notes, future plans
- _Sidebar: navigation sidebar
2026-04-12 01:15:14 +03:00
parent 3db6f1b4c2
commit a7f23f24a7
9 changed files with 1090 additions and 0 deletions

@@ -0,0 +1,173 @@
# Руководство по сборке
## Требования
### Программное обеспечение
| Компонент | Версия | Установка |
|-----------|--------|-----------|
| **arm-none-eabi-gcc** | 9.2.1+ | `sudo apt-get install gcc-arm-none-eabi` |
| **GNU Make** | 4.0+ | Обычно предустановлен |
| **Python 3** (опционально) | 3.6+ | `sudo apt-get install python3` |
| **crcmod** (опционально) | — | `pip install crcmod` |
### Проверка тулчейна
```bash
arm-none-eabi-gcc --version
# Ожидаемый вывод:
# arm-none-eabi-gcc (15:9-2019-q4-0ubuntu1) 9.2.1 20191025 (release)
```
## Конфигурация сборки
Все опции задаются в `Makefile` через переменные `ENABLE_*`.
### Ключевые опции
```makefile
# Основные функции
ENABLE_FMRADIO ?= 1 # FM-радио приёмник
ENABLE_SPECTRUM ?= 1 # Спектр-анализатор
ENABLE_POCSAG ?= 1 # POCSAG декодер
ENABLE_RSSI_BAR ?= 1 # Индикатор RSSI
# Оптимизация
ENABLE_LTO ?= 1 # Link Time Optimization (экономия ~10 КБ)
ENABLE_OVERLAY ?= 0 # SRAM overlay (несовместимо с LTO)
# Отключённые модули (для экономии Flash)
ENABLE_DTMF_CALLING ?= 0 # DTMF вызовы
ENABLE_VOICE ?= 0 # Голосовые подсказки
ENABLE_NOAA ?= 0 # NOAA метеорология
ENABLE_ALARM ?= 0 # Сигнализация
ENABLE_TX1750 ?= 0 # Тон 1750 Гц
ENABLE_FLASHLIGHT ?= 0 # Фонарик
ENABLE_VOX ?= 0 # VOX (голосовая активация)
```
### Экономия Flash
Если прошивка не помещается в 60 КБ, отключите в порядке убывания экономии:
| Опция | Экономия | Что теряется |
|-------|----------|-------------|
| `ENABLE_SPECTRUM = 0` | ~5 КБ | Спектр-анализатор |
| `ENABLE_POCSAG = 0` | ~4 КБ | POCSAG декодер |
| `ENABLE_FMRADIO = 0` | ~2 КБ | FM-радио |
| `ENABLE_BIG_FREQ = 0` | ~1 КБ | Крупный шрифт частоты |
| `ENABLE_RSSI_BAR = 0` | ~500 Б | Индикатор RSSI |
## Команды сборки
### Полная сборка
```bash
cd uv-k5-ua1zbe-firmware
make clean && make
```
### Параллельная сборка (быстрее)
```bash
make -j4
```
### Только компиляция (без линковки)
```bash
make -j4 firmware
```
### Проверка размера
```bash
arm-none-eabi-size firmware
# text data bss dec hex filename
# 57708 204 3364 61276 ef5c firmware
```
### Проверка переполнения Flash
```bash
SIZE=$(wc -c < firmware.bin)
if [ $SIZE -gt 61440 ]; then
echo "OVERFLOW! $SIZE > 61440"
else
echo "OK: $SIZE / 61440 bytes"
fi
```
## Флаги компилятора
| Флаг | Описание |
|------|----------|
| `-Os` | Оптимизация по размеру кода |
| `-flto=auto` | Link Time Optimization |
| `-Wall -Wextra -Werror` | Все предупреждения = ошибки |
| `-std=gnu11` | Стандарт C с расширениями GNU |
| `-mcpu=cortex-m0` | Целевой процессор |
| `-fno-builtin` | Не использовать встроенные функции |
| `-fshort-enums` | Минимальный размер enum |
| `--specs=nano.specs` | Newlib-nano (меньше размер) |
## Дата сборки
Дата автоматически подставляется из системы:
```c
#define BUILD_DATE "2026-04-12"
```
Используется в заставке при старте (третья строка).
## Известные проблемы сборки
### Ошибка: `[[fallthrough]]` not supported
**Симптом:**
```
error: expected expression before '[' token
[[fallthrough]];
```
**Решение:** Заменить на `__attribute__((fallthrough))` во всех файлах:
```bash
sed -i 's/\[\[fallthrough\]\]/__attribute__((fallthrough))/g' \
radio.c audio.c app/menu.c app/dtmf.c app/chFrScanner.c
```
### Ошибка: `static_assert` в C99
**Симптом:**
```
error: expected declaration specifiers or '...' before '(' token
```
**Решение:** Использовать `-std=gnu11` вместо `-std=c99` (уже исправлено в Makefile).
## Отладочные команды
### Просмотр символов в прошивке
```bash
arm-none-eabi-nm --size-sort firmware | tail -30
```
### Дизассемблер функции
```bash
arm-none-eabi-objdump -d firmware | grep -A20 "<POCSAG_FeedSample>:"
```
### Размер каждой секции
```bash
arm-none-eabi-size -A firmware | sort -n -k2 | tail -20
```
### Количество функций после LTO
```bash
arm-none-eabi-nm firmware | grep " [Tt] " | wc -l
```

@@ -0,0 +1,95 @@
# История изменений
## v1.0 Beta — 12.04.2026
Первая публичная бета-версия.
### Новое
-**VFO режим** — прямой ввод частоты с цифровой клавиатуры
-**POCSAG декодер** — поддержка 512/1200 бод, BCH(31,21) коррекция до 2 ошибок
-**Спектр-анализатор** — полноэкранный режим на базе egzumer spectrum
-**FM Радио** — базовый приём с отображением частоты
-**RSSI индикатор** — отображение в dBm в верхнем правом углу
-**Boot Splash** — кастомная заставка: `UA1ZBE` / `POCSAG pager` / дата сборки
-**Диспетчер режимов** — переключение: VFO ↔ POCSAG ↔ Spectrum ↔ FM
-**Zero malloc** — все буферы статические, нет динамической памяти
### Известные ограничения
| Проблема | Приоритет | Статус |
|----------|-----------|--------|
| POCSAG: недостаточно сэмплов (10мс вместо 125мкс) | 🔴 Критично | 📋 Запланировано |
| Нет отображения текста POCSAG сообщений | 🟡 Средний | 📋 Запланировано |
| Дублирование APP_TimeSlice в mode.c | 🟢 Низкий | 📋 Запланировано |
| Flash на пределе (94.3%) | 🟡 Средний | Принято |
### Технические детали
| Параметр | Значение |
|----------|----------|
| Flash | 57,912 / 61,440 байт (94.3%) |
| RAM | 3,568 / 16,384 байт (21.8%) |
| Компилятор | arm-none-eabi-gcc 9.2.1 |
| Оптимизация | -Os -flto=auto |
| Стандарт | -std=gnu11 |
| Предупреждения | -Wall -Wextra -Werror (0 предупреждений) |
### Архитектура
```
main.c → MODE_Init() → MODE_TimeSlice10ms()
├── MODE_VFO → APP_TimeSlice10ms() + RSSI_Draw()
├── MODE_POCSAG → POCSAG_FeedSample() + pocsag_draw()
├── MODE_SPECTRUM → MODE_Switch(MODE_VFO)
└── MODE_FM → FM_Start()
```
### Созданные файлы
| Файл | Описание | Размер |
|------|----------|--------|
| `Makefile` | Конфигурация сборки | 9,838 Б |
| `main.c` | Точка входа | 4,217 Б |
| `syscalls.c` | Заглушка _sbrk | 358 Б |
| `app/boot_splash.c` | Заставка при старте | 1,504 Б |
| `app/display_rssi.c` | RSSI индикатор | 3,601 Б |
| `app/mode.c` | Диспетчер режимов | 7,763 Б |
| `app/pocsag/pocsag.c` | POCSAG декодер | 15,201 Б |
| `app/pocsag/bch31.c` | BCH коррекция | 7,101 Б |
| `DOCUMENTATION.md` | Полная документация | 8,428 Б |
### Исправленные ошибки сборки
1. `[[fallthrough]]``__attribute__((fallthrough))`
2. `static_assert` C99 → `-std=gnu11`
3. `uint8_t >= 576``uint16_t`
4. `dBmCorrTable` undeclared → `extern const int8_t dBmCorrTable[7]`
5. `sizeof` incomplete type → `#include "app/dtmf.h"`
6. 40+ undefined reference → возврат зависимых модулей
7. `_sbrk` undefined → `syscalls.c`
---
## Планы на будущее
### v1.1 (планируется)
- [ ] Исправление POCSAG сэмплинга (80 сэмплов × 125мкс)
- [ ] Отображение текста POCSAG сообщений
- [ ] Фиксированная частота POCSAG по умолчанию
- [ ] Звуковой сигнал при новом сообщении
### v1.2 (планируется)
- [ ] Разделение APP_TimeSlice (убрать дублирование)
- [ ] Настройка POCSAG частоты через ввод с клавиатуры
- [ ] Журнал принятых POCSAG сообщений
- [ ] Увеличение буфера сообщений до 16
### v2.0 (планы)
- [ ] Переключение VFO/MR режимы
- [ ] Сканирование POCSAG по диапазону частот
- [ ] Экспорт сообщений через UART
- [ ] Оптимизация размера (убрать unused код)

@@ -0,0 +1,215 @@
# Руководство по прошивке
## Предупреждение
> ⚠️ **Прошивка сторонним ПО аннулирует гарантию.** Неправильная прошивка может вывести устройство из строя.
> Все действия вы выполняете на свой страх и риск.
## Подготовка
### Файл прошивки
Скачайте `firmware.bin` из [Релизов](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/releases)
или соберите самостоятельно:
```bash
make clean && make
# firmware.bin будет в корневой директории
```
## Способ 1: UART Bootloader (рекомендуется)
### Оборудование
| Компонент | Описание |
|-----------|----------|
| UART адаптер | CH340, CP2102, FT232 (3.3V логика!) |
| Провода | 3 шт: TX, RX, GND |
| Паяльник | Для подпайки к контактам на плате (опционально) |
### Подключение
```
UART адаптер UV-K5 (плата)
─────────────────────────────────────
TX ──────────────── RX (контакт U1)
RX ──────────────── TX (контакт U2)
GND ──────────────── GND (контакт U3)
⚠️ НЕ подключайте VCC — питание от USB или батареи!
```
Контакты на плате обычно расположены рядом с процессором и подписаны как `TX`, `RX`, `GND`.
### Установка k5prog
```bash
# Вариант A: k5prog (piotr02)
git clone https://github.com/piotr02/k5prog.git
cd k5prog && make
sudo cp k5prog /usr/local/bin/
# Вариант B: k5prog (sq5bpf)
git clone https://github.com/sq5bpf/k5prog.git
cd k5prog && make
sudo cp k5prog /usr/local/bin/
```
### Процесс прошивки
```bash
# 1. Определите порт
ls /dev/ttyUSB* /dev/ttyACM*
# 2. Переведите рацию в режим bootloader:
# - Выключите рацию
# - Зажмите боковую кнопку SK2 (нижнюю)
# - Включите рацию (не отпуская кнопку)
# - Через 2 секунды отпустите кнопку
# - Индикатор должен мигнуть
# 3. Прошейте
k5prog -f firmware.bin -p /dev/ttyUSB0 -w
# Ожидаемый вывод:
# Writing firmware.bin to radio...
# Write complete.
# Verify OK.
```
### Если k5prog не видит рацию
1. Проверьте подключение UART (TX↔RX перекрёстно!)
2. Проверьте права на порт: `sudo chmod 666 /dev/ttyUSB0`
3. Попробуйте другой порт: `ls /dev/ttyUSB*`
4. Перезагрузите рацию и повторите вход в bootloader
## Способ 2: SWD (J-Link)
### Оборудование
| Компонент | Описание |
|-----------|----------|
| J-Link | SEGGER J-Link (V9 или совместимый) |
| Провода | 4 шт: VTref, GND, SWDIO, SWCLK |
### Подключение
```
J-Link UV-K5 (плата)
────────────────────────────────────────
Pin 1 (VTref) ─── 3.3V
Pin 2 (GND) ─── GND
Pin 7 (SWDIO) ─── SWDIO (контакт рядом с MCU)
Pin 9 (SWCLK) ─── SWCLK (контакт рядом с MCU)
Pin 15 (RESET) ─── RESET (опционально)
```
### Установка OpenOCD
```bash
# Из репозитория
sudo apt-get install openocd
# Или сборка из исходников (для J-Link):
git clone https://github.com/raspberrypi/openocd.git
cd openocd
./bootstrap
./configure --enable-jlink
make -j4
sudo make install
```
### Прошивка
```bash
# Автоматически (через Makefile)
make flash
# Вручную
openocd -f interface/jlink.cfg -f dp32g030.cfg \
-c "write_image firmware.bin 0; shutdown;"
# Ожидаемый вывод:
# Open On-Chip Debugger
# Info : J-Link ...
# Info : DP32G030 ...
# wrote ... bytes from firmware.bin
# shutdown command invoked
```
## Способ 3: USB (родной кабель)
### Требования
- Рация должна поддерживать USB bootloader
- Установлен драйвер (обычно определяется автоматически)
### Процесс
```bash
# 1. Переведите рацию в режим USB bootloader:
# - Выключите рацию
# - Зажмите PTT + боковую кнопку SK2
# - Включите рацию
# - Должна определиться как USB device
# 2. Проверьте подключение
lsusb | grep -i quansheng
# 3. Прошейте
k5prog -f firmware.bin -w
```
## Проверка прошивки
После успешной прошивки:
1. **Выключите** и **включите** рацию
2. Должна появиться **заставка**:
```
┌─────────────────┐
│ UA1ZBE │ ← крупно
│ POCSAG pager │ ← по центру
│ 2026-04-12 │ ← дата сборки
└─────────────────┘
```
3. Через 2 секунды → переход в **VFO режим**
4. Проверьте RSSI в верхнем правом углу экрана
## Восстановление (если что-то пошло не так)
### Симптомы «окирпичивания»
- Экран не включается
- Экран включается, но нет реакции на кнопки
- Рация не определяется по USB/UART
### Восстановление через SWD
SWD — самый надёжный способ, так как работает на уровне процессора:
```bash
# Полная перепрошивка с очисткой
openocd -f interface/jlink.cfg -f dp32g030.cfg \
-c "reset init; flash erase_address 0x00000000 0xF000; \
write_image firmware.bin 0; reset; shutdown;"
```
### Восстановление через UART
1. Отключите батарею
2. Подключите UART
3. Зажмите SK2
4. Подключите батарею (или USB)
5. Попробуйте прошить снова
## Частые ошибки
| Ошибка | Причина | Решение |
|--------|---------|---------|
| `Device not found` | Неверный порт | `ls /dev/ttyUSB*`, проверьте подключение |
| `Write failed` | Рация не в bootloader | Повторите вход (зажать SK2 при включении) |
| `Verify failed` | Повреждённый файл | Пересоберите: `make clean && make` |
| `Flash overflow` | Прошивка > 60 КБ | Отключите модули в Makefile |
| OpenOCD не подключается | Неверные пины SWD | Проверьте подключение J-Link |

63
Home.md

@@ -0,0 +1,63 @@
# UA1ZBE Custom Firmware
Кастомная прошивка для радиостанций **Quansheng UV-K5 / UV-K6 (5)** на базе [egzumer/uv-k5-firmware-custom](https://github.com/egzumer/uv-k5-firmware-custom).
## Возможности
| Режим | Описание |
|-------|----------|
| **VFO** | Основной режим — частотомер с прямым вводом с цифровой клавиатуры |
| **POCSAG** | Декодирование пейджинговых сообщений (512/1200 бод, BCH коррекция) |
| **Spectrum** | Полноэкранный спектр-анализатор (RSSI-сканирование) |
| **FM Radio** | Приём FM-радио с отображением частоты |
| **RSSI** | Индикатор уровня сигнала в верхнем правом углу (dBm + S-level) |
## Быстрый старт
```bash
# Клонировать репозиторий
git clone https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware.git
cd uv-k5-ua1zbe-firmware
# Собрать
sudo apt-get install gcc-arm-none-eabi
make clean && make
# Прошить (J-Link SWD)
make flash
```
## Управление
| Кнопка | Действие |
|--------|----------|
| `0``9` | Прямой ввод частоты в VFO |
| **SK2** (нижняя боковая) | Переход в режим **POCSAG** |
| **SK1** (средняя боковая) | Переход в **Спектр-анализатор** |
| `0` (короткое нажатие) | Переход в **FM-радио** |
| **EXIT** | Возврат в VFO из любого режима |
| **F** или `*` (в POCSAG) | Переключение скорости: 512 ↔ 1200 бод |
## Размеры прошивки
```
text data bss dec hex filename
57708 204 3364 61276 ef5c firmware
```
- **Flash:** 57,912 / 61,440 байт (94.3%)
- **RAM:** 3,568 / 16,384 байт (21.8%)
## Документация
- [[BuildGuide|Полное руководство по сборке]]
- [[FlashingGuide|Руководство по прошивке]]
- [[POCSAG|POCSAG декодер — детали реализации]]
- [[Troubleshooting|Устранение неполадок]]
- [[Changelog|История изменений]]
## Ссылки
- 📦 [Релизы](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/releases)
- 📋 [Документация (DOCUMENTATION.md)](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/src/branch/main/DOCUMENTATION.md)
- 🌐 [Оригинальный проект egzumer](https://github.com/egzumer/uv-k5-firmware-custom)

256
POCSAG.md

@@ -0,0 +1,256 @@
# POCSAG декодер
## Обзор
POCSAG (Post Office Code Standardization Advisory Group) — стандарт пейджинговой связи.
Данный декодер реализует приём и декодирование POCSAG сигналов с частотами 512 и 1200 бод.
## Протокол POCSAG
### Структура передачи
```
┌─────────────────┬──────────────┬──────────────────────────┐
│ Преамбула │ Sync word │ Batch 1 (32 слова) │
│ 0xAAAAAAAB... │ 0x7CD21538 │ [Address/Data] × 32 │
│ (≥576 бит) │ │ │
└─────────────────┴──────────────┴──────────────────────────┘
┌────────────────────────────────────┘
┌──────────────────────────┐
│ Batch 2 (32 слова) │
│ + sync word │
└──────────────────────────┘
```
### Параметры
| Параметр | Значение |
|----------|----------|
| **Скорость** | 512 или 1200 бод |
| **Модуляция** | FSK (FM) |
| **Кодирование** | BCH(31,21) |
| **Исправление ошибок** | До 2 бит на слово |
| **Длина слова** | 32 бита (21 данные + 10 BCH + 1 чётность) |
| **Преамбула** | 0x55555555... ≥ 576 бит, заканчивается на 1 |
| **Sync word** | 0x7CD21538 |
| **Idle word** | 0x7A89C197 |
### Типы сообщений
| Function bits | Тип | Описание |
|---------------|-----|----------|
| `00` | Numeric | Числовой пейджер (BCD цифры) |
| `01` | Reserved | Зарезервировано |
| `10` | Alpha | Алфавитный пейджер (7-bit ASCII) |
| `11` | Reserved | Зарезервировано |
## Архитектура декодера
### Файлы
| Файл | Описание |
|------|----------|
| `app/pocsag/pocsag.c` | Основной декодер |
| `app/pocsag/pocsag.h` | Заголовочный файл, API |
| `app/pocsag/bch31.c` | BCH(31,21) коррекция ошибок |
| `app/pocsag/bch31.h` | Заголовочный файл BCH |
### Цепочка обработки
```
┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐
│ BK4819 │───▶│ Zero-crossing│───▶│ Bit slicing │───▶│ POCSAG decode │
│ FM demod │ │ detection │ │ (averaging) │ │ (state machine)│
└──────────┘ └──────────────┘ └──────────────┘ └───────────────┘
┌─────────────────────────────────────────┘
┌──────────────┐
│ BCH correct │
│ (up to 2 err)│
└──────────────┘
┌──────────────┐
│ Ring buffer │
│ (8 messages) │
└──────────────┘
```
### Машина состояний
```
┌─────────┐
│ IDLE │
└────┬────┘
│ 576 alternating bits
┌──────────────┐
┌───────▶│ PREAMBLE │
│ └──────┬───────┘
timeout │ │ sync word found (0x7CD21538)
│ ▼
│ ┌──────────────┐
│ │ SYNC │
│ └──────┬───────┘
│ │ 32-bit word valid
│ ▼
│ ┌──────────────┐
└────────│ DATA │
sync lost └──────────────┘
```
## Алгоритм BCH(31,21)
### Параметры кода
| Параметр | Значение |
|----------|----------|
| **Длина кода (n)** | 31 бит |
| **Информационные биты (k)** | 21 бит |
| **Проверочные биты** | 10 бит |
| **Мин. расстояние (d_min)** | 5 |
| **Исправление ошибок** | До 2 бит |
### Генераторный полином
```
g(x) = x^10 + x^9 + x^8 + x^6 + x^5 + x^3 + 1
= 0x72D (binary: 111 0010 1101)
```
### Процесс коррекции
```
1. Проверка чётности (even parity)
└─ Если OK и синдром = 0 → нет ошибок
2. Вычисление синдрома S(x) = R(x) mod g(x)
└─ Если S(x) = 0 → нет ошибок
3. Поиск одиночной ошибки
└─ S(x) = x^i mod g(x) для позиции i
└─ Если найдено → исправить бит i
4. Поиск двойной ошибки (перебор пар)
└─ S(x) = x^i + x^j mod g(x) для пар (i, j)
└─ 465 комбинаций для 31 бита
└─ Если найдено → исправить биты i и j
5. Если не найдено → слово отбрасывается
```
### Оптимизация для Cortex-M0
Cortex-M0 не имеет аппаратного деления. Все операции в GF(2) реализованы через сдвиги и XOR:
```c
// Умножение на x в GF(2^10 / g(x))
test_syn <<= 1;
if (test_syn & 0x0400U) { // Если бит 10 установлен
test_syn ^= BCH31_GEN_POLY; // XOR с генератором
}
test_syn &= 0x03FFU; // Оставляем 10 бит
```
## Конфигурация BK4819
Для приёма POCSAG радиочип настраивается следующим образом:
```c
// Узкая полоса (POCSAG обычно narrow FM)
BK4819_SetFilterBandwidth(BK4819_FILTER_BW_NARROW, true);
// Отключение шумоподавления (непрерывный приём аудио)
BK4819_SetupSquelch(0, 0, 0, 0, 255, 0);
// Включение RX链路
BK4819_WriteRegister(BK4819_REG_30,
BK4819_REG_30_ENABLE_VCO_CALIB |
BK4819_REG_30_ENABLE_RX_LINK |
BK4819_REG_30_ENABLE_AF_DAC |
BK4819_REG_30_ENABLE_DISC_MODE |
BK4819_REG_30_ENABLE_PLL_VCO |
BK4819_REG_30_ENABLE_RX_DSP);
// AF output — демодулированный FM сигнал
BK4819_SetAF(BK4819_AF_FM);
```
## Известные ограничения
### Сэмплинг (критично)
**Проблема:** `POCSAG_FeedSample()` вызывается ~1 раз в 10 мс из timeslice. Для корректного декодирования POCSAG 1200 бод требуется ~1 раз в 125 мкс (8000 сэмплов/сек).
**Текущее состояние:** Преамбула НЕ будет обнаружена при текущей частоте сэмплирования. BCH коррекция работает правильно, но до неё дело не доходит.
**Планируемое исправление:**
```c
// В MODE_TimeSlice10ms(), case MODE_POCSAG:
for (int i = 0; i < 80; i++) {
uint16_t audio = BK4819_GetVoiceAmplitudeOut();
POCSAG_FeedSample(audio);
SYSTEM_DelayUs(125); // 8 kHz sampling rate
}
```
### Ограничения памяти
| Ресурс | Использование |
|--------|--------------|
| Кольцевой буфер сообщений | 8 сообщений × ~80 байт = 640 байт |
| Статические буферы декодера | ~200 байт |
| BCH таблица синдромов | 0 байт (вычисляется на лету) |
## API декодера
### Инициализация
```c
// Инициализация с baud rate 1200
POCSAG_Init(POCSAG_BAUD_1200);
// Настройка радиочасти на частоту 145.525 MHz
POCSAG_ConfigureRadio(145525000);
```
### Переключение скорости
```c
// Переключение 1200 -> 512 бод
POCSAG_SwitchBaud(POCSAG_BAUD_512);
// Текущая скорость
uint32_t baud = POCSAG_GetBaud();
```
### Проверка сообщений
```c
// Проверка наличия декодированных сообщений
if (POCSAG_MessageAvailable()) {
pocsag_msg_t msg;
if (POCSAG_GetMessage(&msg)) {
// msg.address — адрес (21 бит)
// msg.func — function code (2 бита)
// msg.text — текст сообщения
// msg.is_alpha — true = алфавитный, false = числовой
}
}
```
### Состояние декодера
```c
pocsag_state_t state = POCSAG_GetState();
// POCSAG_STATE_IDLE — ожидание
// POCSAG_STATE_PREAMBLE — обнаружение преамбулы
// POCSAG_STATE_SYNC — поиск sync слова
// POCSAG_STATE_DATA — приём данных
bool signal = POCSAG_SignalDetected(); // true если sync найден
```

@@ -0,0 +1,275 @@
# Устранение неполадок
## Прошивка не устанавливается
### k5prog не находит рацию
**Симптомы:**
```
Device not found
```
**Решение:**
1. **Проверьте порт:**
```bash
ls /dev/ttyUSB* /dev/ttyACM*
# Если ничего нет — адаптер не определяется
```
2. **Проверьте подключение:**
- TX адаптера → RX рации
- RX адаптера → TX рации
- GND → GND
- **НЕ** подключайте VCC
3. **Проверьте права:**
```bash
sudo chmod 666 /dev/ttyUSB0
# Или добавьте пользователя в группу dialout:
sudo usermod -a -G dialout $USER
```
4. **Попробуйте другой порт:**
```bash
k5prog -f firmware.bin -p /dev/ttyUSB1 -w
```
### Ошибка записи
**Симптомы:**
```
Write failed at address 0x...
```
**Решение:**
1. Убедитесь что рация в режиме bootloader (зажать SK2 при включении)
2. Попробуйте ещё раз
3. Проверьте целостность файла: `md5sum firmware.bin`
### Ошибка верификации
**Симптомы:**
```
Verify failed
```
**Решение:**
1. Пересоберите прошивку: `make clean && make`
2. Проверьте что файл не повреждён
3. Попробуйте другой UART адаптер
## Рация не включается после прошивки
### Чёрный экран
**Причины:**
- Прошивка не записалась полностью
- Прошивка для другой модели
- Ошибка в коде инициализации
**Решение:**
1. **SWD восстановление (самый надёжный):**
```bash
openocd -f interface/jlink.cfg -f dp32g030.cfg \
-c "reset init; write_image firmware.bin 0; reset; shutdown;"
```
2. **UART восстановление:**
- Отключите батарею
- Подключите UART
- Зажмите SK2
- Подключите батарею
- Прошейте заново
### Экран включается, но нет реакции на кнопки
**Причина:** Зависание в boot loop или ошибка инициализации
**Решение:**
1. Зажмите все кнопки на 10 секунд
2. Выключите рацию
3. Перепрошейте
## Экран
### Артефакты на экране
**Причина:** Неправильная инициализация ST7565
**Решение:**
- Проверьте что используется правильный Makefile
- Пересоберите: `make clean && make`
### Нет RSSI индикатора
**Причина:** `ENABLE_RSSI_BAR = 0` в Makefile
**Решение:**
```makefile
ENABLE_RSSI_BAR = 1
```
### Заставка не появляется
**Причина:** Файл `boot_splash.c` не компилируется
**Решение:**
- Проверьте что `app/boot_splash.o` есть в Makefile
- Проверьте дату сборки: `grep BUILD_DATE Makefile`
## POCSAG
### Не декодирует сообщения
**Причина:** Недостаточная частота сэмплирования (см. [[POCSAG#Сэмплинг]])
**Текущее состояние:** BETA — требуется доработка.
**Временное решение:**
```c
// В mode.c, case MODE_POCSAG — читать чаще:
for (int i = 0; i < 80; i++) {
uint16_t audio = BK4819_GetVoiceAmplitudeOut();
POCSAG_FeedSample(audio);
SYSTEM_DelayUs(125);
}
```
### Показывает "IDLE" постоянно
**Причина:** Нет POCSAG сигнала на текущей частоте
**Решение:**
- Убедитесь что настроена правильная частота
- Попробуйте известные POCSAG частоты: 145.525, 433.500 MHz
### Показывает "SEARCHING" но не находит SYNC
**Причина:**
- Слабый сигнал
- Неверная baud rate
- Помехи
**Решение:**
1. Переключите baud rate: `F` или `*`
2. Подойдите ближе к передатчику
3. Проверьте антенну
## Спектр-анализатор
### Зависает в режиме спектра
**Причина:** `APP_RunSpectrum()` — блокирующая функция
**Решение:**
- Нажмите `EXIT` для возврата в VFO
- Если не реагирует — выключите и включите рацию
### Спектр не отображается
**Причина:** `ENABLE_SPECTRUM = 0` в Makefile
**Решение:**
```makefile
ENABLE_SPECTRUM = 1
```
## FM Радио
### Нет звука
**Причина:** Громкость на минимум или аудио путь не включён
**Решение:**
1. Проверьте громкость (кнопки вверх/вниз)
2. Убедитесь что есть сигнал
### FM не запускается
**Причина:** `ENABLE_FMRADIO = 0` в Makefile
**Решение:**
```makefile
ENABLE_FMRADIO = 1
```
## Ошибки компиляции
### `undefined reference to '_sbrk'`
**Решение:** Убедитесь что `syscalls.c` есть в Makefile:
```makefile
OBJS += syscalls.o
```
### `comparison is always false due to limited range of data type`
**Причина:** Сравнение unsigned переменной с числом больше её максимума
**Решение:** Измените тип переменной на больший (например `uint8_t` → `uint16_t`)
### `fatal error: xxx.h: No such file or directory`
**Решение:** Проверьте путь в include:
```c
// Правильно:
#include "app/display_rssi.h"
#include "pocsag/pocsag.h"
// Неправильно:
#include "display_rssi.h"
```
## Ошибки линковки
### `undefined reference` (много штук)
**Причина:** Отсутствуют объектные файлы в Makefile
**Решение:** Проверьте что все зависимые модули включены:
```makefile
OBJS += ui/ui.o ui/inputbox.o ui/menu.o
OBJS += app/menu.o app/generic.o app/action.o app/dtmf.o
```
### Flash overflow
**Симптомы:**
```
region `FLASH' overflowed by XXXX bytes
```
**Решение:** Отключите ненужные модули (см. [[BuildGuide#Экономия-Flash]])
## Сбор системы
```bash
# Проверьте ядро
uname -a
# Проверьте права USB
ls -la /dev/ttyUSB*
groups
# Проверьте тулчейн
arm-none-eabi-gcc --version
arm-none-eabi-size --version
```
## Логирование
Если ничего не помогает, включите UART лог:
```makefile
ENABLE_UART = 1
```
Затем подключите UART адаптер и смотрите вывод:
```bash
minicom -D /dev/ttyUSB0 -b 38400
```

@@ -0,0 +1,13 @@
## Навигация
- [[Главная|Home]]
- [[BuildGuide|Руководство по сборке]]
- [[FlashingGuide|Руководство по прошивке]]
- [[POCSAG|POCSAG декодер]]
- [[Troubleshooting|Устранение неполадок]]
- [[Changelog|История изменений]]
## Ссылки
- [Репозиторий](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware)
- [Релизы](https://git2.ua1zbe.ru/ua1zbe/uv-k5-ua1zbe-firmware/releases)