Периферийное устройство Atmel SAMD21 TCC предоставляет команду STOP, которая приостанавливает счетчик. Счетчик можно возобновить с помощью команды RETRIGGER.
Когда выдается STOP, TCC входит в состояние отказа, в котором выходы либо переводятся в три состояния, либо переводятся в состояния, указанные в регистре конфигурации. Предположительно, этот механизм предназначен для поддержки фиксированного отказоустойчивого состояния вывода.
В моем случае я хочу, чтобы выходные контакты зафиксировались в том состоянии, в котором они находились во время команды STOP. Единственный способ, которым я могу это сделать, — это обновлять сконфигурированный регистр состояния выходного сигнала неисправности каждый раз, когда обновляются выходы, что требует обработки прерывания, что противоречит цели большей части архитектуры расширения формы выходного сигнала TCC, а также является вычислительная нагрузка, которую я бы предпочел избежать. Есть и другие сложности, такие как учет механизма мертвого времени и гонки аппаратного и программного обеспечения.
Поэтому я искал способы добиться этого, которые не включают команду STOP, но я не вижу другого способа остановить счетчик. Невозможно стробировать тактовый вход периферии, и его отключение в GCLK исключено, поскольку он также запускает TCC1. (И кто знает, к каким еще последствиям это может привести.) Отрицание бита ENABLE, помимо того, что является излишним, неудивительно, что также три состояния выходов. Изменение конфигурации различными другими способами обычно требует записи в регистры, защищенные от включения, поэтому сначала требуется отключить периферийное устройство.
(Одна идея, которую я еще не исследовал, состоит в том, чтобы управлять счетчиком из системы событий и вместо этого управлять генерацией/стробированием событий.)
Итак: есть ли способ приостановить периферийное устройство в его текущем состоянии, сохранив при этом состояние выходных контактов?