⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dga001timer.c

📁 IXP425的BSP代码
💻 C
📖 第 1 页 / 共 2 页
字号:
* sysAuxClkEnable - turn on auxiliary clock interrupts** This routine enables auxiliary clock interrupts.** RETURNS: N/A** SEE ALSO: sysAuxClkConnect(), sysAuxClkDisable(), sysAuxClkRateSet()*/ void sysAuxClkEnable (void)    {    if (!sysAuxClkRunning)	{	*DGA_CSR14  = (UINT32) NULL;		/* stop timer */	*DGA_CSR15  = (UINT32) NULL;		/* clear count */	*DGA_CSR23  = (UINT32) CSR23_TT1ICL;	/* clear interrupt */	*DGA_CSR21 |= (UINT32) CSR21_TT1IEN;	/* enable interrupt */	/* load compare register with the number of micro seconds and 	 * start the counter.	 */	*DGA_CSR14 = (UINT32)((DGA_TICK_FREQ / auxClkTicksPerSecond - 1) | 				CSR14_TT1CEN);	sysAuxClkRunning = TRUE;	}    }/********************************************************************************* sysAuxClkRateGet - get the auxiliary clock rate** This routine returns the interrupt rate of the auxiliary clock.** RETURNS: The number of ticks per second of the auxiliary clock.** SEE ALSO: sysAuxClkEnable(), sysAuxClkRateSet()*/ int sysAuxClkRateGet (void)    {    return (auxClkTicksPerSecond);    }/********************************************************************************* sysAuxClkRateSet - set the auxiliary clock rate** This routine sets the interrupt rate of the auxiliary clock.* It does not enable auxiliary clock interrupts.** RETURNS: OK, or ERROR if the tick rate is invalid or the timer cannot be set.** SEE ALSO: sysAuxClkEnable(), sysAuxClkRateGet()*/ STATUS sysAuxClkRateSet    (    int ticksPerSecond     /* number of clock interrupts per second */    )    {    if (ticksPerSecond < AUX_CLK_RATE_MIN || ticksPerSecond > AUX_CLK_RATE_MAX)	return (ERROR);     auxClkTicksPerSecond = ticksPerSecond;     if (sysAuxClkRunning)	{	sysAuxClkDisable ();	sysAuxClkEnable ();	}    return (OK);    } #endif	/* AUXCLK_USE_DGA001_TT1 */#if defined(INCLUDE_TIMESTAMP) && defined(TSTAMP_USE_DGA001_TT1)/********************************************************************************* sysTimestampInt - timestamp timer interrupt handler** This rountine handles the timestamp timer interrupt.  A user routine is* called, if one was connected by sysTimestampConnect().** RETURNS: N/A   ** SEE ALSO: sysTimestampConnect()*/LOCAL void sysTimestampInt (void)    {    if (*DGA_CSR20 & CSR20_TT1IRQ)	{	*DGA_CSR23 = (UINT32)CSR23_TT1ICL;		/* clear interrupt */	if (sysTimestampRoutine != NULL)	    (*sysTimestampRoutine) (sysTimestampArg);	/* call user routine */	}    }/********************************************************************************* sysTimestampConnect - connect a user routine to the timestamp timer interrupt** This routine specifies the user interrupt routine to be called at each* timestamp timer interrupt.  It does not enable the timestamp timer itself.** RETURNS: OK, or ERROR if sysTimestampInt() interrupt handler is not used.*/ STATUS sysTimestampConnect    (    FUNCPTR routine,	/* routine called at each timestamp timer interrupt */    int arg		/* argument with which to call routine */    )    {    sysTimestampRoutine = routine;    sysTimestampArg     = arg;     return (OK);    }/********************************************************************************* sysTimestampEnable - initialize and enable the timestamp timer** This routine connects the timestamp timer interrupt and initializes the* counter registers.  If the timestamp timer is already running, this routine* merely resets the timer counter.** The rate of the timestamp timer should be set explicitly within the BSP,* in the sysHwInit() routine.  This routine does not intialize the timer* rate.  ** RETURNS: OK, or ERROR if the timestamp timer cannot be enabled.*/ STATUS sysTimestampEnable (void)    {    if (sysTimestampRunning)	{	*DGA_CSR14 &= (UINT32) ~CSR14_TT1CEN;	/* stop timer */	*DGA_CSR15  = (UINT32) NULL; 		/* clear count */	*DGA_CSR14 |= (UINT32) CSR14_TT1CEN;	/* start timer */	return (OK);	}        *DGA_CSR14  = (UINT32) NULL;		/* stop timer */    *DGA_CSR15  = (UINT32) NULL;		/* clear count */    *DGA_CSR23  = (UINT32) CSR23_TT1ICL;	/* clear interrupt */    if (intConnect (INT_VEC_TT1, sysTimestampInt, NULL) != OK)	return (ERROR);    *DGA_CSR25 = (UINT32)((*DGA_CSR25 & 0xff0fffff)	       | (((TIMESTAMP_LEVEL >> 1) & 0x7) << 20));						/* set interrupt level */    *DGA_CSR21 |= (UINT32) CSR21_TT1IEN;	/* enable interrupt */    /* load compare register with the number of micro seconds and     * start the counter.     */    *DGA_CSR14 = (UINT32)(sysTimestampPeriod() | CSR14_TT1CEN);    sysTimestampRunning = TRUE;    return (OK);    }/********************************************************************************* sysTimestampDisable - disable the timestamp timer** This routine disables the timestamp timer.  Interrupts are not disabled,* although the tick counter will not increment after the timestamp timer* is disabled, thus interrupts will no longer be generated.** RETURNS: OK, or ERROR if the timestamp timer cannot be disabled.*/ STATUS sysTimestampDisable (void)    {    if (sysTimestampRunning)	{	*DGA_CSR21 &= (UINT32) ~CSR21_TT1IEN;	/* disable interrupt */	*DGA_CSR14 &= (UINT32) ~CSR14_TT1CEN;	/* stop timer */	*DGA_CSR23 = (UINT32) CSR23_TT1ICL;	/* clear pending interrupt */	sysTimestampRunning = FALSE;	}    return (OK);    }/********************************************************************************* sysTimestampPeriod - get the timestamp timer period** This routine returns the period of the timestamp timer in ticks.* The period, or terminal count, is the number of ticks to which the timestamp* timer will count before rolling over and restarting the counting process.** RETURNS: The period of the timestamp timer in counter ticks.*/ UINT32 sysTimestampPeriod (void)    {    return ((UINT32)0x00ffffff);	/* highest period -> freerunning */    }/********************************************************************************* sysTimestampFreq - get the timestamp timer clock frequency** This routine returns the frequency of the timer clock, in ticks per second.* The rate of the timestamp timer should be set explicitly within the BSP,* in the sysHwInit() routine.** RETURNS: The timestamp timer clock frequency, in ticks per second.*/ UINT32 sysTimestampFreq (void)    {    return ((UINT32)DGA_TICK_FREQ);    }/********************************************************************************* sysTimestamp - get the timestamp timer tick count** This routine returns the current value of the timestamp timer tick counter.* The tick count can be converted to seconds by dividing by the return of* sysTimestampFreq().** This routine should be called with interrupts locked.  If interrupts are* not already locked, sysTimestampLock() should be used instead.** NOTE DGA-001:* The following code workarounds the DGA-001 up-counter glitch as shown below:** .CS*     1111                                .*     1110                                :.*     1101                                ::*     1100                                ::.*     1011                             -->: :<-- (few nano seconds)*     1010                                : :*     1001                                : :            _______________*     1000                                : :____________*     0111                 _______________:*     0110  _______________**          0              +1             +2             +3 [micro sec]* .CE** RETURNS: The current timestamp timer tick count.** SEE ALSO: sysTimestampLock()*/ UINT32 sysTimestamp (void)    {    UINT32 cnt1 = *DGA_CSR15 & 0x00ffffff;    UINT32 cnt2 = *DGA_CSR15 & 0x00ffffff;    if (cnt1 <= cnt2) return (cnt1);    return (cnt2);    }/********************************************************************************* sysTimestampLock - get the timestamp timer tick count** This routine returns the current value of the timestamp timer tick counter.* The tick count can be converted to seconds by dividing by the return of* sysTimestampFreq().** This routine locks interrupts for cases where it is necessary to stop the* tick counter in order to read it, or when two independent counters must* be read.  If interrupts are already locked, sysTimestamp() should be* used instead.** RETURNS: The current timestamp timer tick count.** SEE ALSO: sysTimestamp()*/ UINT32 sysTimestampLock (void)    {    int lockKey = intLock ();    UINT32 cnt1 = *DGA_CSR15 & 0x00ffffff;    UINT32 cnt2 = *DGA_CSR15 & 0x00ffffff;    intUnlock (lockKey);    if (cnt1 <= cnt2) return (cnt1);    return (cnt2);    }#endif	/* INCLUDE_TIMESTAMP */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -