Пауза счетчик SAMD21 TCC
Периферийное устройство Atmel SAMD21 TCC предоставляет команду STOP, которая приостанавливает работу счетчика. Счетчик может быть возобновлен командой RETRIGGER.
Когда выдается STOP, TCC переходит в состояние отказа, в котором выходы либо находятся в трех состояниях, либо приводятся в состояние, указанное в регистре конфигурации. Предположительно этот механизм предназначен для поддержки фиксированного отказоустойчивого состояния вывода.
В моем случае я хочу, чтобы выходные контакты замерзали в состоянии, в котором они находились во время команды STOP. Единственный способ сделать это - обновлять сконфигурированный регистр состояния вывода ошибок каждый раз, когда обновляются выходы, что требует обработки прерываний, что противоречит цели большей части архитектуры расширения формы выходного сигнала TCC, а также является нагрузка обработки я бы предпочел избежать. Есть и другие сложности, такие как учет механизма мертвого времени и аппаратные / программные гонки.
Так что я искал способы достижения этого, которые не включают команду STOP - но я не вижу другого способа остановить счетчик. Невозможно управлять входом периферийных часов, и отключение его в GCLK исключается, так как он также запускает TCC1. (И кто знает, какие другие эффекты это могло бы иметь.) Отрицание бита ENABLE, помимо того, что оно является избыточным, неудивительно, что также дает выходы. Изменение конфигурации различными другими способами обычно требует записи для включения защищенных регистров, поэтому сначала необходимо отключить периферийное устройство.
(Одна идея, которую я еще не исследовал, заключается в том, чтобы управлять счетчиком из системы событий и вместо этого управлять генерацией / стробированием событий.)
Итак: есть ли способ приостановить периферию в ее текущем состоянии, сохраняя при этом состояние выходных контактов?
1 ответ
Все, что я могу попробовать - это асинхронное событие "COUNT", которое звучит так, как будто это ворота для часов на счетчик.
(номера страниц из руководства 03/2016)
31.6.4.3. События, с.712; Подсчет во время активного состояния асинхронного события (увеличение или уменьшение, в зависимости от направления счетчика). В этом случае счетчик будет увеличиваться или уменьшаться в каждом цикле предварительно масштабированных часов, пока событие активно.
31.8.9. Контроль событий, с.734; Регистр EVCTRL, биты 2:0 - EVACT0[2:0]: вход события таймера / счетчика 0 Действие 0x5 COUNT (асинхронный) Счетчик активного состояния асинхронного события
Недостатком является то, что программные события должны быть синхронными.