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;
}
相关推荐
清风66666610 小时前
基于单片机与DAC0832的双路波形信号发生系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
azwsm11 小时前
电路元器件和GPIO控制器
单片机·嵌入式硬件
kebidaixu15 小时前
FreeRTOS 移植到 STM32F407VETX 记录(一)
stm32·单片机·嵌入式硬件
CSDN官方博客15 小时前
「谁说嵌入式只是调包和焊板子?」—— 2026嵌入式全栈技术征锋令
嵌入式硬件·物联网·embedding
点灯小铭16 小时前
基于单片机的数码管定时插座设计与定时开关功能实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
云栖梦泽16 小时前
玩转RK3506SDK
linux·嵌入式硬件
数智工坊18 小时前
机器人四大主控板系统分层选型指南:树莓派、ESP32、STM32与Arduino的能力边界与实战定位
stm32·嵌入式硬件·机器人
进击的小头18 小时前
第8篇:IGBT 从零到精通:核心原理、关键参数、选型指南与工业级应用要点
经验分享·嵌入式硬件·学习
点灯小铭18 小时前
基于单片机的多模式智能洗衣机设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
项目題供诗18 小时前
STM32-AD单通道&AD多通道(十九)
stm32·单片机·嵌入式硬件