简介:
在MCU系统里,系统时钟的准确性及精度对于系统的安全运行非常重要,为保证系统可对时钟的准确性进行监控,从F28004X 系列开始,C2000 产品增加了一个新的功能模块Dual-Clock Comparator,简称DCC。DCC是一个可配置的,双时钟比较的模块,用于在应用程序的时间执行期间确定时钟信号的准确性。 DCC 使用另一个输入时钟作为参考来测量可选时钟源的频率。 时钟源以及精度由应用程序编程。可以实现对时钟信号提供时钟输入频率的自主、实时的监控,当输入时钟频率范围超出设定值时,DCC模块会触发错误,从而完成对输入时钟频率的监控。本文以F280049为例,介绍了DCC模块的工作原理和实际应用及相应的注意事项。
1.DCC工作原理介绍和配置方法:
顾名思义,DCC模块提供了两个时钟模块clock0 和clock1 按照设定比例及允许误差范围进行互相校验,用户可以自由选择两个时钟的输入源,如下图所示,同时也需要设定最大的允许误差。
Counter1 的时钟源有:
PLLRAWCLK
INTOSC1
INTOSC2
Counter0 的时钟源有:
XTAL
INTOSC1
INTOSC2
注:F280049是Type1 型的DCC,F28002x, F28003x, F280013x, F280015x, F2838x 均为Type2 型的DCC,clock0 和clock1都有更多的输入源,具体细节可以参考对应产品的datasheet。
在DCC的设定过程中,除了选定的被检测的两个时钟外,还有两个重要的参数:tolerance 和frequency error。
1. Tolerance : Tolerance代表着DCC模块的颗粒细度,Tolerance越大,Clock0和Clock1的counter 越小,类似于ADC 的采样位数更小。但是当频率异常的时候,也可以反应的更快。我们一般设这个值为1%。
2. Frequency error:时钟误差的接受度,由于两个时钟的不同步和量化都会引入误差,所以本身就存在一个最小的误差。同时,时钟一定程度的偏差也是可以接受的,可以根据系统的需求输入,针对+/- total error 的时间偏差,都是可以被接受的。
根据系统需要,给出Tolerance和frequency error,计算方法在库函数中可以看到:
count0 = window - total_error;
valid = 2 * total_error;
count1 = window * freq1 / freq0;
配置好后,一旦DCC 被使能,counter0 和Valid0 会在每一次clock0 的时钟信号来一次减1,同样的,counter1 会在每一次clock1的时钟信号来一次减1。
我们先假设clock0 是个可靠的时钟,在clock1 的精度在允许最大误差内运行的时候,三个计数器应该按照下列顺序到达0:
Counter0 -> Counter1 -> Valid0
如果clock1的误差偏大,那么 有两种失效可能性:
一种是clock1 偏快,那么就会出现clock1 的counter1 先到达0。
一种是clock1 偏慢 ,那么就会出现clock0和valid0都到达0 之后, counter1 还没到达0。
2.实际应用:
在实际应用中,我们既可以用Clock0 来监测Clock1的精度,也可以用clock1 来监测Clock0的丢失(将Clock0设为XTAL)(因为Clock1输入只能选内部时钟)。DCC 的值的计算比较复杂,可以用TI 提供的driverlib 函数DCC_continuousMonitor()来完成计算,也可以参考C2000Ware中的例程,方便快速实现功能。DCC 相关例程的路径如下:C:\ti\c2000\C2000Ware_4_03_00_00\driverlib\f28004x\examples\dcc
需要注意的是:
DCC 还可以配置为在单次或连续模式下运行。 在单次模式下,DCC 执行一次性倒计时,当计数器达到 0 时 DCC 停止操作。引发完成中断并可以检查状态。
在连续模式下,因为需要锁住发生错误的时刻(即counter0 或counter1 的值),也会使得DCC 模块报错后,counter停止工作。会遇到只能进入一次DCC中断的情况,如果客户希望多次进入DCC 中断,则需要在DCC中断中重新使能DCC模块,可以通过调用这个函数来实现:DCC_enableModule(DCC0_BASE)。
3.总结:
使用DCC模块可以方便快捷地实现对两路时钟信号输入频率的自主、实时监控,通过对两路时钟计数器的比较,可以实现对时钟系统可靠的监控,从而保证整个系统的安全可靠运行。