巧用i.MX RT1170时钟观测器

cathy的头像
cathy 发布于:周五, 11/05/2021 - 09:13 ,关键词:

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

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

“巧用i.MX

介绍完基本功能,我们来看一下如何使用这个时钟观测器,也就是如何获取想观测的时钟频率,非常简单,调用下面的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);

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

“巧用i.MX

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

1)测量时钟的工作频率

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

2)确定时钟源是否开启

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

“巧用i.MX

需要注意的点:

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

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

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

“巧用i.MX

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 64