/******************************************************************************
*
* Freescale Semiconductor Inc.
* (c) Copyright 2008-2016 Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* ALL RIGHTS RESERVED.
*
******************************************************************************/
/**************************************************************************//**
* @addtogroup SCI_group
* @{
******************************************************************************/
/**************************************************************************//**
*
* @file bsp/SCI/lin_isr.c
*
* @author FPT Software
*
* @brief Interrupt service routine used in LIN driver
*
******************************************************************************/
/******************************************************************************
*
* History:
*
* 20101027 v1.0 First version
* 20111005 v1.1 Updated hardware support, multi timers
* 20111121 v1.2 Updated interrupt service routine for 9S12J637
* 20140728 v1.3 Add AUTOBAUD feature
*
*****************************************************************************/
#include "lin_hw_cfg.h"
#include "lin_lld_timesrv.h"
#include "lin_lld_sci.h"
#if AUTOBAUD == 1 /* AUTOBAUD feature applicible for S12Z MCU family*/
#include "lin_lld_autobaud.h"
extern l_u16 lin_max_frame_res_timeout_val_autobaud[8];
volatile l_bool stop_flag = 0;
l_u16 dTbit[5] = {0};
#endif /* End (1==AUTOBAUD) */
#if defined(_MC9S12I32_H)
#include "analog_die_reg.h"
volatile unsigned char sci_isr_flag = 0;
volatile unsigned char j = 0;
volatile unsigned char i=0;
volatile unsigned char ivr = 0;
volatile unsigned char scis = 0;
volatile unsigned char isrhi =0;
volatile unsigned char isrlo = 0;
#pragma CODE_SEG NON_BANKED
interrupt void D2D_ISR(void)
{
ivr = IVR;
isrhi = ISRhi;
isrlo = ISRlo;
scis = SCIS1;
if(isrhi&0x01)
{
sci_isr_flag = 1;
scis = SCIS1;
lin_lld_sci_rx_isr();
/* remove interrupt flag */
SCIS1 = scis;
}
else if(isrlo&0x40)
{
lin_lld_sci_err_isr();
}
else if (isrlo&0x10)
{
lin_lld_sci_timeout();
/* Write 1 to TFLG1 C3F to clear C3F flag*/
TFLG1 |= 0x08;
}
}
#pragma CODE_SEG DEFAULT
#elif defined (_MC9S12I128_H)
#include "mm912j637.h"
#pragma CODE_SEG NON_BANKED
void _D2DERR(void); /* 0xFFF4 D2DI Error Interrupt */
void _D2D(void); /* 0xFFF2 D2DI External Error Interrupt */
#pragma TRAP_PROC
void _dummyISR( void )
{
/* endless loop */
for(;;);
}
#pragma TRAP_PROC
void _D2D(void)
{
volatile l_u8 reg_temp = 0x00;
reg_temp = INT_VECT;
switch (reg_temp)
{
case 0x04:
_TFLG1.Bits.C0F = 1;
break;
case 0x07:
_TFLG1.Bits.C3F = 1;
lin_lld_timer_isr();
break;
case 0x9:
lin_lld_sci_err_isr();
break;
case 0xB:
lin_lld_sci_rx_isr();
break;
default:
break;
}
}
#pragma CODE_SEG DEFAULT
#elif defined (_MM9Z1J638_H)
#include "mm9z1j638.h"
interrupt _D2D(void);
interrupt _D2D(void)
{
volatile l_u8 reg_temp = 0x00;
reg_temp = B_INT_VECT;
switch (reg_temp)
{
case 0x04:
B_TFLG1_C0F = 1;
break;
case 0x07:
B_TFLG1_C3F = 1;
lin_lld_timer_isr();
break;
case 0x9:
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_err_isr();
#else
lin_lld_sci_err_isr(SCI0);
#endif
break;
case 0xB:
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_rx_isr();
#else
lin_lld_sci_rx_isr(SCI0);
#endif
break;
default:
break;
}
}
#pragma CODE_SEG DEFAULT
#else
/**
* @def ISR(ivn, x)
* Call function x with interrupt vector number is ivn
*/
#define ISR(ivn, x) interrupt ivn void x(void)
#if ((SCI_VERSION == SCI_V5) || (SCI_VERSION == SCI_V6))
/* Change vector number define */
#if (NUM_OF_SCI_CHANNEL == 1) && (!defined(_MC9S12GN32_H)) && (!defined(_MC9S12ZVMA_H))
#define VectorNumber_Vsci0 VectorNumber_Vsci
#define SCI0_INT SCI_INT
#endif /* End (NUM_OF_SCI_CHANNEL == 1) && !defined(_MC9S12GN32_H) */
/* End Change vector number define */
#if ((!defined(_MC9S12ZVML128_H)) && (!defined(_MC9S12ZVL32_H))&&(!defined(_MC9S12ZVML31_H)))
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Define a specific segment to store the code */
#endif /*End if ((!defined(_MC9S12ZVML128_H)) && (!defined(_MC9S12ZVL32_H))&&(!defined(_MC9S12ZVML31_H)))*/
#if _SCI0_ == 1
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void ISR(VectorNumber_Vsci0, SCI0_INT)
* @brief interrupt service routine for SCI0 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0 receiver
*
* @see #lin_lld_sci_isr
*//*END*----------------------------------------------------------------------*/
void SCI0_INT(void);
ISR(VectorNumber_Vsci0, SCI0_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_isr();
#else
lin_lld_sci_isr(SCI0);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End (_SCI0_ == 1) */
#if _SCI1_ == 1
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void ISR(VectorNumber_Vsci1, SCI1_INT)
* @brief interrupt service routine for SCI1 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI1 receiver
*
* @see #lin_lld_sci_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci1, SCI1_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_isr();
#else
lin_lld_sci_isr(SCI1);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End (_SCI1_ == 1) */
#if _SCI2_ == 1
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void ISR(VectorNumber_Vsci2, SCI2_INT)
* @brief interrupt service routine for SCI2 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI2 receiver
*
* @see #lin_lld_sci_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci2, SCI2_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_isr();
#else
lin_lld_sci_isr(SCI2);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End (_SCI2_ == 1) */
#if _SCI3_ == 1
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void ISR(VectorNumber_Vsci3, SCI3_INT)
* @brief interrupt service routine for SCI3 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI3 receiver
*
* @see #lin_lld_sci_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci3, SCI3_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_isr();
#else
lin_lld_sci_isr(SCI3);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End (_SCI3_ == 1)*/
#if _SCI4_ == 1
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void ISR(VectorNumber_Vsci4, SCI4_INT)
* @brief interrupt service routine for SCI4 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI4 receiver
*
* @see #lin_lld_sci_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci4, SCI4_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_isr();
#else
lin_lld_sci_isr(SCI4);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End (_SCI4_ ==1) */
#if _SCI5_ == 1
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void ISR(VectorNumber_Vsci5, SCI5_INT)
* @brief interrupt service routine for SCI5 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI5 receiver
*
* @see #lin_lld_sci_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci5, SCI5_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_isr();
#else
lin_lld_sci_isr(SCI5);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End (_SCI5_ == 1) */
#endif /* End (SCI_VERSION == SCI_V5) */
#if (SCI_VERSION == SCI_V4)
/* Change vectorNumber define */
#if (NUM_OF_SCI_CHANNEL == 1)
#define VectorNumber_Vsci1tx VectorNumber_Vscitx
#define VectorNumber_Vsci1rx VectorNumber_Vscirx
#define VectorNumber_Vsci1err VectorNumber_Vscierr
#endif
/* End Change vectorNumber define */
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Define a specific segment to store the code */
#if _SCI0_ == 1
#if defined(_MC9S08RN60_H)
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI1_TX_INT (void)
* @brief interrupt service routine for SCI0 transmiter
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0 transmiter
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci0tx, SCI0_TX_INT)
{
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI1_RX_INT(void)
* @brief interrupt service routine for SCI0 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0 receiver
*
* @see #lin_lld_sci_rx_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci0rx, SCI0_RX_INT)
{
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_rx_isr();
#else
lin_lld_sci_rx_isr(SCI0);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI1_ERR_INT( void )
* @brief interrupt service routine for SCI0 error
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0 error
*
* @see #lin_lld_sci_rx_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci0err, SCI0_ERR_INT)
{
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_err_isr();
#else
lin_lld_sci_err_isr(SCI0);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#else
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI1_TX_INT (void)
* @brief interrupt service routine for SCI0 transmiter
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0 transmiter
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci1tx, SCI1_TX_INT)
{
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI1_RX_INT(void)
* @brief interrupt service routine for SCI0 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0 receiver
*
* @see #lin_lld_sci_rx_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci1rx, SCI1_RX_INT)
{
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_rx_isr();
#else
lin_lld_sci_rx_isr(SCI0);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI1_ERR_INT( void )
* @brief interrupt service routine for SCI0 error
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0 error
*
* @see #lin_lld_sci_rx_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci1err, SCI1_ERR_INT)
{
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_err_isr();
#else
lin_lld_sci_err_isr(SCI0);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* defined(_MC9S08RN60_H) */
#endif /* End _SCI0_ == 1 */
#if _SCI1_ == 1
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI2_TX_INT (void)
* @brief interrupt service routine for SCI1 transmiter
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI1 transmiter
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci2tx, SCI2_TX_INT)
{
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI2_RX_INT (void)
* @brief interrupt service routine for SCI1 receiver
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI1 receiver
*
* @see #lin_lld_sci_rx_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci2rx, SCI2_RX_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_rx_isr();
#else
lin_lld_sci_rx_isr(SCI1);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI2_ERR_INT (void)
* @brief interrupt service routine for SCI1 error
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI1 error
*
* @see #lin_lld_sci_rx_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci2err, SCI2_ERR_INT)
{
#if LIN_MODE == _SLAVE_MODE_
lin_lld_sci_err_isr();
#else
lin_lld_sci_err_isr(SCI1);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End _SCI1_ == 1 */
#endif /* End (SCI_VERSION == SCI_V4) */
#if (SCI_VERSION == SCI_V2)
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Define a specific segment to store the code */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI_RX_INT (void )
* @brief interrupt service routine for SCI0
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0
*
* @see #lin_lld_xgate_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci1rx, SCI_RX_INT)
{
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_rx_isr();
#else
lin_lld_sci_rx_isr(SCI0);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void SCI_ERR_INT(void)
* @brief interrupt service routine for SCI0
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for SCI0
*
* @see #lin_lld_xgate_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vsci1err, SCI_ERR_INT)
{
#if (LIN_MODE == _SLAVE_MODE_)
lin_lld_sci_err_isr();
#else
lin_lld_sci_err_isr(SCI0);
#endif /* End (LIN_MODE == _SLAVE_MODE_) */
}
#endif /* End (SCI_VERSION == SCI_V2) */
#if (_MCU_ == _S12X_)
#ifdef MULTI_TIMER_MODE
#if (_PIT0_ == 1)
ISR(VectorNumber_Vpit0, PIT0_TIMER_ISR)
{
lin_lld_timer_isr(PIT0_INDEX);
__asm
{
MOVB #$01,PITTF
}
}
#endif /* (_PIT0_ == 1) */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT1_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT1
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT1
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (_PIT1_ == 1)
/****CONGTH****/
ISR(VectorNumber_Vpit1, PIT1_TIMER_ISR)
{
lin_lld_timer_isr(PIT1_INDEX);
__asm
{
MOVB #$02,PITTF
}
}
#endif /* (_PIT1_ == 1) */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT2_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT2
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT2
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (_PIT2_ == 1)
ISR(VectorNumber_Vpit2, PIT2_TIMER_ISR)
{
lin_lld_timer_isr(PIT2_INDEX);
__asm
{
MOVB #$04,PITTF
}
}
#endif /* (_PIT2_ == 1) */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT3_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT3
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT3
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (_PIT3_ == 1)
ISR(VectorNumber_Vpit3, PIT3_TIMER_ISR)
{
lin_lld_timer_isr(PIT3_INDEX);
__asm
{
MOVB #$08,PITTF
}
}
#endif /* (_PIT3_ == 1) */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT4_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT4
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT4
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (_PIT4_ == 1)
/****CONGTH****/
ISR(VectorNumber_Vpit4, PIT4_TIMER_ISR)
{
lin_lld_timer_isr(PIT4_INDEX);
__asm
{
MOVB #$10,PITTF
}
}
#endif /* End (_PIT4_ == 1) */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT5_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT5
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT5
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (_PIT5_ == 1)
/****CONGTH****/
ISR(VectorNumber_Vpit5, PIT5_TIMER_ISR)
{
lin_lld_timer_isr(PIT5_INDEX);
__asm
{
MOVB #$20,PITTF
}
}
#endif /* End (_PIT6_ == 1) */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT6_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT6
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT6
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (_PIT6_ == 1)
/****CONGTH****/
ISR(VectorNumber_Vpit6, PIT6_TIMER_ISR)
{
lin_lld_timer_isr(PIT6_INDEX);
__asm
{
MOVB #$40,PITTF
}
}
#endif /* End (_PIT6_ == 1) */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT7_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT7
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT7
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (_PIT7_ == 1)
/****CONGTH****/
ISR(VectorNumber_Vpit7, PIT7_TIMER_ISR)
{
lin_lld_timer_isr(PIT7_INDEX);
__asm
{
MOVB #$80,PITTF
}
}
#endif /* End (_PIT7_ == 1) */
#else /* Else MULTI_TIMER_MODE */
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void PIT0_TIMER_ISR (void)
* @brief interrupt interrupt service routine for PIT0
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for PIT0
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vpit0, PIT0_TIMER_ISR)
{
lin_lld_timer_isr();
PITTF_PTF0 = 1;
}
#endif /* End MULTI_TIMER_MODE */
#endif /* End (_MCU_ == _S12X_) */
#if (_MCU_ == _S12_)
#if defined(_MC9S12XHY256_H) || defined(_MC9S12HY64_H)
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void TIM0CH7_TIMER_ISR (void)
* @brief interrupt interrupt service routine for TIM0
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for TIM0
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vtim0ch7, TIM0CH7_TIMER_ISR)
{
lin_lld_timer_isr();
/* Reset interrupt request flag */
TIM0_TFLG1 = 128;
}
#endif /* End for 9S12XHY256 and 9S12HY64 */
#if defined(_MC9S12P128_H) || defined(_MC9S12XS128_H) || defined(_MC9S12XS256_H) || defined(_MC9S12G128_H) || defined(_MC9S12G240_H)
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void TIM0_TIMER_ISR (void)
* @brief interrupt interrupt service routine for TIM timer
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for TIM timer
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vtimch7, TIM0_TIMER_ISR)
{
lin_lld_timer_isr();
TFLG1_C7F = 1;
}
#endif /* End for 9S12P128, 9S12XS128, 9S12XS256 and 9S12G128 */
#if (defined(_MC9S12VR64_H)||defined(_MC9S12VR32_H))
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void TIM0_TIMER_ISR (void)
* @brief interrupt interrupt service routine for TIM timer
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for TIM timer
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vtimch0, TIM_TIMER_ISR)
{
lin_lld_timer_isr();
/* Write 1 to TFLG1 C0F bit to clear this C0F flag*/
TFLG1 = TFLG1_C0F_MASK;
TC0 = (TC0 + ((MCU_BUS_FREQ/1000000)*TIME_BASE_PERIOD) ) & 0xFFFF;
}
#endif /* End if (defined(_MC9S12VR64_H)||defined(_MC9S12VR32_H)) */
#if defined(_MC9S12GN32_H) || defined(_MC9S12G64_H)
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void TIM0_TIMER_ISR (void)
* @brief interrupt interrupt service routine for TIM timer
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for TIM timer
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
ISR(VectorNumber_Vtimch0, TIM_TIMER_ISR)
{
lin_lld_timer_isr();
/* Write 1 to TFLG1 C0F bit to clear this C0F flag*/
TFLG1 = TFLG1_C0F_MASK;
TC0 = (TC0 + ((MCU_BUS_FREQ/1000000)*TIME_BASE_PERIOD) ) & 0xFFFF;
}
#endif /* End defined(_MC9S12GN32_H) || defined(_MC9S12G64_H) */
#if ( defined(_MC9S12ZVL32_H) || defined(_MC9S12ZVL128_H) || \
defined(_MC9S12ZVMA_H) || defined(_MC9S12ZVMB_H))
#if (_SCI0_)
void LinPhy_ISR(void);
ISR(VectorNumber_Vlinphy0, LinPhy_ISR)
{
if(LP0IF_LPOCIF == 1)
{
LP0IF_LPOCIF = 1;
}
}
#endif /* END SCI0 */
#endif /* END ifdef _MC9S12ZVL32_H */
#if (defined(_MC9S12ZVML128_H) || defined(_MC9S12ZVL32_H)||defined(_MC9S12ZVHY64_H)||defined(_MC9S12ZVH128_H)\
||defined(_MC9S12ZVML31_H)||defined(_MC9S12ZVMC256_H)||defined(_MC9S12ZVL128_H) ||defined(_MC9S12ZVMB_H))
void TIMchan2_ISR(void);
ISR(VectorNumber_Vtim0ch2, TIMchan2_ISR)
{
lin_lld_timer_isr();
/* Write 1 to TFLG1 C2F bit to clear this C2F flag*/
TIM0TFLG1 = TIM0TFLG1_C2F_MASK;
TIM0TC2 = (TIM0TC2 + ((MCU_BUS_FREQ/1000000)*TIME_BASE_PERIOD) ) & 0xFFFF;
}
#endif /* End if (defined(_MC9S12ZVML128_H) || defined(_MC9S12ZVL32_H)||defined(_MC9S12ZVHY64_H)||defined(_MC9S12ZVH128_H)||defined(_MC9S12ZVML31_H)) */
#if (defined(_MC9S12ZVC64_H))
ISR(VectorNumber_Vtim1ch2, TIMchan2_ISR)
{
lin_lld_timer_isr();
/* Write 1 to TFLG1 C2F bit to clear this C2F flag*/
TIM0TFLG1 = TIM0TFLG1_C2F_MASK;
TIM1TC2 = (TIM1TC2 + ((MCU_BUS_FREQ/500000)*TIME_BASE_PERIOD) ) & 0xFFFF;
}
#endif
#if (defined(_MC9S12ZVMA_H)||defined(_MC9S12VRP64_H)||defined(_MC9S12VRP48_H))
void TIM1chan0_ISR(void);
ISR(VectorNumber_Vtim1ch0, TIM1chan0_ISR)
{
lin_lld_timer_isr();
/* Write 1 to TFLG1 C0F bit to clear this C0F flag*/
TIM1TFLG1 = TIM1TFLG1_C0F_MASK;
TIM1TC0 = (TIM1TC0 + ((MCU_BUS_FREQ/1000000)*TIME_BASE_PERIOD) ) & 0xFFFF;
}
#endif /* End if (defined(_MC9S12ZVMA_H))||defined(_MC9S12VRP64_H)||defined(_MC9S12VRP48_H)) */
#if (AUTOBAUD == 1)
void TIM_Input_capture_ISR(void);
void AutobaudTimerValEval(void)
{
l_u8 i;
/* Clear interrupt flag */
CLEAR_TIMER_CHANNEL_INTERRUPT_FLAG;
if ((0 == stop_flag) && (autobaud_tmr_capture_index < 5))
{
autobaud_tmr_capture[autobaud_tmr_capture_index]=TIMER_CNT_REG;
/* Calculate 2xTbit time for the second and later capture */
if (autobaud_tmr_capture_index > 0)
{
i = autobaud_tmr_capture_index - 1;
dTbit[i] = autobaud_tmr_capture[i+1] - autobaud_tmr_capture[i];
/* Check if 2xTbit time satisfy valid conditions:
* 1. The following 2xTbit must be +/-14% of the 2xTbit right before it
* 2. And it is in the acceptable ranges of master baud rate of 19200 bps or 9600 bps
*/
if ((dTbit[i] < DBIT_DURATION_MIN_19200) ||
((dTbit[i] > DBIT_DURATION_MAX_19200) && (dTbit[i] < DBIT_DURATION_MIN_9600)) ||
(dTbit[i] > DBIT_DURATION_MAX_9600))
{
stop_flag = 1;
/* do not capture */
TIMER_CONTROL_EDG = 0;
TIMER_INT_ENA = 0;
lin_goto_idle_state();
return;
}else
{
if (i > 0)
{
if ((dTbit[i] < ((100 - BIT_RATE_TOLERANCE_UNSYNC) * (dTbit[i-1] / 100))) || (dTbit[i] > ((100 + BIT_RATE_TOLERANCE_UNSYNC) * (dTbit[i-1] / 100))))
{
stop_flag = 2;
/* do not capture */
TIMER_CONTROL_EDG = 0;
TIMER_INT_ENA = 0;
lin_goto_idle_state();
return;
}
}
}
}
autobaud_tmr_capture_index ++;
}
/* Adjust the baud rate if there is no error in SYNC BYTE */
if ((autobaud_tmr_capture_index > 4) && (stop_flag == 0))
{
if (dTbit[i] >= DBIT_DURATION_MIN_9600)
{
autobaud_current = 9600;
}else
{
autobaud_current = 19200;
}
lin_lld_sci_init_autobaud(autobaud_current);
/* Disable interrupt from timer channel */
TIMER_CONTROL_EDG = 0;
TIMER_INT_ENA = 0;
}
return;
}
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void TIM_Input_capture_ISR (void)
* @brief timer interrupt service routine for AUTOBAUD feature
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt interrupt service routine for TIM timer
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if (defined(_MC9S12ZVML128_H)||defined(_MC9S12ZVML31_H) ||defined(_MC9S12ZVL32_H)\
||defined(_MC9S12ZVL128_H)||defined(_MC9S12ZVMC256_H) || defined(_MC9S12ZVMB_H))
ISR(VectorNumber_Vtim0ch3, TIM_Input_capture_ISR)
{
AutobaudTimerValEval();
}
#endif
/* End if (defined(_MC9S12ZVML128_H)||defined(_MC9S12ZVML31_H)||defined(_MC9S12ZVL32_H) */
/* ||defined(_MC9S12ZVL128_H)||defined(_MC9S12ZVMC256_H) || defined(_MC9S12ZVMB_H)) */
#if (defined(_MC9S12ZVH128_H))
ISR(VectorNumber_Vtim1ch0, TIM_Input_capture_ISR)
{
AutobaudTimerValEval();
}
#endif /* End (defined(_MC9S12ZVH128_H)*/
#if (defined(_MC9S12VR64_H)||defined(_MC9S12VR32_H))
ISR(VectorNumber_Vtimch3, TIM_Input_capture_ISR)
{
AutobaudTimerValEval();
}
#endif /* End if (defined(_MC9S12VR64_H)||defined(_MC9S12VR32_H))*/
#if (defined(_MC9S12ZVMA_H)||defined(_MC9S12VRP64_H)||defined(_MC9S12VRP48_H))
ISR(VectorNumber_Vtim1ch1, TIM_Input_capture_ISR)
{
AutobaudTimerValEval();
}
#endif /* End if (defined(_MC9S12ZVMA_H))*/
#endif /* End (AUTOBAUD == 1)*/
#endif /* End (_MCU_ == _S12_) */
#if (_MCU_ == _S08_)
/*FUNCTION*--------------------------------------------------------------*//**
* @fn void TPM1_TIMER_ISR(void)
* @brief interrupt service routine for TPM1/ FTM timer
*
* @return #void
*
* @SDD_ID N/A
* @endif
*
* @details
* interrupt service routine for TPM1/ FTM timer
*
* @see #lin_lld_timer_isr
*//*END*----------------------------------------------------------------------*/
#if defined(_MC9S08RN60_H)
ISR(VectorNumber_Vmtim0, TPM1_TIMER_ISR)
{
/* CH0F = 0 */
MTIM0_SC &= ~MTIM0_SC_TOF_MASK;
lin_lld_timer_isr();
}
#else
ISR(VectorNumber_Vtpm1ch0, TPM1_TIMER_ISR)
{
/* CH0F = 0 */
TPM1C0SC &= ~TPM1C0SC_CH0F_MASK;
lin_lld_timer_isr();
}
#endif /* End defined(_MC9S08RN60_H)*/
#endif /* End (_MCU_ == _S08_) */
#if ((!defined(_MC9S12ZVML128_H))&&(!defined(_MC9S12ZVML31_H)))
#pragma CODE_SEG DEFAULT /* Return to default code segment */
#endif /* End if ((!defined(_MC9S12ZVML128_H))&&(!defined(_MC9S12ZVML31_H))) */
#endif /* End defined(_MC9S12I32_H) */
/**
* @}
*/