К1921ВГ015 DMA+TMR
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
К1921ВГ015 DMA+TMR
задача такая:
таймер генерит шим по 2м каналам CAPCOM[2] и CAPCOM[3].
режим таймера 1, от 0 до CAPCOM[0].
имеем буфер по 2 значения для таймера.
каким образом запихивать по событию CAP0 через DMA данные из буфера в 2 регистра. выход шим многоканальный.
т.е. например буфер на 16 значений,
при первом CAP0 значения 0 и 1 попадают в CAPCOM[2] и [3] соответственно
при втором - 2 и 3 попадают в CAPCOM[2] и [3] соответственно
и т.д. до конца буфера. при дохождении до конца циклически поновой.
подходит только разборка сборка для периферии, но тогда нужно еще куча структур для каждой итерации. хорошо когда итераций всего 16/2... а когда 256? это уже килобайт.
но я так понял что для этого режима нет цикла...
у стм это было красиво решено. в настройке DMA таймера задавалось количество передач, ну и в какие регистры помещать данные, при этом DMA писал в один единственный регистр.
как в вашем случае решить такую задачу?
немного не понял, можно ли на один запрос от таймера посадить 2 канала DMA? чтоб переллельно писать в оба регисра поодиночке из своих буферов?
таймер генерит шим по 2м каналам CAPCOM[2] и CAPCOM[3].
режим таймера 1, от 0 до CAPCOM[0].
имеем буфер по 2 значения для таймера.
каким образом запихивать по событию CAP0 через DMA данные из буфера в 2 регистра. выход шим многоканальный.
т.е. например буфер на 16 значений,
при первом CAP0 значения 0 и 1 попадают в CAPCOM[2] и [3] соответственно
при втором - 2 и 3 попадают в CAPCOM[2] и [3] соответственно
и т.д. до конца буфера. при дохождении до конца циклически поновой.
подходит только разборка сборка для периферии, но тогда нужно еще куча структур для каждой итерации. хорошо когда итераций всего 16/2... а когда 256? это уже килобайт.
но я так понял что для этого режима нет цикла...
у стм это было красиво решено. в настройке DMA таймера задавалось количество передач, ну и в какие регистры помещать данные, при этом DMA писал в один единственный регистр.
как в вашем случае решить такую задачу?
немного не понял, можно ли на один запрос от таймера посадить 2 канала DMA? чтоб переллельно писать в оба регисра поодиночке из своих буферов?
-
- Сообщения: 224
- Зарегистрирован: 14 дек 2015, 08:21
- Предприятие: АО НИИЭТ
- Откуда: АО НИИЭТ, Воронеж
Re: К1921ВГ015 DMA+TMR
Доброго времени суток!
К сожалению, для каждого таймера доступно по одному каналу DMA.
Чтобы параллельно писать в оба регистра поодиночке из своих буферов можно запараллелить два таймера, в том числе и входы блоков захвата.
Второй вариант - вместо передачи DMA использовать механизм прерываний.
Re: К1921ВГ015 DMA+TMR
Доброго дня!dav писал(а): ↑04 фев 2025, 15:53 К сожалению, для каждого таймера доступно по одному каналу DMA.
Чтобы параллельно писать в оба регистра поодиночке из своих буферов можно запараллелить два таймера, в том числе и входы блоков захвата.
Второй вариант - вместо передачи DMA использовать механизм прерываний.
спасибо! жаль...
к сожалению у вас слишком мало таймеров, чтоб на каждый выход выделять по одному...
только и остается прерываниями вешать систему...
может вам стоит добавить механизм как у СТМ? было бы оч удобно! да и таймеров бы добавить не мешало...
кстати...
вопрос по DMA
по прерыванию от внешнего контакта DMA должен брать значение таймера и помещать в буфер.
2R ставлю 0, т.е. арбитраж после каждого запроса.
а если не будет внешнего прерывания, никто не дернул ногой?
все остальные запросы DMA от других каналов не будут обработаны?
Последний раз редактировалось dezna 04 фев 2025, 16:11, всего редактировалось 1 раз.
Re: К1921ВГ015 DMA+TMR
Добрый день!
Можно в обработчике прерывания от CAPCOM[0] перенастраивать и программно запускать два (или более) канала DMA. Каждый будет брать данные из своего буфера и класть в свой необходимый регистр.
Останется только вопрос максимальной возможной частоты ШИМ при таком подходе
Re: К1921ВГ015 DMA+TMR
Добрый день!ches писал(а): ↑04 фев 2025, 16:10 Добрый день!
Можно в обработчике прерывания от CAPCOM[0] перенастраивать и программно запускать два (или более) канала DMA. Каждый будет брать данные из своего буфера и класть в свой необходимый регистр.
Останется только вопрос максимальной возможной частоты ШИМ при таком подходе
на сколько это будет проще чем просто по прерыванию из буфера перемещать значения в CAPCOM[2,3]?
шим не прям скоросной, рассчет из того что минимальный импульс 0,5мкс.
делителя частоты 8 тоже не хватает...
ладно, буду изголяться...
кстати, не плохо было бы для каждого таймера ввести делитель частоты и вместо CAPCOM[0] отдельный регистр, иначе не возможно генерить 4 канала шим на одном таймере... ну и захват будет работать с гораздо большими временными рамками, которые можно будет настраивать!
Re: К1921ВГ015 DMA+TMR
Параметр R_POWER задается для каждого канала индивидуально.dezna писал(а): ↑04 фев 2025, 16:10 вопрос по DMA
по прерыванию от внешнего контакта DMA должен брать значение таймера и помещать в буфер.
2R ставлю 0, т.е. арбитраж после каждого запроса.
а если не будет внешнего прерывания, никто не дернул ногой?
все остальные запросы DMA от других каналов не будут обработаны?
По большому счету он имеет значение при попытке нескольких каналов одновременно пересылать данные и нужен для задания приоритетности в работе каналов.
В Вашем случае канал еще не начал работу и все остальные запросы будут обработаны.
Re: К1921ВГ015 DMA+TMR
спасибо!ches писал(а): ↑04 фев 2025, 16:23 Параметр R_POWER задается для каждого канала индивидуально.
По большому счету он имеет значение при попытке нескольких каналов одновременно пересылать данные и нужен для задания приоритетности в работе каналов.
В Вашем случае канал еще не начал работу и все остальные запросы будут обработаны.
а если один раз уже сработало и все?
Re: К1921ВГ015 DMA+TMR
Да, согласен, наверное в данном случае это не слишком оправдано.
Это будет полезно при передаче через DMA больших объемов данных, чтобы сократить время работы обработчика прерываний и разгрузить ядро.
Re: К1921ВГ015 DMA+TMR
После этого нужно перенастроить канал. После выполнения передачи он перейдет в режим "недействительный" если не настроен циклический режим. Если настроен то перенастраивать не нужно. И далее все должно работать в как первый раз