AURIX-TC3xx-GTM详解六-DPLL(Digital PLL Module)

1、主要框图

2、主要信号说明

以下对各信号简单说明

注意TIM1 CH0使用的是TIEM****测量模式

2.1、TRIGGER(49bit)

来自TIM0_CH0或来自TSPP0处理TIM0_CH0后的信号TSPPO。本文只讨论来自TIM0_CH0的信号。

其中

bit0~bit23是时基,链接到ARU_OUT(23:0),即TBU_TS0存到GPR0;

bit47~bit24是时基,链接到ARU_OUT(47:24),即TBU_TS0存到GPR1;

bit49是信号值,链接到ARU_OUT(48),即TIM0 CH0采集的信号是上升沿还是下降沿。当也原始信号出现上升沿时,整个ECNT计数器值总是奇数,而当也原始信号出现下降沿时,它总是偶数,可以通过判断ECNT寄存器的bit0(即ARU_OUT(48))判断是上升沿还是下降沿。

总结:TRIGGER代表测量的来自TIM0_IN0(原始的信号)经过滤波等处理后TIM0_OUT0的信号。其中bit48代表上升沿(0)还是下降沿(1),bit47~24代表TBU_TS0,bit23~0代表TBU_TS0。

2.2、T_VALID

TRIGGER值的有效性,未理解含义,未理解实际怎么使用。

2.3、STATE

类似于TRIGGER,STATE代表测量的来自TIM0_IN1(原始的信号)经过滤波等处理后TIM0_OUT1的信号。

2.4、S_VALID

STATE值的有效性,未理解含义,未理解实际怎么使用。

2.5、PMTR_D

3、主要功能

3.1、DPLL RAM

DPLL模块自带RAM模块,各子功能RAM的地址和大小如下图。主要有RAM1A,RAM1B,RAM1C,RAM2四块RAN区域。

注意:以下地址为相对地址。

以下为GTM模块的地址0xF0100000u。举例DPLL_RAM2的绝对地址是:

0xF0100000u+0x0002C000 = 0xF012C000

4、主要寄存器

4.1、TIM0 CH0主要寄存器

主要基于下图涉及的寄存器讲解

4.1.1、GPR0寄存器

包含了8bit的ECNT边沿检测和24bit的GPR0寄存器。

8bit ECNT只读,为奇数时表示上升沿,偶数时表示下降沿;

24bit GPR0寄存器的值可以来源于以下4种可能:

24bit CNTS寄存器(影子寄存器);

24bit TBU_TS0;

24bit TBU_TS1;

24bit TBU_TS2;

4.1.2、GPR1寄存器

包含了8bit的ECNT边沿检测和24bit的GPR1寄存器。

8bit ECNT只读,为奇数时表示上升沿,偶数时表示下降沿;

24bit GPR1寄存器的值可以来源于以下4种可能:

24bit SMU的CNT寄存器;

24bit TBU_TS0;

24bit TBU_TS1;

24bit TBU_TS2;

4.1.3、CNTS寄存器

包含了8bit的ECNT寄存器、24bit的CNTS影子寄存器

4.1.4、控制寄存器

**bit0:**TIM_EN,TIM channel x enable,通道使能

**bit1~bit3:**TIM_MODE,TIM channel x mode,通道模式,有6种模式,TPWM、TPIM、TIEM、TIPM、TBCM、TGPS和TSSM。

**bit4:**OSM,One-shot mode,连续采集模式还是一次采集模式

**bit5:**ARU_EN,GPR0 and GPR1 register values routed to ARU,GPR0和GPR1寄存器是否通过ARU传输

**bit6:**CICTRL,通道输入使用本通道还是上一个通道

**bit7:**TBU0_SEL,使用TBU_TS0(共27bit)的高24bit还是低24bit存储GPR0和GPR1寄存器的值

**bit8~bit9:**GPR0_SEL,选择GPR0来源。

来源可以是:

TBU_TS0(24bit)+ ECNT(8bit)组成32bit GPR0寄存器。使用EGPR0_SEL控制是否接到GPR0寄存器(EGPR0_SEL=0表示接,EGPR0_SEL=1表示断开)

TBU_TS1(24bit)+ TIM_INP_VAL(8bit)组成32bit GPR0寄存器。使用EGPR0_SEL控制是否接到GPR0寄存器(EGPR0_SEL=0表示接,EGPR0_SEL=1表示断开)

TBU_TS2(24bit)+ 预留(8bit)组成32bit GPR0寄存器。使用EGPR0_SEL控制是否接到GPR0寄存器(EGPR0_SEL=0表示接,EGPR0_SEL=1表示断开)

CNTS寄存器(24bit)+ 预留(8bit)组成32bit GPR0寄存器。使用EGPR0_SEL控制是否接到GPR0寄存器(EGPR0_SEL=0表示接,EGPR0_SEL=1表示断开)

**bit10~11:**GPR1_SEL,选择GPR1来源。

来源可以是:

TBU_TS0(24bit)+ ECNT(8bit)组成32bit GPR1寄存器。使用EGPR1_SEL控制是否接到GPR1寄存器(EGPR1_SEL=0表示接,EGPR1_SEL=1表示断开)

TBU_TS1(24bit)+ TIM_INP_VAL(8bit)组成32bit GPR1寄存器。使用EGPR1_SEL控制是否接到GPR1寄存器(EGPR1_SEL=0表示接,EGPR1_SEL=1表示断开)

TBU_TS2(24bit)+ 预留(8bit)组成32bit GPR1寄存器。使用EGPR1_SEL控制是否接到GPR1寄存器(EGPR1_SEL=0表示接,EGPR1_SEL=1表示断开)

SMU的CNT寄存器(24bit)+ 预留(8bit)组成32bit GPR1寄存器。使用EGPR1_SEL控制是否接到GPR1寄存器(EGPR1_SEL=0表示接,EGPR1_SEL=1表示断开)

**bit12:**CNTS_SEL,选择影子寄存器CNTS。可来源于:TBU_TS0或SMU的CNT寄存器

bit13:DSL,测量上升沿或下降沿选择(仅当ISL位为=0时设置有效)

**bit14:**ISL,TIEM模式下选择双沿还是上升沿或下降沿。如为0B,单沿采集(上升还是下降沿由DSL决定);如为1B,双沿采集,此时忽略DSL的设置。

**bit15:**ECNT_RESET,如为0B,ECNT工作在循环模式;如为1B,ECNT周期采样reset

**bit16:**FLT_EN,滤波使能或禁止

**bit17~bit18:**FLT_CNT_FRQ滤波计数器时钟选择,可以是CLK0/1/6/7

**bit19:**EXT_CAP_EN,外部捕获使能或禁止

**bit20:**FLT_MODE_RE,上升沿滤波模式

**bit21:**FLT_CTR_RE,上升沿滤波计数器模式

**bit22:**FLT_MODE_FE,下降沿滤波模式

**bit23:**FLT_CTR_FE,下降沿滤波计数器模式

**bit24~bit26:**CLK_SEL,时钟选择,可以是CMU模块的CLK0~CLK7之一

bit27:FR_ECNT_OFL,是否扩展边沿寄存器(如8bit或16bit)

bit28:EGPR0_SEL,见GPR0_SEL

'bit29:EGPR1_SEL,见GPR1_SEL

bit30~bit31:TOCTRL,超时控制。

4.2、DPLL主要寄存器

4.2.1、DPLL_RAM_INI

**bit0:**INIT_1A,只读位,指示RAM1A区域初始化是否在运行

**bit1:**INIT_1BC,只读位,指示RAM1B和RAM1C区域初始化是否在运行

**bit2:**INIT_2,只读位,指示RAM2区域初始化是否在运行

**bit3:**INIT_RAM,启动所有DPLL RAM区域的初始化

4.2.2、DPLL_ADT_Ti

bit0~bit12:只读位,

bit13~bit15:

bit16~bit18:

4.2.3、DPLL_OSW

bit9~bit8:OSS,RAM的偏移大小。

4.2.4、控制寄存器0

**bit0~9:**MLT,TRIGGER信号的乘数,即倍频。在两个正常TRIGGER事件(如两个曲轴转速信号的正常齿的下降沿之间)。如MLT设置为599,那么两个正常齿的下降沿之间被分了599+1=600份。

bit10:

bit11~bit15:

**bit16~bit24:**TNU,TRIGGER数量,正常齿和缺齿(要虚拟补齐为正常齿事件的数量)的TRIGGER事件总和。如60-2曲轴的TRIGGER数量是60(58正常齿事件和一个缺齿(虚拟补齐为2个正常齿事件))。如TNU设为59,那么TRIGGER数量为59+1=60。

bit25:

bit26:

bit27:

bit28:

bit29:

**bit30:**TEN,TRIGGER使能或禁止

bit31:

4.2.5、控制寄存器1

5、代码示例

主要实现曲轴信号的输入解析及ATOM的时序控制

5.1、TIM0 CH0处理

5.1.1、TIM0 CH0初始化

非关键参数见在TIM模块的博客里详见,此处不展开。

主要功能:

1)以TEIM方式测量输入。

2)打开边沿检测中断和新值中断。

3)检测双边沿(上升沿和下降沿)

4)TBU_TS0分别存入GPR0和GPR1寄存器。GPR0会通过ARU(23:0)传输到MAP和DPLL模块,GPR1会通过ARU(47:24)传输到MAP和DPLL模块。

cs 复制代码
IfxGtm_Tim_Timer TIM_Timer_Tim0CH0;
IfxGtm_Tim_In    TIM_IN_Tim0CH0;

/* TIM0 channel0. */
void Init_Tim0_0(void)
{
    IfxGtm_enable(&MODULE_GTM);    /* 使能GTM模块. */
    IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0); /* 使能CLK0时钟. */
    IfxGtm_Tim_In_Config configTIM_IN; /* 定义结构体变量 */

    IfxGtm_Tim_In_initConfig(&configTIM_IN, &MODULE_GTM);    
    /* 装载默认值到configTIM_IN结构体. */

    configTIM_IN.timIndex = IfxGtm_Tim_0; /* 设为TIM0 */
    configTIM_IN.channelIndex = IfxGtm_Tim_Ch_0; /* 设为CH0*/

    /* 以下不涉及,不关心,使用默认值即可 */
    // configTIM_IN.irqMode = IfxGtm_IrqMode_pulseNotify; 
    // configTIM_IN.isrPriority = IfxSrc_Tos_cpu3;
    // configTIM_IN.isrPriority = 0;
    // configTIM_IN.capture.irqOnNewVal = FALSE;
    // configTIM_IN.capture.irqOnCntOverflow = FALSE;
    // configTIM_IN.capture.irqOnEcntOverflow = FALSE;
    // configTIM_IN.capture.irqOnDatalost = FALSE;
    // configTIM_IN.capture.clock = IfxGtm_Cmu_Clk_0;
    // configTIM_IN.capture.mode = Ifx_Pwm_Mode_leftAligned;
    // configTIM_IN.capture.gateCount = 0;
    // configTIM_IN.capture.activeEdge = IfxGtm_Tim_In_ActiveEdge_falling;
        
    /* 超时不关心 */
    configTIM_IN.timeout.clock = IfxGtm_Cmu_Clk_0;
    configTIM_IN.timeout.irqOnTimeout = FALSE;
    configTIM_IN.timeout.timeout = 0.0;
  
    configTIM_IN.filter.inputPin = &IfxGtm_TIM0_0_P02_0_IN;  /* 选择输入port . */
    /* 滤波不关心,可根据实际配置,使用默认值即可 */
    // configTIM_IN.filter.input = IfxGtm_Tim_In_Input_currentChannel;
    // configTIM_IN.filter.inputPinMode = IfxPort_InputMode_pullDown;         
    /* Select input port pin mode. */
    // configTIM_IN.filter.risingEdgeMode =             
             IfxGtm_Tim_In_ConfigFilterMode_individualDeglitchTimeUpDown;
    // configTIM_IN.filter.fallingEdgeMode = 
             IfxGtm_Tim_In_ConfigFilterMode_individualDeglitchTimeUpDown;
    //    configTIM_IN.filter.risingEdgeFilterTime = 0;
    //    configTIM_IN.filter.fallingEdgeFilterTime = 0;
    //    configTIM_IN.filter.clock = IfxGtm_Cmu_Tim_Filter_Clk_0;
    //    configTIM_IN.filter.irqOnGlitch = FALSE;
    IfxGtm_Tim_In_init(&TIM_IN_Tim0CH0, &configTIM_IN);  /* 初始化以上配置. */

    IfxGtm_Tim_Timer_Config configTIM_Timer; /* 定义结构体变量 */

    IfxGtm_Tim_Timer_initChannelConfig(&configTIM_Timer, &MODULE_GTM);  
    /* 装载默认值到configTIM_Timer结构体. */

    configTIM_Timer.timIndex      = IfxGtm_Tim_0;  /* 设置为TIM0 */
    configTIM_Timer.channel       = IfxGtm_Tim_Ch_0;  /* 设置为CH0 */
    configTIM_Timer.channelControl.enable = TRUE;  /* 使能通道 */
    configTIM_Timer.channelControl.mode = IfxGtm_Tim_Mode_inputEvent; 
    /* 设为TIEM测量模式 */
    configTIM_Timer.channelControl.enableOneShotMode = FALSE; /* 关闭依次测量模式 */
    configTIM_Timer.channelControl.enableAruRouting = TRUE; 
    /* 使能ARU路由功能后才能将TIM0_CH0(49bit)路由到MAP模块和DPLL模块*/

    configTIM_Timer.channelControl.channelInputControl = FALSE;
    /* FALSE表示本通道(即TIM0_CH0)作为输入;TURE表示上一个通道(即TIM0_CH7)作为输入*/

    configTIM_Timer.channelControl.gpr0Sel = IfxGtm_Tim_GprSel_tbuTs0;
    /* TBU_TS0(24bit时基)存入到GPR0(24bit)里 */
    
    configTIM_Timer.channelControl.gpr1Sel = IfxGtm_Tim_GprSel_tbuTs0;
    /* TBU_TS0(24bit时基)存入到GPR1(24bit)里 */

    configTIM_Timer.channelControl.cntsSel = IfxGtm_Tim_CntsSel_cntReg;
    /* CNTS来自CNT寄存器 */

    configTIM_Timer.channelControl.signalLevelControl = FALSE;  
    /* DSL 0:falling edge;1:rising edge. 表示的是以上升沿还是下降沿测量 */

    configTIM_Timer.channelControl.ignoreSignalLevel = TRUE;   
    /* ISL:0:由DSL决定;1:双沿.表示以单沿测量(上升还是下降由DSL决定)还是双沿测量 */

    configTIM_Timer.channelControl.enableCounterReset = FALSE; /* 测量计数器循环归零 */
    configTIM_Timer.channelControl.enableFilter = TRUE; /* 使能滤波 */

    configTIM_Timer.channelControl.filterCounterFrequency  =         
         IfxGtm_Tim_FilterCounterFreqSel_cmuClk0; /* 设置滤波时钟 */
        
    configTIM_Timer.channelControl.enableExternalCaptureMode     = FALSE; 
    /* 关闭外部捕获模式*/

    configTIM_Timer.channelControl.filterModeRisingEdge  = 
         IfxGtm_Tim_FilterMode_individualDeglitchTime; /* 设置上升沿滤波模式 */

    configTIM_Timer.channelControl.filterCounterModeRisingEdge   =     
         IfxGtm_Tim_FilterCounter_hold;  /* 设置上升沿滤波模式 */

    configTIM_Timer.channelControl.filterModeFallingEdge   =     
         IfxGtm_Tim_FilterMode_individualDeglitchTime;  /* 设置下降沿滤波模式 */

    configTIM_Timer.channelControl.filterCounterModeFallingEdge  = 
         IfxGtm_Tim_FilterCounter_hold; /* 设置下降沿滤波模式 */

    configTIM_Timer.channelControl.clkSel = IfxGtm_Cmu_Clk_0; /* 选择通道时钟为clk0 */
    configTIM_Timer.channelControl.extendEdgeCounterOverflow     = FALSE; 
    /* 边沿检测计数器(ECNT)的位数,FALSE:8bit,TURE:16bit */

    configTIM_Timer.channelControl.egpr0Sel = FALSE; /* 看上图Figure44容易理解,表示连接 */
    configTIM_Timer.channelControl.egpr1Sel = FALSE; /* 看上图Figure44容易理解,表示连接 */

    configTIM_Timer.channelControl.timeoutControl = IfxGtm_Tim_Timeout_disabled; 
    /* 超时关闭 */

    configTIM_Timer.raisingEdgeFilterTime = 0; /* 上升沿滤波时间 */
    configTIM_Timer.fallingEdgeFilterTime  = 0; /* 下降沿滤波时间 */
    configTIM_Timer.shadowCounter  = 0;  /* 影子计数器初始值 */
    configTIM_Timer.irqEnable  = 1; /* 使能中断 */

    configTIM_Timer.irqMode = IfxGtm_IrqMode_pulseNotify; 
    /* 中断模式为脉冲模式,即检测到上升沿或下降沿都发生中断 */

    configTIM_Timer.irqType = IfxGtm_Tim_IrqType_newVal; 
    /* 中断类型:SMU信号测量单元发生新值就中断 */

    /* 不涉及 */
    configTIM_Timer.inputSourceSelect.mode = 0;
    configTIM_Timer.inputSourceSelect.value = 0;
    configTIM_Timer.enableAuxInputSourceSelect  = FALSE;

    IfxGtm_Tim_Timer_initChannel(&TIM_Timer_Tim0CH0, &configTIM_Timer);  
    /* 将上面的值写入TIM0 CH0 . */

    /* 在CPU0里以优先级180运行中断 */
    IfxSrc_init(&MODULE_SRC.GTM_TIM[0][0], IfxSrc_Tos_cpu0, 180);
    IfxSrc_enable(&MODULE_SRC.GTM_TIM[0][0]);
}

TIM0_CH0初始化后将根据实际信号有以下动作:

1)产生TIM0_CH0(49)的信号,此信号bit49保存的是上升沿(0)还是下降沿(1);高或低24bit保存的是TBU_TS0的计数值;

2)当实际硬线信号有上升沿或下降沿都产生中断

3)当SMU信号处理单元有新值发生时发生中断。

基于以上,就可以做如下功能:

在上升沿或下降沿中断里判断TIM0_CH0(49)的bit9来进一步确定是上升沿还是下降沿。具体如何处理见3.1.2章节

5.1.2、TIM0 CH0中断处理

主要实现找到缺齿、并与DPLL同步。同步后关闭TIM0 CH0的中断,之后就将TIM0_CH0(49bit)通过ARU传递到MAP和DPLL处理。

cs 复制代码
/* enumeration DPLL synchronous state */
typedef enum
{
    DPLL_CRS_noSync                 = 0,
    DPLL_CRS_Sync                   = 1,
    DPLL_CRS_WaitSync               = 2,
    DPLL_CRS_LossSync               = 3,
} DPLL_SyncState;


DPLL_SyncState DPLL_CRS_SyncState;

IFX_INTERRUPT(TIM0_CH0_CrkSync, 0, 180);/*在CPU0以中断优先级180处理TIM0_CH0_CrkSync功能*/

/* synchronize crank input from TIM0 channel 0 to DPLL. */
void TIM0_CH0_CrkSync(void)
{

    static uint32 TIM0_CH0_GPR0_Value;  /* 定义TIM0 channel0 GPR0寄存器静态变量. */

    static uint32 TIM0_CH0_OldTs = 0;   /* 定义TIM0_CH0_OldTs静态变量 . */
    static uint32 TIM0_CH0_NewTs = 0;   /* 定义TIM0_CH0_NewTs 静态变量 . */
    static uint32 TIM0_CH0_OldDiff = 0; /* 定义TIM0_CH0_OldDiff静态变量 . */
    static uint32 TIM0_CH0_NewDiff = 0; /* 定义TIM0_CH0_NewDiff静态变量 . */

    IfxGtm_Tim_Ch_clearNewValueEvent(&MODULE_GTM.TIM[0].CH0);  
    /* 清除中断通知状态位,为下一次再次进入中断清除. */

    TIM0_CH0_GPR0_Value = MODULE_GTM.TIM[0].CH0.GPR0.U;        
    /* 获得TIM0 channel0 GRP0寄存器值想,可参考4.1.1章节,此寄存器包含24bit的GPR0和8bit的ECNT. */

    /* tooth starts with falling edge. */
    if ((TIM0_CH0_GPR0_Value & 0x01000000) == 0)   /* 检测到下降沿,即检测bit24(ECNT的bit0) */
    {
        TIM0_CH0_OldTs = TIM0_CH0_NewTs;  /* 当前值更新到上一次变量里 */

        TIM0_CH0_NewTs = TIM0_CH0_GPR0_Value & 0x00FFFFFF; 
        /* 取出GPR0的低24bit存入TIM0_CH0_NewTs */

        TIM0_CH0_OldDiff = TIM0_CH0_NewDiff; /* 当前差值更新到上一次差值变量里 */

        /*calculate new difference between new time stamp and old time stamp */
        if((TIM0_CH0_NewTs > TIM0_CH0_OldTs) && TIM0_CH0_OldTs) 
        /* 状态1:GPR0的值在正常增加 */

        {
            TIM0_CH0_NewDiff = TIM0_CH0_NewTs - TIM0_CH0_OldTs; /* 计算当前的差值 */
        }
        else if(TIM0_CH0_NewTs < TIM0_CH0_OldTs)                
        /* 状态:GPR0向上计数溢出. */
        {
            /* 计算当前的差值 */
            TIM0_CH0_NewDiff = TIM0_CH0_NewTs + (0x00FFFFFF - TIM0_CH0_OldTs);
        }

        /* 缺齿时间是正常齿2.5~3.5倍之间 */
        if(((10*TIM0_CH0_OldDiff)>(25*TIM0_CH0_NewDiff)) && ((10*TIM0_CH0_OldDiff)<(35*TIM0_CH0_NewDiff)))
        {
            /* 如果没有同步. */
            if(DPLL_CRS_SyncState == DPLL_CRS_noSync)          
            {
                GTM_DPLL_APT_2C.B.APT_2C = (57 + 3);            
                /* TRIGGER信号同步到RAM)2C的指针(缺齿后的第1个正常齿) */

                GTM_DPLL_CTRL_1.B.SGE1 = TRUE;                  
                /* enable SUB_INC1 generator. */

                DPLL_CRS_SyncState = DPLL_CRS_WaitSync;         
                /* waiting for synchronization */
            }
            else if(DPLL_CRS_SyncState == DPLL_CRS_Sync)        
            /* 如果同步. */
            {
                GTM_TBU_CHEN.B.ENDIS_CH1 = 2;                   
                /* enable TBU channel 1 */
                GTM_TIM0_CH0_IRQ_EN.B.NEWVAL_IRQ_EN = FALSE;    
                /* 禁止TIM0 channel 0 NEWVAL interrupt. */
            }
        }
    }
}

5.2、MAP初始化

见AURIX-TC3xx-GTM详解五-MAP(TIM0 Input Mapping Module)博客,同之。

5.3、DPLL处理

5.3.1、DPLL初始化

cs 复制代码
/* DPLL. */
void Init_Dpll(void)
{
    uint16 i;
    uint8  relToothOffset = 0;
    uint8  Cycle = 0;

    static volatile unsigned int *DPLL_RAM2   = (unsigned int *) 0xF012C000;  
    /* 定义DPLL RAM2起始地址 */

    static volatile unsigned int *DPLL_ADT_Tx = (unsigned int *) 0xF012C400;  
    /* 定义DPLL RAM2c起始地址,与RAM2的起始地址0xF012C000之间留点余量即可 */

    /* 确保所有RAM初始化已经完成,即INIT_RAM位为0. */
    while (GTM_DPLL_RAM_INI.B.INIT_RAM)
    {
        /* 等待RAM初始化完成. */
    }

    /* 初始化RAM2所有部分的值为0,RAM2大小为0x4000 . */
    for(i=0;i<GTM_DPLL_RR2_SIZE;i++)
    {
        DPLL_RAM2[i] = 0;
    }

    /* 复制60-2期望的波形到DPLL_ADT_Tx(0xF012C400地址开始RAM2区域) */
    /* 波形为57正常齿+1个缺齿+57个正常齿+1个缺齿,即2圈曲轴转速 */
    for (Cycle = 0; Cycle < 2; Cycle++)
    {
        for(i = relToothOffset; i <(57+relToothOffset);i++)
        {
            DPLL_ADT_Tx[i] =0x10000;                  /* normal tooth. */
        }
        DPLL_ADT_Tx[57+relToothOffset] =0x30000;      /* gap tooth. */
        relToothOffset = 58;
    }

    /* configure DPLL parameter. */
    GTM_DPLL_OSW.B.OSS = 0;   /* 配置RAM2储存值数量为128,以上存储值数量是116个,足够. */
    GTM_DPLL_MPVAL1.U  = 0;   /* not used in this case. */

    GTM_DPLL_TOV.U     = 2.5*1024;                    
    /* 缺齿时间超过正常齿的2.5倍就会触发丢失TRIGGER信号中断 */

    GTM_DPLL_PVT.B.PVT = 0.5*1024;                   
     /* Plausibility value of next active TRIGGER slope. equal to  0.5 times normal tooth*/

    GTM_DPLL_TLR.U     = 4;                           
    /* max time between 2 active slopes. equal to  4 times normal tooth*/

    GTM_DPLL_THMI.U    = 0;                           
    /* Minimal time between active and inactive TRIGGER slope. */

    GTM_DPLL_THMA.U    = 0xFFFF;                      
    /* Maximal time between active and inactive TRIGGER slope. */

    GTM_DPLL_IRQ_MODE.B.IRQ_MODE = IfxGtm_IrqMode_pulseNotify;   
    /* pulse-notify mode. */

    /* Get of lock interrupt for SUB_INC1 request. */
    IfxSrc_init(&MODULE_SRC.GTM_DPLL[13],IfxSrc_Tos_cpu0,IFX_INTPRIO_GTM_DPLL_GL1);
    IfxSrc_enable(&MODULE_SRC.GTM_DPLL[13]);
    GTM_DPLL_IRQ_EN.B.GL1I_IRQ_EN = TRUE;

    /* Loss of lock interrupt for SUB_INC1 request. */
    IfxSrc_init(&MODULE_SRC.GTM_DPLL[14],IfxSrc_Tos_cpu0,IFX_INTPRIO_GTM_DPLL_LL1);
    IfxSrc_enable(&MODULE_SRC.GTM_DPLL[14]);
    GTM_DPLL_IRQ_EN.B.LL1I_IRQ_EN = TRUE;

    /* set DPLL Control Register 0. */
    Ifx_GTM_DPLL_CTRL_0 DPLL_CTRL0;
    DPLL_CTRL0.U = 0x00000000;                        /* Initial value is 0. */
    DPLL_CTRL0.B.MLT = (MultiFreq-1)&0x000003FF;      /* Multiplier for TRIGGER is 600 times, */
    DPLL_CTRL0.B.TNU = (Tooth60_2-1)&0x000000FF;      /* TRIGGER number is 60 normal tooth. */
    DPLL_CTRL0.B.TEN = TRUE;                          /* TRIGGER signal is enabled. */
    GTM_DPLL_CTRL_0.U = DPLL_CTRL0.U;                 /* write to register. */

    /* set DPLL Control Register 1. */
    Ifx_GTM_DPLL_CTRL_1 DPLL_CTRL1;
    DPLL_CTRL1.U = 0x00000000;                        /* Initial value is 0. */
    DPLL_CTRL1.B.PIT = TRUE;                          /* The plausibility value is time related.将PVT值乘以最后一次增量DT_T_ACT的持续时间,然后除以1024. */
    DPLL_CTRL1.B.SYN_NT = 2;                          /* gap tooth number. */
    DPLL_CTRL1.B.TSL = 2;                             /* falling edge as trigger signal*/
    GTM_DPLL_CTRL_1.U = DPLL_CTRL1.U;                 /* write to register. */

    /* enable DPLL module. */
    GTM_DPLL_CTRL_1.B.DEN = TRUE;
}
相关推荐
hazy1k5 小时前
51单片机基础-RS485通信
stm32·单片机·嵌入式硬件·51单片机
三佛科技-134163842126 小时前
脱毛仪方案开发,家用激光毛仪/电动脱毛仪MCU方案设计
单片机·嵌入式硬件
阿川!6 小时前
嵌入式软件--STM32 SPI通信(上)
stm32·单片机·嵌入式硬件
芯岭6 小时前
内含32位MCU的无线收发芯片XL2422
单片机·嵌入式硬件·信息与通信·射频工程
宫瑾7 小时前
STM32USB学习
stm32·嵌入式硬件·学习
1379号监听员_8 小时前
嵌入式软件架构--按键消息队列3(测试)
开发语言·stm32·单片机·嵌入式硬件·架构
迎風吹頭髮8 小时前
Linux服务器编程实践57-功能强大的网络信息函数getaddrinfo:支持IPv4与IPv6
单片机·嵌入式硬件
GilgameshJSS10 小时前
STM32H743-ARM例程26-TCP_CLIENT
c语言·arm开发·stm32·单片机·tcp/ip
清风66666610 小时前
基于单片机的开尔文电路电阻测量WIFI上传设计
单片机·嵌入式硬件·毕业设计·课程设计