void MOD_TIM_Config(Mod_Master_Frame_TypeDef* aFrame) { TIM2_DeInit(); TIM2_TimeBaseInit(0x0F, 1500); //2ms comm response time TIM2_UpdateRequestConfig(TIM2_UPDATESOURCE_REGULAR); TIM2_GenerateEvent(TIM2_EVENTSOURCE_UPDATE); TIM2_Cmd(DISABLE); TIM2_ClearITPendingBit(TIM2_IT_UPDATE); TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); TIM2_ClearFlag(TIM2_FLAG_UPDATE); TIM4_DeInit(); TIM4_TimeBaseInit(0x07, 126); //128 * 126 = 16128 = 2ms (8MHz), frame check TIM4_UpdateRequestConfig(TIM4_UPDATESOURCE_REGULAR); TIM4_GenerateEvent(TIM4_EVENTSOURCE_UPDATE); TIM4_Cmd(DISABLE); TIM4_ClearITPendingBit(TIM4_IT_UPDATE); TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_ClearFlag(TIM4_FLAG_UPDATE); }
/** * @brief Timer4 Update/Overflow Interruption routine. * @par Parameters: * None * @retval void None * @par Required preconditions: * None * @par Called functions: * None */ @near @interrupt @svlreg void TIM4_UPD_OVF_IRQHandler (void) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ TIM4_ClearITPendingBit(TIM4_IT_UPDATE); vtimer_UpdateHandler(); return; }
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void) { // 1ms 中断 if( ++counter_10ms >= 10 ) { counter_10ms = 0; flag_10ms_ok = 1; } TIM4_ClearITPendingBit(TIM4_IT_UPDATE); return; }
void SysTick_ISR(void) { static uint8_t s_count = 0; uint8_t i; /*********************************************** * 描述: 清楚基本定时器4中断标志位 */ TIM4_ClearITPendingBit(TIM4_IT_UPDATE); //TIM4_ClearFlag(TIM4_FLAG_UPDATE); /*********************************************** * 描述: 每隔2ms进来1次 */ if (s_uiDelayCount > 0) { if (--s_uiDelayCount == 0) { s_ucTimeOutFlag = 1; } } if (++s_count < (10 / SYSTICK_PERIOD)) { return; } s_count = 0; /*********************************************** * 描述: 每隔10ms进来1次 */ for (i = 0; i < TMR_COUNT; i++) { Bsp_SoftTimerDec(&g_Tmr[i]); } /*********************************************** * 描述: 统计系统运行时间 */ // g_iRunTime++; /* 全局运行时间每10ms增1, 248天一个循环 */ // if (g_iRunTime == 0x7FFFFFFF) // { // g_iRunTime = 0; // } /*********************************************** * 描述: 此函数在 bsp.c 中实现(可以为空) */ Bsp_RunPer10ms(); }
void Tim4_ClearITBit(void) { TIM4_ClearITPendingBit(TIM4_IT_UPDATE); }
void mod_int_frame_timeout() { uint16_t crc, val; stopUART(); setTimeoutCheck(MOD_TIMER_PAUSE); setFrameCheck(MOD_TIMER_STOP); //exception Slave or unexception Slave TIM4_ClearITPendingBit(TIM4_IT_UPDATE); if (modFrame.rxframe[0] != modFrame.toAddr) { modFrame.rxCursor = 0; modFrame.rxLen = 0; modFrame.rxOK = FALSE; setTimeoutCheck(MOD_TIMER_RESUM); startRX(); } else { modFrame.rxOK = TRUE; modFrame.modState = Mod_State_ProcessReply; modFrame.modEvent = Mod_Event_No; if (modFrame.rxCursor < 2) modFrame.rxCursor = 10; crc = CRC16(modFrame.rxframe, modFrame.rxCursor - 2); val = ((uint16_t)(modFrame.rxframe[modFrame.rxCursor - 1]) << 8) + modFrame.rxframe[modFrame.rxCursor - 2]; if (crc != val) { if (modFrame.retryCount < MOD_MAX_RETRYS) //exceed max retry count { //resend , count ++ modFrame.retryCount ++; modFrame.modState = Mod_State_Sending; sendFrame(2, &modFrame); return; } else { //commucation error modFrame.retryCount = 0; modFrame.linkFail = TRUE; modFrame.modState = Mod_State_Idle; modFrame.request = FALSE; return; } } else { //process reply frameProcessData(&modFrame); modFrame.retryCount = 0; modFrame.linkFail = FALSE; modFrame.modState = Mod_State_Idle; modFrame.request = FALSE; return; } } }
@far @interrupt void TIM4_UPD_OVF_IRQHandler(void) { TIM4_ClearITPendingBit(TIM4_IT_UPDATE); if(u8CommSendStep != 0) { if(u8CurSend500usCnt<200) u8CurSend500usCnt++; switch(u8CommSendStep) { case LEAD_LOW: if( u8CurSend500usCnt >= 12 ) { u8CommSendStep = LEAD_HIGH; u8CurSend500usCnt = 0; GPIO_WriteLow(TxRxPort,TX); } else GPIO_WriteHigh(TxRxPort,TX); break; case LEAD_HIGH: if( u8CurSend500usCnt >= 20 ) { u8CommSendStep = DATA_LOW; u8CurSend500usCnt = 0; GPIO_WriteHigh(TxRxPort,TX); } else GPIO_WriteLow(TxRxPort,TX); break; case DATA_LOW: if(u8CurSend500usCnt<2) return; GPIO_WriteLow(TxRxPort,TX); u8CurSend500usCnt = 0; if(u8CurSendByte>=TOTAL_TX_BYTE) { stopTim4(); GPIO_Init(TxRxPort, RX, GPIO_MODE_IN_PU_IT); //开接收中断 u8CommSendStep = 0; u8commStatus = 0; return; } else u8CommSendStep = DATA_HIGH; break; case DATA_HIGH: if(u8CurSend500usCnt >= 2) { if( ((TxBuf[u8CurSendByte] & BitMap[u8CurSendBit]) == 0 ) || (u8CurSend500usCnt>=6) ) { GPIO_WriteHigh(TxRxPort,TX); u8CommSendStep = DATA_LOW; u8CurSend500usCnt = 0; u8CurSendBit++; if(u8CurSendBit>7) { u8CurSendBit = 0; u8CurSendByte++; } } else GPIO_WriteLow(TxRxPort,TX); } else GPIO_WriteLow(TxRxPort,TX); break; } // resetTim4For500us(); } else if( u8CommRevStep != 0) { u8CurRev500usCnt++; if(u8CurRev500usCnt>50) { u8CommRevStep = 0; } // resetTim4For500us(); } else stopTim4(); }