Статистика
Время:
Зарегистрированных: 88411
Последним зарегистрирован: igor65
Рекорд посещаемости: 12585
Групп пользователей: 4
 Группы:
[Admin] [Cоучастник] [Автор] [Модератор]
 Сейчас на сайте
 Всего: 611
 Гостей: 610
 Анонимных: 1
 Пользователей: 0
 Зарегистрированные:
Forum Rules Форум по радиосвязи.

Форум по радиосвязи предназначен прежде всего для постояльцев портала, которые кроме паяния жучков умеют жать на тангенту, проводить QSO, которые возлюбили свои антенны, и трансиверы как самого себя. Правила данного форума в рамках пп 6.6., 6.7.8., 6.7.9 соответствуют регламенту проведения радиосвязей

Страницы: (29) [1] 2 3 4 5 6 7 8 9 10 11 ... Последняя » ( Перейти к первому непрочитанному сообщению ) Ответить Новая тема Новый опрос

> Приемо-передатчик с вокодером на 4xx МГц, RFM96 + STM32F4
Gospodin_Riba
  Сообщение: # 705146   Oct 6 2016, 07:33 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




Открываю отдельный топик с обсуждением сего чуда.

Тема произошла от этой: http://vrtp.ru/index.php?showtopic=27695 и является отдельным её ответвлением, так как средства и цели несколько отличаются.

Итак, что имеем:

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
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705149   Oct 6 2016, 08:03 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Вы Дискавери на двухста мипсах юзали? Она под ватт ест в таком режиме, какое нафиг минимальное потребление? Бонусом - на 216 МГц пашет в комнатных условиях месяцами, а вот на 240 уже затыкается, причем именно ядро, периферия молотит.

Это сообщение отредактировал romanetz - Oct 6 2016, 08:05 AM


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
romanetz
Сообщение: # 705150   Oct 6 2016, 08:07 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Кокос и исходники - прекрасно. Но пока они в теме не появятся, обсуждение будет совершенно абстрактным.


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705221   Oct 7 2016, 06:47 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 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 st.gif


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705278   Oct 7 2016, 09:32 PM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 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 тогда тригонометрия запахала.

Всё это я в интернете нашёл как с кокосовским говном бороться, никому моск не ипал, и то прочел, что в плане нормального коде кокос и его гцц - убог.

Но код слинковал, что радует! smile.gif

Завтра буду тестить чудо от Ымперцев под названием Keil uVision. icon_lol.gif
Масоны хоть и проприетарны, но выпускают вещи на несколько порядков лучше и надёжнее, чем опенсорцники-ГНУисты.

Уже поставил Keil MDK-3.x - там нет STM32F4.
Последний кейл 5.x не подошел, так как не идёт под WinXP.

Зато 474 и есть поддержка STM32F4, что радует. shades.gif


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705309   Oct 8 2016, 05:54 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Быстрая тригонометрия есть в либах CMSIS, очень рекомендую включать именно их в проект вместо libm. Они в исходниках идут.


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705426   Oct 9 2016, 06:34 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 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 отработала и светодиоды замигали! smile.gif
Текст программы ниже.

В ближайшем будущем планирую разобраться с DAC, таймерами, прерываниями и вывести буфер на динамик.

Правда на плате есть уже напаянные микрофон и внешний ЦАП с усилком, но я планирую испольщовать другую элементную базу.

Пока без LoRA и без микрофона. Заливать во флеш файл звука и смотреть корректность алгоритмов Codec2.

Ещё хочется DMA задействовать! Опыт работы с ADSP BlackFin 532 показал, что DMA - полезная вещь, так как не требует участия CPU при передаче данных "Периферия - Память" или наоборот. Есть даже режим "Память-Память" (в BF532), можно memcpy() делать без участия процессора.

В общем, надо последовательно осваивать.

CODE

#include <stdlib.h>

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

#include "codec2.h"

#include "wav.h"

#define D 0x8FFFF

GPIO_InitTypeDef PORT;

void Delay(unsigned long int d)
{
while(d--);
}

struct CODEC2 *codec2;
short *buf;
unsigned char *bits;
int nsam,nbit,nbyte;

int main(void)
{
SystemInit();

codec2=(struct CODEC2*)codec2_create();

nsam=codec2_samples_per_frame;
nbit=codec2_bits_per_frame;

buf=(short*)wav;        //(short*)malloc(nsam*sizeof(short));

nbyte=(nbit+7)/8;

bits=(unsigned char*)malloc(nbyte*sizeof(char));

codec2_encode_450(codec2,bits,buf);

/*
codec2_destroy(codec2);

free(buf);
free(bits);
*/

//GPIOD Periph clock enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);

//Configure PD12, PD13, PD14 and PD15 in output pushpull mode
PORT.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
PORT.GPIO_Mode=GPIO_Mode_OUT;
PORT.GPIO_OType=GPIO_OType_PP;
PORT.GPIO_Speed=GPIO_Speed_100MHz;
PORT.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD,&PORT);

while(1)
{
 GPIO_SetBits(GPIOD,GPIO_Pin_15);
 Delay(D);

 GPIO_SetBits(GPIOD,GPIO_Pin_14);
 Delay(D);

 GPIO_SetBits(GPIOD,GPIO_Pin_13);
 Delay(D);

 GPIO_SetBits(GPIOD,GPIO_Pin_12);
 Delay(D);

 GPIO_ResetBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
 Delay(D);
}

}


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705429   Oct 9 2016, 07:29 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




В оригинальном проекте freetel сделан SDR FSK модем на 405м проце, а радиочасть только частоту преобразует
https://svn.code.sf.net/p/freetel/code/sm2000/SM2000-A/
Я бы этот вариант тоже рассматривал

Это сообщение отредактировал romanetz - Oct 9 2016, 07:30 AM

Присоединённый файл ( Кол-во скачиваний: 998 )
Присоединённый файл  SCH_SM2000_A.pdf


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705582   Oct 10 2016, 07:32 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 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. В интернете разжатые утилиты не нашёл.

Код/hex загрузчика в SRAM ниже.

Присоединённый файл ( Кол-во скачиваний: 909 )
Присоединённый файл  ram_loader.zip


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705584   Oct 10 2016, 07:43 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




Ну значит, настроил в Keil регионы памяти:

ROM: 0x20000000 size 0x10000
RAM: 0x20010000 size 0x10000

сделал это в 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 контроллера в этих случаях! и влазить паяльником куда не надо! smile.gif

Прикладываю чудо-утилиты в разжатом виде, без всяких говно-Install Shield-ов:

Присоединённый файл ( Кол-во скачиваний: 887 )
Присоединённый файл  ST_LINK_Utility.zip


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705585   Oct 10 2016, 07:51 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Я вот Дискавери свою уже два года мучаю, никаких проблем с флешкой не заметил. Про тысячу раз в день, это, конечно, загнул - каждые 1,5 минуты без сна и отдыха делать новое изменение в программе, собирать и прошивать? А еще ведь проверить надо, что получилось. завидую такой работоспособности. И ресурс у флешки в ST, насколько помню, - 100 тысяч циклов.


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705586   Oct 10 2016, 07:55 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 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 считались неверно! Из-за этого декодированный в винде файл звучал некорректно.

Несколько часов убил на поиск проблемы....... А дело оказалось в недостаточном размере для кучи! При переполнении кучи происходил наезд на регион переменных/кода и программа работала не так!

В стартапе исправил размер кучи и стека на всякий случай:
CODE

Stack_Size      EQU     0x00000800
Heap_Size       EQU     0x0000B000


Пересобрал, залил, сдампил память, проверил корректность постоения буфера - с такими размерами работает верно. Содержимое буфер один-в-один как делает виндовская версия энкодера.

Ниже скриншот STM32 ST-LINK Utility с найденным по сигнатуре 'yes!' буфером, построенным вокодером:

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705589   Oct 10 2016, 08:03 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




А как же отладка через кейл? :-)


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705591   Oct 10 2016, 08:03 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




В общем, затрахов довольно много, особенно с выделением памяти для регионов программы. Особенно с динамической памятью. Никогда неизвестно точно, сколько надо кучи отвалить со стеком, чтобы не было наездов на код и статические переменные.

Остались незатронутым регионы RAM : backup и CCM. Первая позволяет работать почти как EEPROM, а вторая - обычный кусок RAM, но не рулится через DMA и работа с ней только через процессор.

В качестве конвертера HEX в BIN использую как уже писал: hex2bin.

Для редактирования файлов, дампов: HxD - Hex редактор

Для преобразования бинарников в H-файлы (чтобы в Си инклудить wav-файлы): bin2header.

Дальше планирую проверить работу декодера: по построенному буферу должен корректно синтезировать на выходе волну.

Ниже кусок кода, работа с энкодером:
CODE

#include <stdlib.h>

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

#include "codec2.h"

#include "in_wav.h"

#define D 0x8FFFF

void Delay(unsigned long int d)
{
while(d--);
}

void LED()
{
GPIO_InitTypeDef PORT;
//GPIOD Periph clock enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
//Configure PD12, PD13, PD14 and PD15 in output pushpull mode
PORT.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
PORT.GPIO_Mode=GPIO_Mode_OUT;
PORT.GPIO_OType=GPIO_OType_PP;
PORT.GPIO_Speed=GPIO_Speed_100MHz;
PORT.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD,&PORT);
while(1)
{
 GPIO_SetBits(GPIOD,GPIO_Pin_15);
 Delay(D);
 GPIO_SetBits(GPIOD,GPIO_Pin_14);
 Delay(D);
 GPIO_SetBits(GPIOD,GPIO_Pin_13);
 Delay(D);
 GPIO_SetBits(GPIOD,GPIO_Pin_12);
 Delay(D);
 GPIO_ResetBits(GPIOD,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
 Delay(D);
}
}

struct CODEC2 *codec2;
short *buf;
unsigned char *bits;
unsigned int i;

int main(void)
{

SystemInit();

codec2=(struct CODEC2*)codec2_create();

bits=(unsigned char*)malloc((24*3)+4);

bits[0]='y';
bits[1]='e';
bits[2]='s';
bits[3]='!';

bits+=4;

buf=(short*)in_wav;
 
for(i=0;i<24;i++)
{
 codec2_encode_450(codec2,bits,buf);
 bits+=3;
 buf+=320;
}
 
LED();

}


Ну и не забыть раскомментировать дефайн
CODE
#define VECT_TAB_SRAM
для того чтобы вектора прерываний перенеслись в оперативу. (файл system_stm32f4xx.c от CMSIS). smile.gif


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705592   Oct 10 2016, 08:04 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




QUOTE (romanetz @ Oct 10 2016, 08:03 AM)
А как же отладка через кейл? :-)

Она превосходно работает только с Flash. В SRAM не заработала, потому что не умеет шить туда


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705594   Oct 10 2016, 08:11 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Наш народ любит трахаться, стоя в гамаке под проливным дождём... (героически преодолевать самостоятельно созданные трудности)
Как делал я: в примере Audio_Playback&Recording вместо PCM в .wav файл пишу на флешку результат работы кодека и проверяют его через loopback - т.е. в дуплексе, проц сам кодирует данные с микрофона и тут же их раскодирует на кодек. Это простой и наглядный тест :-)


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705776   Oct 11 2016, 06:21 PM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




Проверил работу декодера. Работает также исправно, только кучу снова пришлось увеличить, так как 1/3 звукового файла похерилась хаосом. После изменений всё хорошо.

Буфер ищется в отладчике по сигнатуре "god!":

QUOTE

#include <stdlib.h>

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

#include "codec2.h"

#include "vocoder.h"

struct CODEC2 *codec2;
short *buf;
unsigned char *bits;
unsigned int i;

int main(void)
{
SystemInit();

codec2=(struct CODEC2*)codec2_create();

buf=(short*)malloc((24*320*2)+4);

buf[0]='og';
buf[1]='!d';

buf+=2;

bits=(unsigned char*)vocoder;
 
for(i=0;i<24;i++)
{
  codec2_decode_450(codec2,buf,bits);
  buf+=320;
  bits+=3;
}
 
LED(); //led blink with loop infinite in this function
}


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705779   Oct 11 2016, 06:28 PM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




Освоил вывод звука через встроенный DAC. Немного расстроило, что STM32F407VG не имеет FIFO DAC с прерыванием по окончанию буфера. icon_cry.gif
Приходится ручками класть слово в регистр данных DAC, причём тайминг также задается софтово.

В примере, что ниже, таймер тикает с 24 МГц, а прерывание вызывается 8000 раз в секунду - для получения частоты дискретизации 8 кГц.

Так как исходный файл 16 бит signed, для упрощения вычислений был выбран 12-битовый режим DAC с "левым смещением", чтобы не чикать младшие 4 бита.
Но избавиться от знака всё-же пришлось : проще и быстрее операцией XOR 0x7FFF, правда волна инвертируется, но человеческому уху пофиг biggrin.gif

Работающий пример для STM32F4DISCOVERY:

CODE

#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

#include "wav.h" //array of 16bit signed mono 8 kHz audio samples

GPIO_InitTypeDef PORT;

int main(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);

PORT.GPIO_Pin=GPIO_Pin_4;
PORT.GPIO_Mode=GPIO_Mode_AN;
PORT.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA,&PORT);

TIM6->PSC=0;              //24 MHz increment(from default BUS settings)
TIM6->ARR=3000;           //8 kHz interrupt
TIM6->DIER|=TIM_DIER_UIE;
TIM6->CR1|=TIM_CR1_CEN;

NVIC_EnableIRQ(TIM6_DAC_IRQn);

DAC->CR|=DAC_CR_EN1;

while(1);
}

void TIM6_DAC_IRQHandler(void)
{
static unsigned long int i=0;
TIM6->SR&=~TIM_SR_UIF;
DAC->DHR12L1=*(signed short int*)(wav+i)^0x7FFF; //signed => unsigned & inverted
i+=2;
if(i==sizeof(wav))i=0;                           //loop
}


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705780   Oct 11 2016, 06:29 PM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




Звук слегка синтетический - ФНЧ после ноги желателен.

Сигнал выводится на ногу PA4. И он оказался слабым даже для наушников(были подключены через конденсатор 10 нФ). Пришлось спаять усилитель. Как всегда на скорую руку: на транзисторе из УПЧ приемника макета предыдущей конструкции.

Оказалось слишком сильно для наушников, поэтому поставил на вход резистор 100 ком.

Это сообщение отредактировал Gospodin_Riba - Oct 11 2016, 06:32 PM

Присоединённое изображение (Нажмите для увеличения)
Присоединённое изображение


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705785   Oct 11 2016, 06:44 PM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




QUOTE (romanetz @ Oct 10 2016, 08:11 AM)
Наш народ любит трахаться, стоя в гамаке под проливным дождём... (героически преодолевать самостоятельно созданные трудности)
Как делал я: в примере Audio_Playback&Recording вместо PCM в .wav файл пишу на флешку результат работы кодека и проверяют его через loopback - т.е. в дуплексе, проц сам кодирует данные с микрофона и тут же их раскодирует на кодек. Это простой и наглядный тест :-)

Мне реально некогда напаивать флешки, чтобы проверить работу энкодера. В моем случае с отладчиком проще некуда


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705794   Oct 11 2016, 07:10 PM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Сам же писал, что купил пару F4discovery. Не надо там ничего напаивать.


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705854   Oct 12 2016, 09:33 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 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, что делает филлинг буфера прозрачным и незаметным для пользователя smile.gif

Надо бы подпаять электретный микрофон и резистор смещения и вывести это всё в DAC smile.gif

CODE

#include "stm32f4xx.h"
#include "stm32f4xx_adc.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_dma.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

unsigned short int adc_buffer[1];

void adc_check()
{
if(adc_buffer[0]>(1024*0)+512)GPIO_SetBits(GPIOD,GPIO_Pin_12);
else GPIO_ResetBits(GPIOD,GPIO_Pin_12);
if(adc_buffer[0]>(1024*1)+512)GPIO_SetBits(GPIOD,GPIO_Pin_13);
else GPIO_ResetBits(GPIOD,GPIO_Pin_13);
if(adc_buffer[0]>(1024*2)+512)GPIO_SetBits(GPIOD,GPIO_Pin_14);
else GPIO_ResetBits(GPIOD,GPIO_Pin_14);
if(adc_buffer[0]>(1024*3)+512)GPIO_SetBits(GPIOD,GPIO_Pin_15);
else GPIO_ResetBits(GPIOD,GPIO_Pin_15);
}

void gpio()
{
GPIO_InitTypeDef porta_setup;
GPIO_InitTypeDef portd_setup;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_StructInit(&porta_setup);
porta_setup.GPIO_Mode=GPIO_Mode_AN;
porta_setup.GPIO_Pin=GPIO_Pin_1;
GPIO_Init(GPIOA,&porta_setup);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
portd_setup.GPIO_Mode=GPIO_Mode_OUT;
portd_setup.GPIO_OType=GPIO_OType_PP;
portd_setup.GPIO_PuPd=GPIO_PuPd_DOWN;
portd_setup.GPIO_Pin=GPIO_Pin_All;
portd_setup.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOD,&portd_setup);
}

void adc()
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
ADC_InitStructure.ADC_ScanConvMode=ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T3_TRGO;
ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising;
ADC_InitStructure.ADC_NbrOfConversion=1;
ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_3Cycles);
ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_DiscModeCmd(ADC1,DISABLE);
ADC_EOCOnEachRegularChannelCmd(ADC1,ENABLE);
ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE);
}

void dma()
{
/*
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_Channel=DMA_Channel_0;
DMA_InitStructure.DMA_PeripheralBaseAddr=(unsigned long int)&ADC1->DR;
DMA_InitStructure.DMA_Memory0BaseAddr=(unsigned long int)&adc_buffer[0];
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize=sizeof(adc_buffer);
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority=DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream0,&DMA_InitStructure);
DMA_Cmd(DMA2_Stream0,ENABLE);
*/

RCC->AHB1ENR|=RCC_AHB1ENR_DMA2EN;
DMA2_Stream4->CR&=~DMA_SxCR_CHSEL;                    //000: channel 0 selected
DMA2_Stream4->PAR=(unsigned long int)&ADC1->DR;
DMA2_Stream4->M0AR=(unsigned long int)&adc_buffer[0];
DMA2_Stream4->NDTR=sizeof(adc_buffer);
DMA2_Stream4->CR|=DMA_SxCR_MINC;                      //address increment
DMA2_Stream4->CR|=DMA_SxCR_MSIZE_0;                   //16 bit
DMA2_Stream4->CR|=DMA_SxCR_PSIZE_0;                   //16 bit
DMA2_Stream4->CR|=DMA_SxCR_CIRC;                      //continious mode
DMA2_Stream4->CR&=~DMA_SxCR_DIR;                      //01: peripheral-to-Memory
DMA2_Stream4->CR|=DMA_SxCR_PL;                        //11: Very high priority
DMA2_Stream4->CR|=DMA_SxCR_TCIE;                      //Transfer complete interrupt enable
DMA2_Stream4->CR|= DMA_SxCR_EN;                       //DMA transfer ON
NVIC_EnableIRQ(DMA2_Stream4_IRQn);
NVIC_SetPriority(DMA2_Stream4_IRQn,5);
}

void timer()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period=3000;                     //use 8 kHz timer overflow
TIM_TimeBaseStructure.TIM_Prescaler=0;                     //use 24 MHz timer tick
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;      //use 24 MHz BUS clock
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update);

TIM_Cmd(TIM3,ENABLE);

/*
TIM3->DIER|=TIM_DIER_UIE;
TIM3->CR1|=TIM_CR1_CEN;
NVIC_EnableIRQ(TIM3_IRQn);
*/
}

int main(void)
{
gpio();
adc();
dma();
timer();
while(1); //infinite loop
}

void TIM3_IRQHandler()
{
TIM3->SR&=~TIM_SR_UIF;
adc_check();
}

void DMA2_Stream4_IRQHandler(void)
{
adc_check();
}


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 705864   Oct 12 2016, 11:26 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Micro-USB разъем на дискавери работает в режиме USB On-The-Go, т.е. проц F407 может быть как хостом, так и девайсом. Для подключения флешки применяют тот же самый переходник/кабель, которым в телефон USB-флешку подключают.
У DMA есть прерывания HTIF (half-transfer, половина буфера передана) и TCIF (transfer completed, буфер передан полностью). В сочетании с кольцевым режимом DMA как то, что нужно для обработки потоковых данных.

Это сообщение отредактировал romanetz - Oct 12 2016, 11:27 AM


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
olega1988
Сообщение: # 705873   Oct 12 2016, 01:15 PM
Quote Post


Посетитель
**

Группа: Cоучастник
Сообщений: 255
Пользователь №: 92766
Регистрация: 17-May 12
Место жительства: Киев



Я дма с ацп пустил на постоянную на низкой скорости, таймером 8000 раз в сек просто с переменной где всегда есть выборка переношу в массив, кода заполняетса ставлю флаг и на декод и отправку. Еще прикол, сс1101 в режиме прямой модуляции куда подключен уарт, по дма еще и через уарт сливаю. Кода нет несущей, в уарте мусор. Перед отправкой шлем типа а0а0.
PMEmail PosterUsers WebsiteICQ
Top
romanetz
Сообщение: # 705916   Oct 12 2016, 07:15 PM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Более просто и понятно: таймер служит триггером АЦП, а DMA настроено по сигналу окончания преобразования АЦП, правильно?
Там несколько вариантов возможно: DMA от АЦП, триггер АЦП - от таймера; DMA и триггер АЦП - от таймера. В обоих вариантах никакую переменную читать не нужно, два раза по длине буфера срабатывает прерывание от DMA и разрешает обрабатывать новый блок данных длиной в пол буфера. Этот же или подчиненный (slave) таймер может запускать и передачу очередного отсчета из выходного буфера вокодера в канал связи.


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
olega1988
Сообщение: # 705959   Oct 12 2016, 11:11 PM
Quote Post


Посетитель
**

Группа: Cоучастник
Сообщений: 255
Пользователь №: 92766
Регистрация: 17-May 12
Место жительства: Киев



Я в кубе нашол упоминаний про события запуска дма. Поэтому оно с ацп берет данные постоянно. Просто 8 кгц раз я в прерывании его забираю.
PMEmail PosterUsers WebsiteICQ
Top
romanetz
Сообщение: # 705970   Oct 13 2016, 05:13 AM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Посэмплово что ли? А в чем тогда смысл DMA вообще? Обычно для уменьшения накладных расходов поблочно обрабатывают (а если ядру процессора делать нечего в это время - спит)


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
Gospodin_Riba
Сообщение: # 705976   Oct 13 2016, 09:00 AM
Quote Post


Фанат
******

Группа: Автор
Сообщений: 2137
Пользователь №: 116127
Регистрация: 26-April 16




QUOTE (romanetz @ Oct 12 2016, 11:26 AM)
Micro-USB разъем на дискавери работает в режиме USB On-The-Go, т.е. проц F407 может быть как хостом, так и девайсом. Для подключения флешки применяют тот же самый переходник/кабель, которым в телефон USB-флешку подключают.

Аааааааа...... вот оно что! smile.gif Ну я все-равно с USB-флешкой играться не умею. Только SD и MMC карты.

QUOTE
У DMA есть прерывания HTIF (half-transfer, половина буфера передана) и TCIF (transfer completed, буфер передан полностью). В сочетании с кольцевым режимом DMA как то, что нужно для обработки потоковых данных.

Это само собой разумеется - только DMA и только прерывания, и кольцевые буферы!

Подпаял УНЧ смикрофоном к АЦП... Чешу репу: звук хреновый - как будто новогодний санта-клаус китайский поёт... С каким-то хрустом на 8 кГц. Скорее всего из-за того что DAC забирает данные по прерыванию таймера - хрень полная!!!

Нашёл тут пример как DAC заставить через DMA работать:
http://00xnor.blogspot.ru/2014/01/6-stm32-...-generator.html
Пример завёлся в Кейле тупым копи-пастом - даже ничего исправлять не пришлось.

Так что к моей радости DAC через DMA шуршать может и более не надо каждый тик таймера забирать семпл звука! smile.gif

На его основе сделал свой вариант(ниже), который играет wav-файл через DAC и DMA.

Теперь сижу и думаю - как стделать такую вещь: АЦП оцифровывает сигнал с микрофона, а ЦАП тут же его воспроизводит(можно с задержкой).

Тут уже получается 2 DMA канала и как разрулить половинки буферов по прерываниям - с ходу не представляю.
Да, есть прерывание по заполнению 1/4 1/3 1/2 1/1 буфера, но народ писал что без костылей оно как надо не заработает. Пошел думать в общем! st.gif

QUOTE

#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_dac.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_dma.h"

#include "wav.h"

#define SIZE              (sizeof(wav)>>1)    //data size in samples
#define DAC_DHR12L1_ADDR  0x4000740C          //DMA writes into this register on every request
#define OUT_FREQ          8000                //sample rate
#define CNT_FREQ          24000000            //TIM6 counter clock (prescaled APB1)
#define TIM_PERIOD        (CNT_FREQ/OUT_FREQ) //Autoreload reg value

static void Data_Convert(void)
{
unsigned long int i;
unsigned short int *buf;
buf=(unsigned short int*)wav;
for(i=0;i<SIZE;i++)buf[i]^=0x7FFF;
}

static void GPIOA_Config(void)
{
GPIO_InitTypeDef GPIO_A;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_A.GPIO_Pin =GPIO_Pin_4;
GPIO_A.GPIO_Mode=GPIO_Mode_AN;
GPIO_A.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA,&GPIO_A);
}

static void TIM6_Config(void)
{
TIM_TimeBaseInitTypeDef TIM6_TimeBase;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
TIM_TimeBaseStructInit(&TIM6_TimeBase);
TIM6_TimeBase.TIM_Period      =(unsigned short int)TIM_PERIOD;
TIM6_TimeBase.TIM_Prescaler    =0;
TIM6_TimeBase.TIM_ClockDivision=0;
TIM6_TimeBase.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6,&TIM6_TimeBase);
TIM_SelectOutputTrigger(TIM6,TIM_TRGOSource_Update);
TIM_Cmd(TIM6,ENABLE);
}

static void DAC1_DMA_Config(void)
{
DAC_InitTypeDef DAC_INIT;
DMA_InitTypeDef DMA_INIT;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
DAC_INIT.DAC_Trigger      =DAC_Trigger_T6_TRGO;
DAC_INIT.DAC_WaveGeneration=DAC_WaveGeneration_None;
DAC_INIT.DAC_OutputBuffer  =DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1,&DAC_INIT);
DMA_DeInit(DMA1_Stream5);
DMA_INIT.DMA_Channel          =DMA_Channel_7;
DMA_INIT.DMA_PeripheralBaseAddr=(uint32_t)DAC_DHR12L1_ADDR;
DMA_INIT.DMA_Memory0BaseAddr  =(uint32_t)&wav;
DMA_INIT.DMA_DIR              =DMA_DIR_MemoryToPeripheral;
DMA_INIT.DMA_BufferSize        =SIZE;
DMA_INIT.DMA_PeripheralInc    =DMA_PeripheralInc_Disable;
DMA_INIT.DMA_MemoryInc        =DMA_MemoryInc_Enable;
DMA_INIT.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
DMA_INIT.DMA_MemoryDataSize    =DMA_MemoryDataSize_HalfWord;
DMA_INIT.DMA_Mode              =DMA_Mode_Circular;
DMA_INIT.DMA_Priority          =DMA_Priority_High;
DMA_INIT.DMA_FIFOMode          =DMA_FIFOMode_Disable;
DMA_INIT.DMA_FIFOThreshold    =DMA_FIFOThreshold_HalfFull;
DMA_INIT.DMA_MemoryBurst      =DMA_MemoryBurst_Single;
DMA_INIT.DMA_PeripheralBurst  =DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Stream5,&DMA_INIT);
DMA_Cmd(DMA1_Stream5,ENABLE);
DAC_Cmd(DAC_Channel_1,ENABLE);
DAC_DMACmd(DAC_Channel_1,ENABLE);
}

int main()
{
Data_Convert();
GPIOA_Config();
TIM6_Config();
DAC1_DMA_Config();
Loop:
goto Loop;
}


--------------------
По всем вопросам пишите на почту: repstosw2018 [собака] gmail [точка] com
Энтузиазм заканчивается, когда начинается Кризис. Рождается Капитализм :)
PMEmail Poster
Top
romanetz
Сообщение: # 706000   Oct 13 2016, 02:51 PM
Quote Post


Дедушка
*******

Группа: Cоучастник
Сообщений: 5363
Пользователь №: 99518
Регистрация: 13-March 13




Учел в схеме, что АЦП и ЦАП работают только с однополярным сигналом? Стандартный формат (для обработки сигнала) PCM 16-bit signed


--------------------
https://github.com/romanetz
Linuxcnc project contributor
PMEmail Poster
Top
olega1988
Сообщение: # 706032   Oct 13 2016, 06:45 PM
Quote Post


Посетитель
**

Группа: Cоучастник
Сообщений: 255
Пользователь №: 92766
Регистрация: 17-May 12
Место жительства: Киев



QUOTE (romanetz @ Oct 13 2016, 05:13 AM)
Посэмплово что ли? А в чем тогда смысл DMA вообще? Обычно для уменьшения накладных расходов поблочно обрабатывают (а если ядру процессора делать нечего в это время - спит)

Я чето ненашол методу как зделать подругому. Пользуюсь кубом, в 200 листов даташита невникал. Выставить развешо предделители в ацп чтоб 8кгц получилось. Да и микрофон на 2 вата делаю, там 10ма +- роли неиграют.

Это сообщение отредактировал olega1988 - Oct 13 2016, 06:48 PM
PMEmail PosterUsers WebsiteICQ
Top

Настройки темыСтраницы: (29) [1] 2 3 4 5 6 7 8 9 10 11 ... Последняя » Ответить Шустрый ответ Новая тема Новый опрос


 




  banner DIPTRACE - САМЫЙ ЛУЧШИЙ ТАКСИРОВЩИК ПЕЧАТНЫХ ПЛАТ
Portal-X