MotorControlModuleSDFM_TMS3.../Projects/epwm_test/Freemaster/PE_freemaster_fastrec.h
2023-08-23 16:31:55 +03:00

263 lines
6.5 KiB
C

/******************************************************************************
*
* Freescale Semiconductor Inc.
* (c) Copyright 2004-2006 Freescale Semiconductor, Inc.
* (c) Copyright 2001-2004 Motorola, Inc.
* ALL RIGHTS RESERVED.
*
****************************************************************************//*!
*
* @file PE_freemaster_fastrec.h
*
* @brief FreeMASTER Fast Recorder implementation for 56F8xxx.
*
* @version 1.0.3.0
*
* @date Feb-6-2007
*
*******************************************************************************/
#ifndef __FREEMASTER_FASTREC_H
#define __FREEMASTER_FASTREC_H
#include "PE_freemaster.h"
#include "PE_freemaster_private.h"
#include "PE_freemaster_rec.h"
#if FMSTR_USE_RECORDER
#if FMSTR_USE_FASTREC
/*************************************
Fast recorder global variables
*************************************/
extern FMSTR_ADDR pcm_dwFastRecWritePtr;
extern FMSTR_ADDR pcm_dwFastRecStartBuffPtr;
extern FMSTR_ADDR pcm_dwFastRecEndBuffPtr;
/*************************************
Fast recorder internal API
*************************************/
void FMSTR_InitFastRec(void);
FMSTR_BOOL FMSTR_SetUpFastRec(void);
void FMSTR_StartFastRec(void);
void FMSTR_TriggerFastRec(void);
void FMSTR_GetFastRecBuff(void);
/*************************************
Inline sampling function
*************************************/
#define FMSTR_FASTREC_BEGIN(do_fdiv) \
{ \
register FMSTR_U16 flags; \
register FMSTR_U16 tmp; \
register FMSTR_U16* pdest; \
register FMSTR_U16* ptemp; \
\
if(do_fdiv) \
{ \
/* skip this call ? */ \
if(pcm_wRecTimeDivCtr) \
{ \
/* maybe next time... */ \
pcm_wRecTimeDivCtr--; \
asm { bra skip_all; } \
} \
\
/* re-initialize divider */ \
pcm_wRecTimeDivCtr = pcm_wRecTimeDiv; \
} \
\
asm \
{ \
move.w pcm_wRecFlags.all, flags; \
brclr FMSTR_REC_FLAG_bIsRunning, flags, skip_all; \
move.l pcm_dwFastRecWritePtr, pdest; \
}
#define FMSTR_FASTREC_BEGINTRIG() \
asm \
{ \
/* triger is disabled during virgin cycle */ \
brset FMSTR_REC_FLAG_bInvirginCycle, flags, trig_end; \
\
/* already in stopping mode? (trigger happened in the past) */ \
brclr FMSTR_REC_FLAG_bIsStopping, flags, trig_test; \
\
/* yes, decrement counter and test if underflown */ \
dec.w pcm_wStoprecCountDown; \
\
/* if zero not yet reached, nothing more to do */ \
/* NOTE: initial down-counter value is never zero */ \
bne trig_end; \
\
/* do stop now */ \
bfclr FMSTR_REC_FLAG_bIsRunning, flags; \
bra trig_end; \
}
#define FMSTR_FASTREC_IMPLTRIG_FULL(cond) \
asm { trig_test: } \
\
if(cond) \
{ \
asm \
{ \
/* tigger armed? */ \
brclr FMSTR_REC_FLAG_bTrgCrossActive, flags, trig_end; \
\
/* pull the trigger now */ \
move.w pcm_wRecPostTrigger, tmp; \
move.w tmp, pcm_wStoprecCountDown; \
bfset FMSTR_REC_FLAG_bIsStopping, flags; \
} \
} \
else \
{ \
/* trigger is now armed */ \
asm { bfset FMSTR_REC_FLAG_bTrgCrossActive, flags } \
}
#define FMSTR_FASTREC_IMPLTRIG_SIMPLE(cond) \
asm { trig_test: } \
\
if(cond) \
{ \
asm \
{ \
/* pull the trigger now */ \
move.w pcm_wRecPostTrigger, tmp; \
move.w tmp, pcm_wStoprecCountDown; \
bfset FMSTR_REC_FLAG_bIsStopping, flags; \
} \
}
#define FMSTR_FASTREC_IMPLTRIG_IMMEDIATE(cond) \
asm { trig_test: } \
\
if(cond) \
{ \
asm \
{ \
/* hard-stop now (no pretrigger will be there) */ \
bfset FMSTR_REC_FLAG_bIsStopping, flags; \
} \
}
#define FMSTR_FASTREC_ENDTRIG() \
asm { trig_end: }
#define FMSTR_FASTREC_TRIGGER_FULL(cond) \
FMSTR_FASTREC_BEGINTRIG() \
FMSTR_FASTREC_IMPLTRIG_FULL(cond) \
FMSTR_FASTREC_ENDTRIG()
#define FMSTR_FASTREC_TRIGGER_SIMPLE(cond) \
FMSTR_FASTREC_BEGINTRIG() \
FMSTR_FASTREC_IMPLTRIG_SIMPLE(cond) \
FMSTR_FASTREC_ENDTRIG()
#define FMSTR_FASTREC_TRIGGER_IMMEDIATE(cond) \
FMSTR_FASTREC_BEGINTRIG() \
FMSTR_FASTREC_IMPLTRIG_IMMEDIATE(cond) \
FMSTR_FASTREC_ENDTRIG()
#define FMSTR_FASTREC_TRIGGER_VOID() \
FMSTR_FASTREC_BEGINTRIG() \
asm { trig_test: } \
FMSTR_FASTREC_ENDTRIG()
#define FMSTR_FASTREC_STDVARS() \
{ \
register FMSTR_U16* padrs; \
\
asm \
{ \
move.l #>pcm_pRecVarAddr, padrs; \
move.w pcm_nRecVarCount, tmp; \
\
do tmp, copy_loop_end; \
move.l X:(padrs)+, ptemp; \
move.w X:(ptemp), tmp; \
move.w tmp, X:(pdest)+; \
\
copy_loop_end: \
} \
}
#define FMSTR_FASTREC_VAR16(var16) \
asm \
{ \
move.w var16, tmp; \
move.w tmp, X:(pdest)+; \
}
#define FMSTR_FASTREC_END() \
asm \
{ \
/* compare pdest with a wrap location */ \
move.l pcm_dwFastRecEndBuffPtr, ptemp; \
cmpa pdest, ptemp; \
bgt no_wrap; \
\
/* do wrap, reset write pointer to buffer start */ \
move.l pcm_dwFastRecStartBuffPtr, pdest; \
\
/* remember virgin cycle is over (trigger now enabled) */ \
bfclr FMSTR_REC_FLAG_bInvirginCycle, flags; \
\
no_wrap: \
/* save write pointer back to memory */ \
move.l pdest, pcm_dwFastRecWritePtr; \
\
/* save flags back to memory */ \
move.w flags, pcm_wRecFlags.all; \
\
skip_all: \
} \
}
inline FMSTR_FastRecorder(register FMSTR_BOOL bTriggerNow)
{
FMSTR_FASTREC_BEGIN(1)
FMSTR_FASTREC_STDVARS()
FMSTR_FASTREC_TRIGGER_FULL(bTriggerNow)
FMSTR_FASTREC_END()
}
/* normal recorder call emulated using fast recorder routine */
inline void FMSTR_Recorder(void)
{
FMSTR_FastRecorder(0);
}
#else /* FMSTR_USE_FASTREC */
/* fast recorder is de-activated, emulate using normal recorder */
inline void FMSTR_FastRecorder(FMSTR_BOOL bTriggerNow)
{
if(bTriggerNow)
FMSTR_TriggerRec();
FMSTR_Recorder();
}
#endif /* FMSTR_USE_FASTREC */
#else /* FMSTR_USE_RECORDER */
/* recorder is not implemented, use empty fast-recorder call */
inline void FMSTR_FastRecorder(FMSTR_BOOL bTriggerNow)
{
}
#endif /* FMSTR_USE_RECORDER */
#endif /* __FREEMASTER_FASTREC_H */