巧用i.MX RT1170时钟观测器
来源:恩智浦MCU加油站 发布时间:2021-11-04 分享至微信

i.MX RT1170的CCM模块内置了一个时钟观测器,全称为Clock Observe。它就像示波器一样可以检测时钟的运行频率,在没有示波器的情况或者开发低功耗应用时非常有用。强大的特点,在于它几乎可以测量芯片内几乎所有的时钟源(Clock Source)和时钟根(Clock Root)。


可测量的时钟源高达22个,基本覆盖了RT1170所有的时钟源。可测量的时钟根高达83个,覆盖了绝大多数的外设时钟根。具体可以测量的时钟源和时钟根列表可以参考 fsl_clock.h的宏定义,搜索关键词Clock OBSERVE SIGNALS即可找到相关的列表。


介绍完基本功能,我们来看一下如何使用这个时钟观测器,也就是如何获取想观测的时钟频率,非常简单,调用下面的API函数接口即可:
uint32_t CLOCK_GetFreqFromObs(uint32_tobsSigIndex, uint32_t obsIndex)

举个例子,用户想知道现在RT1170的主频,Bus总线的时钟频率,怎么办呢?凉拌!
CLOCK_GetFreqFromObs(CCM_OBS_M7_CLK_ROOT);
CLOCK_GetFreqFromObs(CCM_OBS_M4_CLK_ROOT);
CLOCK_GetFreqFromObs(CCM_OBS_BUS_CLK_ROOT);
CLOCK_GetFreqFromObs(CCM_OBS_BUS_LPSR_CLK_ROOT);


直接调用的话,看起来不太方便,通过串口把这些数值打印到终端上,看起来就方便很多了。

PRINTF("M7 CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_M7_CLK_ROOT) / 1000000);
PRINTF("M4 CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_M4_CLK_ROOT) / 1000000);
PRINTF("BUS CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_BUS_CLK_ROOT) / 1000000);
PRINTF("BUS LPSR CLK is %d MHz\r\n", CLOCK_GetFreqFromObs(CCM_OBS_BUS_LPSR_CLK_ROOT) / 1000000);


下图为打印的结果,并不完全是上面代码真实的状态,只是看个意思,我们通过上面的函数即可测量出当前对应时钟根的工作频率。


将函数中的参数进行变换,我们就可以测量自己感兴趣的时钟频率。那么这个观测器在实际中都有哪些作用呢?

  1. 测量时钟的工作频率
    在运行不熟悉代码的时候,不知道别人时钟是怎么配置的时候,获取其工作频率。而不用一行一行翻代码进行工作频率解析。笔者自己经常观测的就是PLL的PFD时钟频率。

  2. 确定时钟源是否开启
    如果把之前提到的函数进行细部探究,便会发现程序中有一行while(),等待测量结束非0的状态。这行代码的功能主要是等待测量结果更新,如果时钟源没开则会在这里一直等下去。
    利用这个特性,就可以判断被测时钟源是否开启。当然这也是双刃剑,调试的时候要记得这个特性,不然程序运行到这里之后就会停下来,一直等下去。

需要注意的点:

  1. OBS的观测需要依靠外部的32K晶振时钟

  2. OBS的功能仅限于调试目的,精度上肯定比不上示波器,但是看个大概还是问题不大的。再强调一遍哦,调试目的,精度不保证,就看个大概!

  3. OBS应该在室温下工作,并且观测的频率不应该超过400MHz。关于400MHz这个限制,笔者在调试的过程中发现,其实大于这个数值也能测准,也能用。但是不负责,不保证,毕竟有这么大个NOTE在RM里写着呢。

[ 新闻来源:恩智浦MCU加油站,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!