/================================================================== // // Filename: mapp_avm.c // Description: dvd driver // //------------------------------------------------------------------ // // version: // date: 16:08pm, 12.Apr.2018, by dwd // Description: // //------------------------------------------------------------------ //================================================================== /*------------------------------------------------------------------------------ * I N C L U D E *------------------------------------------------------------------------------*/ #include "stm32f0xx.h" #include "general.h" #include "main.h" #include "mapp_canid.h" #include "mapp_can.h" /*------------------------------------------------------------------------------ * D E F I N E *------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ * S T R U C T *------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ * S T R U C T *------------------------------------------------------------------------------*/ T_Can_Info gtCaninfo ={0}; /*------------------------------------------------------------------------------ * S T A T I C - V A R I A B L E S *------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ * G L O B A L *------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ * P R O T O T Y P E *------------------------------------------------------------------------------*/ static void s_frmAvmTxNull(U16 prm); static void s_frmAvmTxAck(U16 prm); static void s_frmAvmTxCar(U16 prm); static void s_frmAvmTxTime(U16 prm); static void s_frmAvmTxTpPos(U16 prm); static void s_frmAvmTxTp2Pos(U16 prm); static void s_frmAvmRxAvm(void); static void s_frmAvmRxAvm2(void); static BOOL s_AvmRxCheck(void); void TIM1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /* TIM1 clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); /* GPIOA clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* TIM2 chennel2 configuration : PA.11 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Connect TIM pin to AF2 */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2); /* Enable the TIM1 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseStructure.TIM_Prescaler = 48-1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0xffffffff; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* --------------------------------------------------------------------------- TIM2 configuration: PWM Input mode The external signal is connected to TIM2 CH2 pin (PB.03) TIM2 CCR2 is used to compute the frequency value TIM2 CCR1 is used to compute the duty cycle value In this example TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1), since APB1 prescaler is set to 1. TIM2CLK = PCLK1 = HCLK = SystemCoreClock External Signal Frequency = SystemCoreClock / TIM2_CCR2 in Hz. External Signal DutyCycle = (TIM2_CCR1*100)/(TIM2_CCR2) in %. Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f0xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration based on this variable will be incorrect. --------------------------------------------------------------------------- */ TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; //TIM_Cmd(TIM1,&TIM_ICInitStructure); // TIM_PWMIConfig(TIM1, &TIM_ICInitStructure); TIM_ICInit(TIM1,&TIM_ICInitStructure); /* Select the TIM2 Input Trigger: TI2FP2 */ TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1); /* Select the slave Mode: Reset Mode */ TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable); /* TIM enable counter */ TIM_Cmd(TIM1, ENABLE); /* Enable the CC2 Interrupt Request */ TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE); } void TIM1_OffConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure CAN2 **************************************************/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_4); /* Configure CAN pin: TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//TXRX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); } void CanISRHandler(void) { /* Clear TIM2 Capture compare interrupt pending bit */ // TIM_ClearITPendingBit(TIM1, TIM_IT_CC4); /* Get the Input Capture value */ gtCaninfo.captureValuecui= TIM_GetCapture4(TIM1); if (gtCaninfo.captureValuecui > gtCaninfo.captureValuelast) { gtCaninfo.icvalue = (gtCaninfo.captureValuecui -gtCaninfo.captureValuelast); if (gtCaninfo.cancomprevalue[gtCaninfo.comprecnt] > gtCaninfo.icvalue ) { gtCaninfo.cancomprevalue[gtCaninfo.comprecnt] = gtCaninfo.icvalue ; } gtCaninfo.captureValuelast = gtCaninfo.captureValuecui; } else { gtCaninfo.captureValuelast =0x00; gtCaninfo.comprecnt++; if(gtCaninfo.comprecnt>10) { gtCaninfo.cancheckflag =1; gtCaninfo.comprecnt=15; } } } void M_sort(U08 a[],U08 num) { static U08 m =0; static U08 n =0; U08 i =0; U08 j = 0; U08 temp =0; for(i=0;ia[j+1]) //依次比较两个相邻的数,将小数放在前面,大数放在后面 { temp=a[j]; //temp是局部变量 a[j]=a[j+1]; a[j+1]=temp; } } } U08 CarCanJudgeDel(U08 ca) { if((ca >= 0x0E) && (ca <= 0x11)){//0x0F 0x10 gtCarType.CarType = CARTYPE_HONDA; return 1; } else if((ca >= 0x03) && (ca <= 0x06)){ //0x04 gtCarType.CarType = CARTYPE_AUDI; return 1; } else if((ca >= 0x39) && (ca <= 0x3F)){ //0x3B 0x3C gtCarType.CarType = CARTYPE_BUICK; return 1; } else{ return 0; } } void CanIdAutoTask(void) { IWDG->KR = (U16)0xAAAA; switch (gtCaninfo.canidstate) { case CANID_RESET: MEMSET(>Caninfo, 0, sizeof(T_Can_Info)); MEMSET(>Caninfo.cancomprevalue, 0XFF,10); gtCaninfo.canidstate = CANID_INIT; PullUpPowerCfg(RESET); break; case CANID_INIT: if ( !gtCarType.CarTypeOkFlag ) { TIM1_Config(); GpioTrcv1040StandbyCfg(RESET); GpioTrcv28056StandbyCfg(SET); GpioTrcv28056EnableCfg(SET); gtCaninfo.cancheckflag =0; gtCaninfo.canidstate = CANID_RUN; } else { gtCaninfo.canidstate = CANID_CIROFF; } break; case CANID_RUN: if (gtCaninfo.cancheckflag ) { gtCaninfo.canidstate = CANID_STOP; } break; case CANID_STOP: TIM1_OffConfig(); gtCaninfo.canwaitcount =0; gtCaninfo.canidstate = CANID_WAIT; break; case CANID_WAIT: gtCaninfo.canwaitcount ++; if (gtCaninfo.canwaitcount >0xff00) { gtCaninfo.canidstate = CANID_ACCESS; } break; case CANID_ACCESS: M_sort(gtCaninfo.cancomprevalue,9); gtCaninfo.canidstate = CANID_JUDGE; break; case CANID_JUDGE: if (CarCanJudgeDel( gtCaninfo.cancomprevalue[5])) { gtCaninfo.canidstate = CANID_CIROFF; PullUpPowerCfg(SET); } else { gtCaninfo.canidstate = CANID_RESET; } break; case CANID_CIROFF: break; default: break; } } //============================================================== // End Of File //==============================================================