Pull to refresh
88
0
Вадим Дерябкин @Vadimatorikda

Инженер-программист

Send message
КДПВ была целым видео к предыдущей статье (в первой части). Это, можно сказать, продолжение. Что не влезло в предыдущую (было бы сложно читать их вместе...). Так что КДПВ для обеих в первой.
Вы правы. Имело ввиду, что пока что данного файла нет в комплекте с библиотекой. Он, предполагаю, сейчас дорабатывается. Точной информацией я не владею.
И тут я осознал, что мне необходим Linux… Огромное спасибо автору. Попробую установить, опробовать на второй OS.
Кстати говоря. Пришла такая шальная мысль. А собираетесь ли вы портировать под вашу ос BOINC клиент? Ваша ОС потребляет мало. Так что она бы по КПД выигрывала (я так думаю) у Linux и тем более у Win. В связи с чем задания бы выполнялись с большим КПД.
Если будет достойный САПР, то я перейду на вашу ОС. Под Windows сижу лишь потому, что под него есть нормальные компиляторы (типа keil-а) и САПР (Altium Designer).
По-поводу САПР-а очень интересно. Где можно почитать о нем или даже попробовать?
Это будет сделано в следующей статье) Сейчас просто разбираюсь с SPI и библиотекой конвертером из MP3 или вообще FLAC.
Не знал наверняка. Решил спросить у тех. поддержки.
вообще-то для работы с аудио нужен сигма дельта ацп
его нет в серии 1986ве9х...
1. А в чем палево? Да, мне безумно нравиться эта мелодия… Она ещё всплывет.
2. Мне ЕГЭ через месяц писать) Часть С буду на паскале делать. Он для меня самый простой.
Хорошая работа. Только вот зачем же такие дорогие МК? Тут вполне хватило бы Atmega 8. У меня он работал, управляя оборотами токарного станка. Один дросель и пара конденсаторов на питание и все было хорошо. На мой взгляд плата с Arduino Mega 2560 слишком дорога для подобных устройств. Но если устройство единично, то ничего страшного. Спасибо за статью.
А таймер1 и передача по одному элементу нужна для того, чтобы управляя периодом таймера1 управлять выходной частотой, да?

Да, для этого.
Я к тому, что можно было, наверное, настроить на передачу всего массива точек сразу, и только таймером2 контролировать момент, когда пора запускать выдачу следующего периода? Но тогда частота синуса была бы жестко привязана к тактовой частоте МК…

Да, технически можно обойтись одним таймером, если сгенерировать синусоиду привязанной к частоте. Но это бред… В следующей статье (то, о чем говорю, уже дописано) мы сделаем небольшую функцию, которая будет меняя частоту таймера играть MIDI мелодию (одно голосую). А после покажу способ (сейчас еще выбираю, как будет проще), как сделать выдачу многоголосой музыки без изменения настроек таймера.
Кода не осталось… Пришлось компоновать из статьи. Пока компоновал — удалил код для следующей статьи… Ну да ладно. Все к лучшему. Переписал. Статью дополнил. Пишите об успехах или вопросах, поясню.
Есть массив структур для параметров для ПДП (почему их 64?).

Каждый канал имеет первичную и альтеранативную структуру (того две). Каналов DMA имеет 32 (0..31). На каждый канал по 2 структуры = 64 структуры. Мы используем всего 1 канал и можем оставить только 2 структуры. Остальную память можно использовать по собственному назначению. НО. Каждая структура имеет свой фиксированный адрес со смещением в 1024. К примеру для канала «0» первичная структура может размещаться в 0x20000000 или 0x20000200, 0x20000400 и т.д… Нельзя разместить структуру для третьего канала (если мы используем только третий канал) по адресу 0x20000000. Он обязательно должен быть 0x20000030, или 0x20000230, или 0x20000430 и т.д.
Таймер1 «магически» (в железе) связан с каналом ПДП, и заставляет ДМА (по одному элементу массива синуса за раз?)

Таймер 1 железно (в чипе) связан с DMA. Когда таймер генерирует сигнал — он «производит процедуру арбитража». Иначе говоря, разрешает передачу. В структуре мы указали, что контроллер должен ждать этого разрешения после каждой передачи. Если бы мы хотели передавать, к примеру, по 128 значений, то в структуре нужно было бы указать «производить арбитраж через каждые 128 передач». Тогда бы за один вызов таймера мы бы передавали 128 значений.
Таймер2 генерирует прерывание каждые четверть периода синуса, в прерывании смотрим, прошли ли мы половину периода, и если прошли, переключаем ПДП на альтернативную управляющую структуру.

Не только половину. Мы проверяем, передал ли DMA первую структуру и хотя бы один элемент из следующей. Потому что есть риск, что мы проверим структуру как раз в тот момент, когда ПДП передал последней элемент структуры, но еще не попытался передать элемент из следующей. Тогда мы «восстановим» структуру и в этот же момент ДМА вместе перехода к новой структуре начнет заново передавать все из восстановленной.
Тут такое есть (сказали ниже).
ЗЫ: а почему один из хабов статьи — Objective C?

Я вроде бы на C пишу… Значит и этот тег тоже выбрать следовало. Разве нет?
Для того, чтобы сделать то, что вы описали — нужно уметь работать с таймером. А пока что у меня не было такого урока. Следующим будет именно он.
Для меня, видимо… Ссылку указал. То, что вы описали, будет представлено в следующей статье. Хочется показать сначала реализацию от «что первое приходит на ум» до «как надо».
Он является частью ядра Cortex-M3, если мне не изменяет память.

Вы меня заставили немного усомниться в своих знаниях. Интереса ради пробежался по описаниям всех достоинств Cortex-M3. Нигде не нашел упоминания о том, что DAC — часть ядра. SysTick — да. Везде об этом пишут. Но про DAC не нашел. Да и лично мне не попадался STM32 с DAC (Из тех, что из F100 и F103). Например в самом часто используемом мной STM32F103C8 — нет DAC (сейчас еще раз пересмотрел в описании). А он на Cortex-m3. Делаю вывод — он не часть ядра.
Вы бы перешли с STM на этот МК, будь одинаковые условия по цене, доступности и т.д.?

Лично я — перешел. Уже. Сейчас. Надеюсь, что удастся договориться в будущем с Миландром о сотрудничестве и получать образцы) Сейчас к ЕГЭ готовиться нужно. Иначе не быть мне прибористом. А вообще хочу пойти в какую-нибудь фирму как раз типа Миландра. Всегда мечтал работать на самом низком уровне логики (писать ядра, исправлять периферию...).
Напишите про ваши впечатления — как оно работает?

Пока что мне все нравится, но я не всего каснулся. Лично ДМА для следующей статьи сейчас настраиваю 3-й день. Не смог разобраться с документацией. Вернее смог, но так и не запустилось. Сейчас получил помощь с официального форума в виде типового кода под свою задачу. Если все удастся — выложу все: как пытался, как не получилось, какие грабли были, как от них избавился. Мне всегда не нравилось, что в статьях не пишут, что делать, если что-то работает не так, как должно. Я же буду описывать все грабли и их признаки.
Нашел остальные статьи и чот приуныл (( Вы игнорируете библиотеки, а нам это не кажется особо верным подходом. Значит, скорее всего, я продолжу тему Миландров когда-нибудь и сделаю серию статей по работе с периферией исключительно через библиотеки.

Да, игнорирую. Причем в упор. Не нравятся они мне. Честно сказать я бы не отказался от правильно отлаженной графической среды (кою пишу сейчас сам). Прошу меня понять. Я начинал с паскаля под AVR, но потом пройдя через си ощутил все блаженство от ассемблера. Но вот писать на ассемблере под STM32 было очень трудно. Море нюансов, которые нигде не описывают. Так что дальше мигалки с USART дело не двинулось. Сейчас же я могу наконец-то, благодаря документации на родном (хоть и местами корявом) языке, настроить все сам. На си. Ассемблер придется забыть( Но если мне в руки попадет восьмибитка от Миландра — я начну писать курс про освоения ее на ассемблере и си одновременно. Для сравнения.
Читайте на здоровье. Скоро выпущу эпичную статью. Она сейчас в разработке: «Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI. Генерируем и воспроизводим звук (Освоение ЦАП, таймеров, DMA)».
Спасибо за исправление. Исправлю!

Information

Rating
Does not participate
Location
Красноярск, Красноярский край, Россия
Date of birth
Registered
Activity

Specialization

Software Developer, Embedded Software Engineer
Lead
From 250,000 ₽
C++
STM32
Linux
Circuitry
Python
Assembler
Programming microcontrollers
Embedded system
Software development
Object-oriented design