могу посоветовать отказаться от инжекторных каналов и настроить цепочку преобразований на регулярных каналах. в таком случае все становится немного проще. просто указываете ацп какие каналы используются в работе, какое количество каналов будет обсчитываться, настраиваете дма для работы и запускаете ацп в работу. далее ацп само складывает новые значения после преобразований в один массив, в котором все указанные для обсчета каналы лежат последовательно.
задействован только 1 канал дма и можно настроить любую цепочку, с любой последовательностью каналов. нет "гемороя" с дополнительным таймером т.к. связка ацп-дма будет работать в автомате, а мы только забираем значения из массива.
Так и в группе инжектированных каналов можно настроить любую цепочку, только ограничение в 4 канала максимум. Но мне надо только два. Один канал DMA - это на мой взгляд минус, все будет валиться в кучу в один массив. Или я чего-то не понимаю?
И я согласен с этим решением :) Там такие тонны индусского говнокода, что лучше через регистры. Причем, в большинстве своем тупые врапперы без особой нагрузки.
ТОП: 22:00 (московское)magict30pJune 9 2020, 19:00:10 UTC
Вы попали в Т30P самых обсуждаемых тем в блогосфере. Это Ваш 9-й ТОПовый пост в этом году. Посмотреть статистику автора можно в карточке топблогера.
( ... )
Вы тут себе понасоздавали дополнительных трудностей, чтобы потом успешно их преодолевать, поэтому и СТМ32 кажется чересчур сложным. Ну зачем еще инжектированные входы АЦП? Они не для этого предназначены. И подбирать время, когда преобразование завершено и данные помещаются в регистр - решение плохое
( ... )
Никак не могу понять, почему все видят в инжектированных каналах какие-то дополнительные трудности. Это такие же каналы, как и регулярные, но имеющие следующие отличия: плюс - раздельные регистры, минус - их всего 4. В остальном все одинаково.
По поводу подбирать время - а не то же самое с регулярными каналами? Они ведь тоже будут запускаться от таймера, поэтому надо так подобрать время выборки и время преобразования АЦП, чтобы в период таймера гарантированно помещалось преобразование группы каналов. И это тоже пришлось бы проверять осциллографом. А если оно гарантированно помещается, то я могу не проверяя флаг конца преобразования данные читать. Разве не так?
Совет сделать глобальный буфер данных АЦП - плохой. Мое решение лучше, где раздельные буферы спрятаны внутри своих экземпляров класса.
Сложность STM32 на грани возможностей человека, напряг такой, что невозможно себя заставить заниматься этим процессором. Короче, камень для гениев. И философов. Философский камень.
С регулярными все проще: есть таймер, генерирующий TRGO с нужной частотой (96 КГц в вашем случае), от таймера запускается АЦП, который оцифровывает последовательность из двух каналов. В настройках АЦП стоит флаг "использовать DMA", поэтому по окончанию оцифровки каждого канала он автоматически дает сигнал контроллеру DMA на трансфер 16-ти бит. Ничего подбирать не надо. Использовать таймер для непосредственной активации DMA - неправильно, трансфером должно управлять устройство, поставляющее данные
( ... )
Как это подбирать не надо? А где гарантия, что серия преобразований влезет в период таймера?
Использовать таймер для активации DMA, конечно, менее красиво, но нет другой возможности привязать два канала DMA к АЦП. Какую конкретно угрозу в этом решении Вы видите? В период таймера гарантированно помещается серия преобразований АЦП. Что может быть не так с DMA? А то решение здесь критикуют, но конкретного минуса никто назвать не может.
Совет иметь общий буфер - как раз и есть индусский. Я стремлюсь к красоте кода, как и к красоте плат. И эта красота достигается иногда нетривиальными решениями, как здесь с двумя каналами DMA.
Comments 95
Reply
Reply
Reply
Reply
Reply
Reply
Reply
а функции потом и переписать можно.
Reply
Это Ваш 9-й ТОПовый пост в этом году.
Посмотреть статистику автора можно в карточке топблогера.
( ... )
Reply
По поводу DSP для cortex M.
CMSIS-DSP содержит все необходимое.
http://www.keil.com/pack/doc/CMSIS/DSP/html/index.html
https://developer.arm.com/tools-and-software/embedded/cmsis
https://www.iar.com/support/resources/articles/using-iar-embedded-workbench-for-arm-and-the-cmsis-dsp-library/https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.st.com/resource/en/
Reply
Reply
Reply
Reply
По поводу подбирать время - а не то же самое с регулярными каналами? Они ведь тоже будут запускаться от таймера, поэтому надо так подобрать время выборки и время преобразования АЦП, чтобы в период таймера гарантированно помещалось преобразование группы каналов. И это тоже пришлось бы проверять осциллографом. А если оно гарантированно помещается, то я могу не проверяя флаг конца преобразования данные читать. Разве не так?
Совет сделать глобальный буфер данных АЦП - плохой. Мое решение лучше, где раздельные буферы спрятаны внутри своих экземпляров класса.
Сложность STM32 на грани возможностей человека, напряг такой, что невозможно себя заставить заниматься этим процессором. Короче, камень для гениев. И философов. Философский камень.
Reply
Reply
Использовать таймер для активации DMA, конечно, менее красиво, но нет другой возможности привязать два канала DMA к АЦП. Какую конкретно угрозу в этом решении Вы видите? В период таймера гарантированно помещается серия преобразований АЦП. Что может быть не так с DMA? А то решение здесь критикуют, но конкретного минуса никто назвать не может.
Совет иметь общий буфер - как раз и есть индусский. Я стремлюсь к красоте кода, как и к красоте плат. И эта красота достигается иногда нетривиальными решениями, как здесь с двумя каналами DMA.
Reply
Leave a comment