暂停 SAMD21 TCC 计数器

Pause SAMD21 TCC counter

A​​tmel SAMD21 TCC 外设提供了一个 STOP 命令,用于暂停计数器。可以使用 RETRIGGER 命令恢复计数器。

发出 STOP 后,TCC 进入故障状态,其中输出为三态,或驱动至配置寄存器中指定的状态。据推测,该机制旨在支持固定的故障安全输出状态。

在我的例子中,我希望输出引脚冻结在它们在执行 STOP 命令时所处的状态。我能看到的唯一方法是在每次更新输出时更新配置的故障输出状态寄存器——需要中断处理,这违背了大部分 TCC 输出波形扩展架构的目的,同时也是一个我宁愿避免处理负载。还有其他并发症,例如考虑死时间机制和 hardware/software 比赛。

所以我一直在寻找不涉及 STOP 命令的方法来实现此目的 - 但我看不到任何其他停止计数器的方法。没有办法门控外设时钟输入,并且排除了在 GCLK 中禁用它的可能性,因为它也运行 TCC1。 (谁知道这会产生什么其他影响。)取反 ENABLE 位,除了矫枉过正之外,不出所料也会使输出处于三态。以各种其他方式修改配置通常需要写入启用保护的寄存器,因此需要先禁用外设。

(我还没有研究过的一个想法是从事件系统中驱动计数器,并控制事件 generation/gating。)

那么:有什么方法可以暂停外围设备的当前状态,同时保持输出引脚的状态?

我能想到的就是尝试异步 'COUNT' 事件,这听起来像是 时钟到计数器的门。

(03/2016 手册页码)

31.6.4.3。事件,第 712 页; 在异步事件的活动状态期间计数(递增或递减,取决于计数器方向)。在这种情况下,只要事件处于活动状态,计数器就会在预分频时钟的每个周期递增或递减。

31.8.9。事件控制,第 734 页; EVCTRL寄存器, 位 2:0 – EVACT0[2:0]:Timer/Counter 事件输入 0 动作 0x5 COUNT(异步)计数异步事件的活动状态

缺点是软件事件必须是同步的。