#include "SpbApi.h" #include "string.h" #include "bl_ic_config.h" MACHINE_t machine; volatile spb_tx_t spb_tx= {0}; volatile spb_rx_dos_t spb_rx_dos= {0}; uint8_t spb_dos_inbuf[256]= {0}; /************************************************** *获取DOS中断超时定时器中断 **************************************************/ void TIM5_IRQHandler(void) { TIM5->STS &=~1; spb_rx_dos.timeout--; if(spb_rx_dos.timeout==0) { SpbApi_StopDosCap(); EXTI->IMASK &=~(machine.dos_mask1|machine.dos_mask2); //关DOS中断 spb_rx_dos.status|=2; //2超时 } } /************************************************** *DOS计数超时定时器中断 **************************************************/ void TIM4_IRQHandler(void) { if(DOS_TIM->STS&0x01) { SpbApi_StopDosCap(); DOS_TIM->STS &=~1; DOS_TIM->CNT=0; EXTI->IMASK &=~(machine.dos_mask1|machine.dos_mask2); //关DOS中断 spb_rx_dos.status|=1; } } void Dip_Set_High(void) { DIP_PORT->POD |=machine.di_mask; } void Dip_Set_Low(void) { DIP_PORT->POD &=~machine.di_mask; } volatile bool cap_flag=0; void SpbApi_ReadyDosCap(uint8_t index) { EXTI->IMASK&=~(machine.dos_mask1|machine.dos_mask2); memset(spb_dos_inbuf,0x00,sizeof(spb_dos_inbuf)); //enable falling edge cap //#if COMMUNICATION_MODE==SERIAL spb_rx_dos.mask =(1<IMASK|= (1<RT_CFG |= (machine.dos_mask1|machine.dos_mask2);//允许上升沿触发 EXTI->FT_CFG |= (machine.dos_mask1|machine.dos_mask2);//运行下降沿触发 // #endif cap_flag=0; spb_rx_dos.dos_len=0; spb_rx_dos.InData=spb_dos_inbuf; spb_rx_dos.timeout=30; spb_rx_dos.status=0; //DOS_TIM->CNT=0; TIM5->CNT=0; TIM5->CTRL1|=1; } void SpbApi_StartDosCap(void) { DOS_TIM->CTRL1|=1; } void SpbApi_StopDosCap(void) { DOS_TIM->CTRL1&=~1; TIM5->CTRL1&=~1; } /************************************************** *获取DOS数据采集 **************************************************/ void SpbApi_DosCapFunction(void) { if(cap_flag) { spb_rx_dos.InData[spb_rx_dos.dos_len++]=DOS_TIM->CNT; //printf("DOSLEN=%d/n",spb_rx_dos.dos_len); } else { //first edge cap_flag=1; DOS_TIM->STS=0; DOS_TIM->CTRL1 |=1;//使能计数器 } DOS_TIM->CNT = 0; //CNT SET 0 } void EXTI0_IRQHandler(void) { if (((EXTI->PEND & EXTI_LINE0) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE0) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE0; SpbApi_DosCapFunction(); } } void EXTI1_IRQHandler(void) { if (((EXTI->PEND & EXTI_LINE1) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE1) != (uint32_t)RESET)) { //当外部中断线上发生选定的边沿触发事件时,该位设置为 1。向该位写入“1”将 //其清零,或改变边沿检测的极性以清零该位。 EXTI->PEND = EXTI_LINE1; SpbApi_DosCapFunction(); } } void EXTI2_IRQHandler(void) { if (((EXTI->PEND & EXTI_LINE2) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE2) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE2; SpbApi_DosCapFunction(); } } void EXTI3_IRQHandler(void) { if (((EXTI->PEND & EXTI_LINE3) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE3) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE3; SpbApi_DosCapFunction(); } } void EXTI4_IRQHandler(void) { if (((EXTI->PEND & EXTI_LINE4) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE4) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE4; SpbApi_DosCapFunction(); } } void EXTI9_5_IRQHandler(void) { if (((EXTI->PEND & EXTI_LINE5) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE5) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE5; SpbApi_DosCapFunction(); } if (((EXTI->PEND & EXTI_LINE6) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE6) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE6; SpbApi_DosCapFunction(); } if (((EXTI->PEND & EXTI_LINE7) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE7) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE7; SpbApi_DosCapFunction(); } if (((EXTI->PEND & EXTI_LINE8) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE8) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE8; SpbApi_DosCapFunction(); } if (((EXTI->PEND & EXTI_LINE9) != (uint32_t)RESET) && ((EXTI->IMASK & EXTI_LINE9) != (uint32_t)RESET)) { EXTI->PEND = EXTI_LINE9; SpbApi_DosCapFunction(); } } static void SpbApi_DipInit(void) { GPIO_InitType GPIO_InitSt; RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA); GPIO_Structure_Initialize(&GPIO_InitSt); GPIO_InitSt.GPIO_Mode=GPIO_MODE_OUT_PP; GPIO_InitSt.GPIO_Slew_Rate=GPIO_SLEW_RATE_FAST; GPIO_InitSt.Pin=DIP1_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP2_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP3_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP4_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP5_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP6_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP7_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP8_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP9_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP10_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP11_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIP12_PIN; GPIO_Peripheral_Initialize(DIP_PORT,&GPIO_InitSt); #if defined HY8608 || HY8108 #if COMMUNICATION_MODE==HALF_DUPLEX GPIO_InitSt.Pin=DI13_PIN; GPIO_Peripheral_Initialize(DI_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DI14_PIN; GPIO_Peripheral_Initialize(DI_PORT,&GPIO_InitSt); #endif #endif #if defined HY8602 Dip_Set_Low(); #else Dip_Set_High(); #endif } #if defined HY8810 || HY8602 || HY8811 || HY8603 || HY8822 || HY8612 void Dis_Set_High(void) { DIS_PORT->POD |=machine.dis_mask; } void Dis_Set_Low(void) { DIS_PORT->POD &=~machine.dis_mask; } static void SpbApi_DisInit(void) { GPIO_InitType GPIO_InitSt; RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOD); GPIO_Structure_Initialize(&GPIO_InitSt); GPIO_InitSt.GPIO_Mode=GPIO_MODE_OUT_PP; GPIO_InitSt.GPIO_Slew_Rate=GPIO_SLEW_RATE_FAST; GPIO_InitSt.Pin=DIS1_PIN; GPIO_Peripheral_Initialize(DIS_PORT,&GPIO_InitSt); GPIO_InitSt.Pin=DIS2_PIN; GPIO_Peripheral_Initialize(DIS_PORT,&GPIO_InitSt); #if defined HY8602 Dis_Set_Low(); #else Dis_Set_High(); #endif } #endif static void SpbApi_DosInit(void) { GPIO_InitType GPIO_InitSt; TIM_TimeBaseInitType TIM_TimeBaseSt; uint16_t PrescalerValue = 0; RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOB); RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOD); RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_AFIO); RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM4); RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_TIM5); GPIO_Structure_Initialize(&GPIO_InitSt); #if COMMUNICATION_MODE==SERIAL GPIO_InitSt.GPIO_Mode=GPIO_MODE_INPUT; GPIO_InitSt.GPIO_Slew_Rate=GPIO_SLEW_RATE_FAST; GPIO_InitSt.GPIO_Pull = GPIO_PULL_UP; GPIO_InitSt.Pin=DOS1_PIN; GPIO_Peripheral_Initialize(DOS1_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS1_EXTI_LINE_SOURCE, AFIO_EXTI_PB0); GPIO_InitSt.Pin=DOS2_PIN; GPIO_Peripheral_Initialize(DOS2_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS2_EXTI_LINE_SOURCE, AFIO_EXTI_PB1); GPIO_InitSt.Pin=DOS3_PIN; GPIO_Peripheral_Initialize(DOS3_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS3_EXTI_LINE_SOURCE, AFIO_EXTI_PB2); GPIO_InitSt.Pin=DOS4_PIN; GPIO_Peripheral_Initialize(DOS4_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS4_EXTI_LINE_SOURCE, AFIO_EXTI_PB3); GPIO_InitSt.Pin=DOS5_PIN; GPIO_Peripheral_Initialize(DOS5_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS5_EXTI_LINE_SOURCE, AFIO_EXTI_PB4); GPIO_InitSt.Pin=DOS6_PIN; GPIO_Peripheral_Initialize(DOS6_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS6_EXTI_LINE_SOURCE, AFIO_EXTI_PB5); GPIO_InitSt.Pin=DOS7_PIN; GPIO_Peripheral_Initialize(DOS7_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS7_EXTI_LINE_SOURCE, AFIO_EXTI_PB6); GPIO_InitSt.Pin=DOS8_PIN; GPIO_Peripheral_Initialize(DOS8_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS8_EXTI_LINE_SOURCE, AFIO_EXTI_PB7); GPIO_InitSt.Pin=DOS9_PIN; GPIO_Peripheral_Initialize(DOS9_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS9_EXTI_LINE_SOURCE, AFIO_EXTI_PB8); GPIO_InitSt.Pin=DOS10_PIN; GPIO_Peripheral_Initialize(DOS10_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS10_EXTI_LINE_SOURCE, AFIO_EXTI_PB9); GPIO_InitSt.Pin=DOS11_PIN; GPIO_Peripheral_Initialize(DOS11_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS11_EXTI_LINE_SOURCE, AFIO_EXTI_PB14); GPIO_InitSt.Pin=DOS12_PIN; GPIO_Peripheral_Initialize(DOS12_PORT,&GPIO_InitSt); GPIO_EXTI_Line_Set(DOS12_EXTI_LINE_SOURCE, AFIO_EXTI_PD15); #endif EXTI->IMASK &=~(machine.dos_mask1|machine.dos_mask2); EXTI->RT_CFG |= (machine.dos_mask1|machine.dos_mask2); EXTI->FT_CFG |= (machine.dos_mask1|machine.dos_mask2); #if COMMUNICATION_MODE==HALF_DUPLEX EXTI->FT_CFG &=~(1<<9); #endif //TIMER4 dos cap 100K(10us) 64M TIM_Base_Struct_Initialize(&TIM_TimeBaseSt); PrescalerValue = 3; TIM_TimeBaseSt.Period = 159; TIM_TimeBaseSt.Prescaler = 3; TIM_TimeBaseSt.ClkDiv = 0; TIM_TimeBaseSt.CntMode = TIM_CNT_MODE_UP; TIM_Base_Initialize(DOS_TIM, &TIM_TimeBaseSt); TIM_Auto_Reload_Preload_Enable(DOS_TIM); TIM_Base_Prescaler_Set(DOS_TIM, PrescalerValue); DOS_TIM->STS &= ~1; TIM_Interrupt_Enable(DOS_TIM, TIM_INT_UPDATE); //TIMER5 dos cap timeout 1ms/round TIM_Base_Struct_Initialize(&TIM_TimeBaseSt); PrescalerValue = 15; TIM_TimeBaseSt.Period = 3999; TIM_TimeBaseSt.Prescaler = 0; TIM_TimeBaseSt.ClkDiv = 0; TIM_TimeBaseSt.CntMode = TIM_CNT_MODE_UP; TIM_Base_Initialize(TIM5, &TIM_TimeBaseSt); TIM_Auto_Reload_Preload_Enable(TIM5); TIM_Base_Prescaler_Set(TIM5, PrescalerValue); TIM5->STS &= ~1; TIM_Interrupt_Enable(TIM5, TIM_INT_UPDATE); } void SpbApi_SpbBspInit(void) { #if defined HY8810 || HY8602 || HY8811 || HY8603 || HY8822 || HY8612 #if DIP_DIS_COMBINE==0 SpbApi_DisInit(); #endif #endif SpbApi_DipInit(); SpbApi_DosInit(); }