如图所示,CMU单元的输入时钟是系统时钟fspb,100mhz。其内部的分频模块有外部时钟产生单元(EGU)、可配置时钟产生单元(CFGU)、固定时钟产生单元(FXU)三个。
其中CFGU(可配置时钟产生单元)算是第一级的时钟分频单元,系统时钟进入CFGU后先经过一个全局系统分频器产生时钟GCLK。该时钟作为CFGU的8个子时钟分频器的输入时钟,相应的可以产生8个输出时钟:CMU_CLK0——CMU_CLK8。这8个时钟输出可以作为TIM单元的基础时钟、TIM滤波时钟、ATOM输入时钟以及FXU分频模块的输入时钟。
而FXU(固定时钟产生单元)是一个固定的时钟分频单元,其输入时钟可以是GCLK,也可以是CMU_CLKx。
输入时钟可以产生5个分频系数固定的分频时钟:CMU_FXCLKx。目前已知的应用是作为TOM单元的输入时钟。
另外EGU(外部时钟产生)是一个外部时钟输出单元,主要用于产生50%占空比的实时时钟,用于外部器件的使用。其时钟输入直接是系统时钟,经过分频可以产生3个通道的时钟输出:CMU_ECLKx。
2、CMU单元的基本应用
2.1配置全局时钟分频GCLK
我们说过系统时钟进入CMU单元要进过全局分频器的分频,所以第一件事是配置GCLK的产生。其分频参数的计算我们就不一一介绍了,这里直接给出ILLD的驱动:
IfxGtm_Cmu_setGclkFrequency(gtm,1000000.0f);
其中第一个参数是模块,第二个参数是配置的时钟频率单位是Hz,这里配的是1MHz,对应的时间分度是1us。
2.2配置CMU_CLKx时钟
接着可以配置CFGU单元,用于产生CMU_CLKx,这里可以根据需要来分别配置8个通道的时钟输出,当然不需要的可以不配置。
IfxGtm_Cmu_setClkFrequency(gtm,IfxGtm_Cmu_Clk_0,100000.0f);
其中第二个参数用于选择时钟通道,最后一个参数则是时钟频率定义,这里我们定义为100KHz,对应的时间分度为10us。
当然配置完,不要忘记使能该时钟。
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0);
2.3配置FXU时钟输出**(时钟的分频值是固定的)**
首先要选择FXU单元的输入时钟,如果不选择则默认为GCLK。
GTM_CMU_FXCLK_CTRL.B.FXCLK_SEL = IfxGtm_Cmu_Clk_0;
选择也简单,就是直接配置寄存器即可。接着需要使能FXCLK,因为该单元的分频参数都是固定的,所以直接使能即可,而且直接使能所有通道:
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK);
一切的时钟起点是外部晶振或者PLL锁相环(这个时钟是通过外部晶振或者系统自带的时钟配置的)放大之后的时钟,得到这两个时钟是整个时钟的起点,然后根据这两个时钟配置SPB时钟,这个时钟是各个模块的时钟源起点,配置了这个时钟然后通过外部时钟产生单元(EGU)、可配置时钟产生单元(CFGU)、固定时钟产生单元(FXU),这三个时钟配置的分频作为下一级时钟的产生,spb时钟最先作为CFGU的时钟源分频产生GCLK时钟然后这个时钟又作为时钟源为EGU与FXU(这个的时钟源好像是系统时钟),然后再一步步分频下去为每个模块单独供应时钟基准