Пауза счетчика SAMD21 TCC

Периферийное устройство Atmel SAMD21 TCC предоставляет команду STOP, которая приостанавливает счетчик. Счетчик можно возобновить с помощью команды RETRIGGER.

Когда выдается STOP, TCC входит в состояние отказа, в котором выходы либо переводятся в три состояния, либо переводятся в состояния, указанные в регистре конфигурации. Предположительно, этот механизм предназначен для поддержки фиксированного отказоустойчивого состояния вывода.

В моем случае я хочу, чтобы выходные контакты зафиксировались в том состоянии, в котором они находились во время команды STOP. Единственный способ, которым я могу это сделать, — это обновлять сконфигурированный регистр состояния выходного сигнала неисправности каждый раз, когда обновляются выходы, что требует обработки прерывания, что противоречит цели большей части архитектуры расширения формы выходного сигнала TCC, а также является вычислительная нагрузка, которую я бы предпочел избежать. Есть и другие сложности, такие как учет механизма мертвого времени и гонки аппаратного и программного обеспечения.

Поэтому я искал способы добиться этого, которые не включают команду STOP, но я не вижу другого способа остановить счетчик. Невозможно стробировать тактовый вход периферии, и его отключение в GCLK исключено, поскольку он также запускает TCC1. (И кто знает, к каким еще последствиям это может привести.) Отрицание бита ENABLE, помимо того, что является излишним, неудивительно, что также три состояния выходов. Изменение конфигурации различными другими способами обычно требует записи в регистры, защищенные от включения, поэтому сначала требуется отключить периферийное устройство.

(Одна идея, которую я еще не исследовал, состоит в том, чтобы управлять счетчиком из системы событий и вместо этого управлять генерацией/стробированием событий.)

Итак: есть ли способ приостановить периферийное устройство в его текущем состоянии, сохранив при этом состояние выходных контактов?


person Jeremy    schedule 14.01.2019    source источник


Ответы (1)


Все, что я могу придумать, это асинхронное событие COUNT, которое звучит так, будто оно является воротами для часов к счетчику.

(номера страниц из руководства от 03/2016)

31.6.4.3. События, с.712; Подсчет во время активного состояния асинхронного события (увеличение или уменьшение, в зависимости от направления счетчика). В этом случае счетчик будет увеличиваться или уменьшаться в каждом цикле предварительно масштабированных часов, пока событие активно.

31.8.9. Управление событиями, стр. 734; Регистр EVCTRL, биты 2:0 – EVACT0[2:0]: Таймер/счетчик событий Вход 0 Действие 0x5 COUNT (асинхронный) Подсчет в активном состоянии асинхронного события

Недостатком является то, что программные события должны быть синхронными.

person aMike    schedule 22.01.2019
comment
Это действительно кажется путем к решению, но, как вы указываете, он не может использовать программные события, потому что они синхронны - только асинхронные события могут обеспечить устойчивое состояние, необходимое для стробирования подсчета. Тогда возникает вопрос о том, как найти способ генерировать асинхронное событие — возможно, вывод Match из другого канала TC/TCC или прерывание EIC. На черный день. - person Jeremy; 28.01.2019