Форум по радиосвязи предназначен прежде всего для постояльцев портала, которые кроме паяния жучков умеют жать на тангенту, проводить QSO, которые возлюбили свои антенны, и трансиверы как самого себя. Правила данного форума в рамках пп 6.6., 6.7.8., 6.7.9 соответствуют регламенту проведения радиосвязей
1) Приёмопередатчик RFM96 с LoRa-модемом. Передатчик: до 50 мВт в непрерывном режиме излучения. Приёмник: возможность осуществить подшумовой приём, когда сигнал меньше шума в несколько раз.
2) Сорцы Codec2 на 450 и 700 бит/с. Есть кастомные сборки на 400, 550, 600, 625, 650 бит/с.
3) Сорцы кодеков MELP1200 и LPC2400
4) Два комплекта отладочных плат с программатором: STM32F4DISCOVERY: поддержка операций с плавающей точкой - аппаратный FPU, частота около 200 МГц (>200 MIPS), встроенный АЦП, ЦАП. Как дополнительный бонус: цифровой микрофон и внешний ЦАП с бустером в классе D.
5) Среда программирования: Кокос. Не просит денег - хорошо, есть визард прокета - очень хорошо!
Что нужно получить:
Пара приемо-передатчиков для передачи человеческой речи на максимально возможное расстояние, без применения дополнительных усилителей мощности и хитровы_б__нных антенн. Отдельный упор сделать на минимальное энергопотребление. Приемник ввести в режим максимальной чувствительности, максимально снизив скорость передачи , применив речевой вокодер.
Иначе и короче: пара бздюлин с величиной не более спичечного коробка или в гарнитуре blutooth с зашифрованным каналом.
Что обнаружено:
1) Codec2 требует FPU для вычислений с плавающей точкой. Перевод его в режим FixedPoint (на скорую руку без ассемблера) привёл к диким тормозам.
2) Codec2 не лезет в RAM VS1063. Так что в этом проекте она - не айс!
Как будет появляться что-то новое, буду сюда писать.
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Вы Дискавери на двухста мипсах юзали? Она под ватт ест в таком режиме, какое нафиг минимальное потребление? Бонусом - на 216 МГц пашет в комнатных условиях месяцами, а вот на 240 уже затыкается, причем именно ядро, периферия молотит.
Это сообщение отредактировал romanetz - Oct 6 2016, 08:05 AM
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (romanetz @ Oct 6 2016, 08:03 AM)
Вы Дискавери на двухста мипсах юзали? Она под ватт ест в таком режиме, какое нафиг минимальное потребление? Бонусом - на 216 МГц пашет в комнатных условиях месяцами, а вот на 240 уже затыкается, причем именно ядро, периферия молотит.
Никто не говорил о том, что устройство будет именно на 200 MIPS работать. И о каком ватте идет речь, когда даже на плате STM32F4DISC нет таких мощных LDO/DC-DC ?
К тому же в релизной версии ничто не мешает взять камень по-скромнее, к примеру STM32F3 о которых вы упомянули в соседней теме.
Мне к примеру, тоже не нужен весь STM32F407VGT6 с его 100-пиновым корпусом.
Но что поделать, когда с трудом в течении одного дня в городе проживания взял ДВЕ платы STM32F4DISC - одну купил в магазине, а другую купил б/у у студента с рук ? А плат с F3 нет, есть только 103, но они неинтересны из-за отсутствия FPU, который ОЧЕНЬ нужен для софтовых вокодеров.
Главное начать, а потом будет видно что можно будет улучшить. Я с STM32 никогда не работал. Вот буду щас вместо того чтобы сорцы выклянчивать, изучать как сделать мигающий светодиод на STM
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Поставил кокос и ГНУ тулчейн.
Вначале поставил самую последнюю версию кокоса 2.x. Падла, лезет в интернет постоянно и с вырубленным ослом (IE) не работает. Не очень удобно для тех кто в оффлайн и запуск IE зарезан в реестре. И не качает репозитории - вылетает ошибка.
Потом поставил кокос 1.3. Там не оказалось STM32F407. Снес.
Потом поставил кокос 1.7. Ура! Наконец-то что-то более-менее рабочее: репозитории все на месте, но в интернет сука всеравно лезет, и при отключенном сетевом адаптере наглухо вешает комп на 1,5 минуты.
Сопряг с ГНУ АРМ-тулчейном, скомпилировал мигающие светодиоды. Прошил во флеш - ура!!! Замигали... Отладчик ничерта не работает, потому что он использует планировщик задач и RPC-сервер, который тоже вырублен нафиг для безопасности. Потому что через RPC хакают.... Хотел программу в РАМу толкнуть, но не вышло.
Дальше ещё веселее: откомпилил в либу весь Codec2. При использовании либы линкер ругается: неизвестно что такое cosf, sinf, log2f и аналогичное. Причем FPU enable не выправляет дело. Пришлось в пути линкера прописывать либу с ГНУ АРМ тулчейна libm.a тогда тригонометрия запахала.
Всё это я в интернете нашёл как с кокосовским говном бороться, никому моск не ипал, и то прочел, что в плане нормального коде кокос и его гцц - убог.
Но код слинковал, что радует!
Завтра буду тестить чудо от Ымперцев под названием Keil uVision. Масоны хоть и проприетарны, но выпускают вещи на несколько порядков лучше и надёжнее, чем опенсорцники-ГНУисты.
Уже поставил Keil MDK-3.x - там нет STM32F4. Последний кейл 5.x не подошел, так как не идёт под WinXP.
Зато 474 и есть поддержка STM32F4, что радует.
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Испытал Keil uVision 4.74. Впечатления самые хорошие! Во-первых: не лезет в интернет Во-вторых: нет нагромождений наподобие как визард и репозитории в кокосе В-третьих: нет плясок с бубном по поводу Hardware FPU В-четвертых: простой и понятный GUI.
Подключил CMSIS, GPIO, написал моргалку светодиодов (штатные на плате STM32F4DISC). Перед тем как сваять проект внимательно почитал интернет.
Особенность прошивки под Keil: после программирования чипа, не делается сброс, надо жать кнопу на плате самому. Это по-началу меня ввело в заблуждение что программа не работает.
Отладка работает великолепно: все ресурсы отображаются, без подвисаний и использования tasklist, gdp... и серверов RPC и прочей х__ты.
Вторым шагом : попробовал скомпилировать Codec2 на 450 бит/с. Тут были небольшие проблемы:
1) Компилятор не мог переварить объявление статических массивов с переменным размером. Вылечилось установкой опции -C99 в настройках компилятора.
2) Компилятор ругался ворнингами на вещественные константы, говоря о том что все вычисления будут приведены в тип double, а это мне нахрен не упало, так как не будет задействован Hardware FPU, который single floating.
В GCC есть ключи -fsingle-precision-constant -Wdouble-promotion для указаний компилятору, что все объявленные вещественные константы в программе single floating, а не double floating.
В кейловском компиляторе есть ключ --fpumodel=fast, которая также по идее должна приводить все вычисления в single floating, но на практике, предупреждения о конверсии в double так и не исчезло.
Пришлось ручками к каждой вещественной константе пририсовывать литерал "F":
вместо 0.5 делать 0.5F и т.п.
3) Ещё куча объявленных переменных, которые не используются или используются сами по себе, но не взаимодействуют с другими частями программы. Всё подчистил.
Кинул модифицированный код на виндозный MinGW, собрал экзачины поl форточки - проверил файлы звука: всё работает как надо. Значит на верном пути!
4) Собрал либу Codec2 под Кейл. Оптимизацию пока не трогал (-O3, Optimize for time), потому что по опыту программирования AT91RM9200 знаю, что иногда программа может глючить при жесткой оптимизации.
5) В моргалку светодиодами добавил код Codec2 и вызвал encode для одного фрейма (640 байт).
Если светодиоды заморгают, значит кодек отработал, а если нет - то повисон в Codec2.
И с первого раза не заморгали светодиоды - случился повисон в функции codec2_encode_450(codec2,bits,buf);
И сразу догадался почему: размер кучи по умолчанию: всего 0x200, а в Codec2 интенсивно идет работа с буферами (malloc).
Путем последовательных приближений установил, что размер кучи должен быть около: 0xA240 тоесть около 40,6 кБ.
Так что ни в какой VS1063 Codec2 не влезет - это уж точно!
Ну и всё-таки функция encode_450 отработала и светодиоды замигали! Текст программы ниже.
В ближайшем будущем планирую разобраться с DAC, таймерами, прерываниями и вывести буфер на динамик.
Правда на плате есть уже напаянные микрофон и внешний ЦАП с усилком, но я планирую испольщовать другую элементную базу.
Пока без LoRA и без микрофона. Заливать во флеш файл звука и смотреть корректность алгоритмов Codec2.
Ещё хочется DMA задействовать! Опыт работы с ADSP BlackFin 532 показал, что DMA - полезная вещь, так как не требует участия CPU при передаче данных "Периферия - Память" или наоборот. Есть даже режим "Память-Память" (в BF532), можно memcpy() делать без участия процессора.
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Следующим шагом было загрузка и отладка программ в оперативную память контроллера. Потому что с такими темпами, я просто угроблю флеш, число заливок в сутке под 1000 выходит!
Все попытки шить кейловскими средствами в SRAM закончились провалом, потому что 474-й кейл наверное не умеет использовать STLINK-dll для прошивки в оперативу.
В итоге сделал так: взял загрузчик который передает управление на адрес 0x20000000 (начало RAM) и прошил его утилитой ST-LINK_CLI.exe
С самими утилитами тоже вышла проблема, гребаный Install shield STM32 ST-LINK Utility_v2.5.0.exe не захотел нормально работать под WinXP и вешал комп и завершался с ошибкой. Пришлось у знакомого на Win8 ставить - и всё млять ради того чтобы просто тупо разжались эти утилиты!!! Которые потом перенес на флешку и скопировал на WinXP. В интернете разжатые утилиты не нашёл.
сделал это в Target, во вкладке Linker указал что регионы брать из вкладки Target.
Во вкладке кейла Utilites пишу: command: C:\......ваш путь к утилитам.......\ST-LINK_CLI.exe arguments: -c SWD UR -P "obj\led.hex" -HardRst
Это заставляет кейл нажатием одной кнопки прошивать программу в RAM и обязательно ресетить контроллер после этого, чтобы все запустилось.
Есть альтернатива: делать так -run 0x20000000 и не надо никакого загрузичка флеш и ресета, но мне этот вариант не понравился, так как в этом случае утилита ST-LINK_CLI.exe ждёт нажатия клавиши Enter для запуска программы. Итого два действия вместо одного.
И не надо трогать ноги boot0,1 контроллера в этих случаях! и влазить паяльником куда не надо!
Прикладываю чудо-утилиты в разжатом виде, без всяких говно-Install Shield-ов:
Я вот Дискавери свою уже два года мучаю, никаких проблем с флешкой не заметил. Про тысячу раз в день, это, конечно, загнул - каждые 1,5 минуты без сна и отдыха делать новое изменение в программе, собирать и прошивать? А еще ведь проверить надо, что получилось. завидую такой работоспособности. И ресурс у флешки в ST, насколько помню, - 100 тысяч циклов.
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Дальше уделил внимание программе STM32 ST-LINK Utility.exe, которая может дофига всего: отладка, просмотр памяти, сохранение дампов и многое, многое другое!
Решил проверить работу Codec2 через отладчик и оказалось не зря. В качестве примера взял wav-файлик размером ровно 15360 байт - это 24 фрейма по 640 байт: и в память влезает и долго звучит. Энкодер должен был все 24 фрейма пожать в буфер. Для облегчения поиска буфера прилепил сигнатуру "yes!".
После запуска и отработки программы лезу в RAM и сохраняю в файл весь образ памяти. Почему-то не сохраняется как bin, пришлось сохранять в Intel hex, а потом конвертить в bin программой hex2bin.
В общем как оказалось, вокодер работал неправильно: битовые поля voice и Wo считались неверно! Из-за этого декодированный в винде файл звучал некорректно.
Несколько часов убил на поиск проблемы....... А дело оказалось в недостаточном размере для кучи! При переполнении кучи происходил наезд на регион переменных/кода и программа работала не так!
В стартапе исправил размер кучи и стека на всякий случай:
Пересобрал, залил, сдампил память, проверил корректность постоения буфера - с такими размерами работает верно. Содержимое буфер один-в-один как делает виндовская версия энкодера.
Ниже скриншот STM32 ST-LINK Utility с найденным по сигнатуре 'yes!' буфером, построенным вокодером:
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
В общем, затрахов довольно много, особенно с выделением памяти для регионов программы. Особенно с динамической памятью. Никогда неизвестно точно, сколько надо кучи отвалить со стеком, чтобы не было наездов на код и статические переменные.
Остались незатронутым регионы RAM : backup и CCM. Первая позволяет работать почти как EEPROM, а вторая - обычный кусок RAM, но не рулится через DMA и работа с ней только через процессор.
В качестве конвертера HEX в BIN использую как уже писал: hex2bin.
Для редактирования файлов, дампов: HxD - Hex редактор
Для преобразования бинарников в H-файлы (чтобы в Си инклудить wav-файлы): bin2header.
Дальше планирую проверить работу декодера: по построенному буферу должен корректно синтезировать на выходе волну.
Наш народ любит трахаться, стоя в гамаке под проливным дождём... (героически преодолевать самостоятельно созданные трудности) Как делал я: в примере Audio_Playback&Recording вместо PCM в .wav файл пишу на флешку результат работы кодека и проверяют его через loopback - т.е. в дуплексе, проц сам кодирует данные с микрофона и тут же их раскодирует на кодек. Это простой и наглядный тест :-)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Проверил работу декодера. Работает также исправно, только кучу снова пришлось увеличить, так как 1/3 звукового файла похерилась хаосом. После изменений всё хорошо.
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Освоил вывод звука через встроенный DAC. Немного расстроило, что STM32F407VG не имеет FIFO DAC с прерыванием по окончанию буфера. Приходится ручками класть слово в регистр данных DAC, причём тайминг также задается софтово.
В примере, что ниже, таймер тикает с 24 МГц, а прерывание вызывается 8000 раз в секунду - для получения частоты дискретизации 8 кГц.
Так как исходный файл 16 бит signed, для упрощения вычислений был выбран 12-битовый режим DAC с "левым смещением", чтобы не чикать младшие 4 бита. Но избавиться от знака всё-же пришлось : проще и быстрее операцией XOR 0x7FFF, правда волна инвертируется, но человеческому уху пофиг
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
Звук слегка синтетический - ФНЧ после ноги желателен.
Сигнал выводится на ногу PA4. И он оказался слабым даже для наушников(были подключены через конденсатор 10 нФ). Пришлось спаять усилитель. Как всегда на скорую руку: на транзисторе из УПЧ приемника макета предыдущей конструкции.
Оказалось слишком сильно для наушников, поэтому поставил на вход резистор 100 ком.
Это сообщение отредактировал Gospodin_Riba - Oct 11 2016, 06:32 PM
Присоединённое изображение (Нажмите для увеличения)
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (romanetz @ Oct 10 2016, 08:11 AM)
Наш народ любит трахаться, стоя в гамаке под проливным дождём... (героически преодолевать самостоятельно созданные трудности) Как делал я: в примере Audio_Playback&Recording вместо PCM в .wav файл пишу на флешку результат работы кодека и проверяют его через loopback - т.е. в дуплексе, проц сам кодирует данные с микрофона и тут же их раскодирует на кодек. Это простой и наглядный тест :-)
Мне реально некогда напаивать флешки, чтобы проверить работу энкодера. В моем случае с отладчиком проще некуда
--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (romanetz @ Oct 11 2016, 07:10 PM)
Сам же писал, что купил пару F4discovery. Не надо там ничего напаивать.
На моих платах нет разъема под MMC, SD mini/micro/standard, а тем более USB Flash. Скорее всего либо у вас более навороченная плата, либо чего-то я не понял.
Поработал с АЦП и DMA каналами. Ниже рабочий код. К ноге PA1 подключен движок переменного резистора 47 кОм. Остальные ноги резистораподключены к +3,3V и GND.
В примере можно фиксировать преобразование по окончанию DMA передачи(весь буфер заполнен) и по переполнению таймера(по одному преобразованию).
Хорошо, что в АЦП предусмотрели возможность работы его с DMA, что делает филлинг буфера прозрачным и незаметным для пользователя
Надо бы подпаять электретный микрофон и резистор смещения и вывести это всё в DAC
Micro-USB разъем на дискавери работает в режиме USB On-The-Go, т.е. проц F407 может быть как хостом, так и девайсом. Для подключения флешки применяют тот же самый переходник/кабель, которым в телефон USB-флешку подключают. У DMA есть прерывания HTIF (half-transfer, половина буфера передана) и TCIF (transfer completed, буфер передан полностью). В сочетании с кольцевым режимом DMA как то, что нужно для обработки потоковых данных.
Это сообщение отредактировал romanetz - Oct 12 2016, 11:27 AM
Я дма с ацп пустил на постоянную на низкой скорости, таймером 8000 раз в сек просто с переменной где всегда есть выборка переношу в массив, кода заполняетса ставлю флаг и на декод и отправку. Еще прикол, сс1101 в режиме прямой модуляции куда подключен уарт, по дма еще и через уарт сливаю. Кода нет несущей, в уарте мусор. Перед отправкой шлем типа а0а0.
Более просто и понятно: таймер служит триггером АЦП, а DMA настроено по сигналу окончания преобразования АЦП, правильно? Там несколько вариантов возможно: DMA от АЦП, триггер АЦП - от таймера; DMA и триггер АЦП - от таймера. В обоих вариантах никакую переменную читать не нужно, два раза по длине буфера срабатывает прерывание от DMA и разрешает обрабатывать новый блок данных длиной в пол буфера. Этот же или подчиненный (slave) таймер может запускать и передачу очередного отсчета из выходного буфера вокодера в канал связи.
Посэмплово что ли? А в чем тогда смысл DMA вообще? Обычно для уменьшения накладных расходов поблочно обрабатывают (а если ядру процессора делать нечего в это время - спит)
Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16
QUOTE (romanetz @ Oct 12 2016, 11:26 AM)
Micro-USB разъем на дискавери работает в режиме USB On-The-Go, т.е. проц F407 может быть как хостом, так и девайсом. Для подключения флешки применяют тот же самый переходник/кабель, которым в телефон USB-флешку подключают.
Аааааааа...... вот оно что! Ну я все-равно с USB-флешкой играться не умею. Только SD и MMC карты.
QUOTE
У DMA есть прерывания HTIF (half-transfer, половина буфера передана) и TCIF (transfer completed, буфер передан полностью). В сочетании с кольцевым режимом DMA как то, что нужно для обработки потоковых данных.
Это само собой разумеется - только DMA и только прерывания, и кольцевые буферы!
Подпаял УНЧ смикрофоном к АЦП... Чешу репу: звук хреновый - как будто новогодний санта-клаус китайский поёт... С каким-то хрустом на 8 кГц. Скорее всего из-за того что DAC забирает данные по прерыванию таймера - хрень полная!!!
Так что к моей радости DAC через DMA шуршать может и более не надо каждый тик таймера забирать семпл звука!
На его основе сделал свой вариант(ниже), который играет wav-файл через DAC и DMA.
Теперь сижу и думаю - как стделать такую вещь: АЦП оцифровывает сигнал с микрофона, а ЦАП тут же его воспроизводит(можно с задержкой).
Тут уже получается 2 DMA канала и как разрулить половинки буферов по прерываниям - с ходу не представляю. Да, есть прерывание по заполнению 1/4 1/3 1/2 1/1 буфера, но народ писал что без костылей оно как надо не заработает. Пошел думать в общем!
Посэмплово что ли? А в чем тогда смысл DMA вообще? Обычно для уменьшения накладных расходов поблочно обрабатывают (а если ядру процессора делать нечего в это время - спит)
Я чето ненашол методу как зделать подругому. Пользуюсь кубом, в 200 листов даташита невникал. Выставить развешо предделители в ацп чтоб 8кгц получилось. Да и микрофон на 2 вата делаю, там 10ма +- роли неиграют.
Это сообщение отредактировал olega1988 - Oct 13 2016, 06:48 PM