/** ****************************************************************************** * @file tim.c * @author Jerry * @version V2.1 * @date 19-April-2022 * @brief tim program body. ****************************************************************************** * @attention * * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include "global.h" uint32_t tmrSys = 0; uint32_t tmrTemp[20]; //10MS void uf_TIM3_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = 10000-1; TIM_TimeBaseStructure.TIM_Prescaler = 72-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主定时器 优先级:0,0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE ); TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 } //10ms中断 void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源 tmrSys++; KEY_TIM_Moni(); Cali_SOC_Moni(); Screen_TIM_Moni(); //[陶晶驰] CAN_TIM_Moni(); MODBUS_TIM_Moni(); MODBUS1_TIM_Moni(); // DI_TIM_Moni(); // DI_Ctrl(); OCC2_TIM_Moni(); OCC2_Ctrl(); #if Addr_SetAuto //休眠时,地址变动暂停 if(sleep_flag == 0) { if(paraMem.addr_FREE_Flg == 0) ADDR_Rank_Moni(); if(paraMem.addr_FREE_Flg == 0) ADDR_Assign_Moni(); } #endif //只有RTC时钟有问题时,才会启用下列函数 if(LSEErrFlag==1) { SLEEP_TIM_Moni(); //休眠的倒计时 SLEEP2_TIM_Moni(); //休眠2的倒计时 UVOff_TIM_Moni(); //欠压强制复位的倒计时 FCCCali_TIM_Moni(); //容量校准要在12h内的倒计时 } if(Screen_RevFlg == 1) //屏幕收到完整一帧去处理 { Screen_RevCount++; if(Screen_RevCount > 1) { Screen_RevFlg = 0; Screen_RevCount = 0; //Screen_IT_Update(); Screen_RevHandlerFlg = 1; } } if(MODBUS_RevFlg == 1) //MODBUS收到完整一帧去处理 { MODBUS_RevCount++; if(MODBUS_RevCount > 1) { MODBUS_RevFlg = 0; MODBUS_RevCount = 0; MODBUS_IT_TIMUpdate(); } } if(MODBUS1_RevFlg == 1) //MODBUS1收到完整一帧去处理 { MODBUS1_RevCount++; if(MODBUS1_RevCount > 1) { MODBUS1_RevFlg = 0; MODBUS1_RevCount = 0; MODBUS1_IT_TIMUpdate(); } } /*三选一模块*/ #if BLE_Conn BLE_TIM_Moni(); //BLE无通信定时初始化 if(BLE_RevFlg == 1) //BLE收到完整一帧去处理 { BLE_RevCount++; if(BLE_RevCount > 3) { BLE_RevFlg = 0; BLE_RevCount = 0; BLE_IT_Update(); } } #endif #if WIFI_Conn WIFI_TIM_Moni(); //WIFI无通信定时初始化 if(WIFI_RevFlg == 1) //WIFI收到完整一帧去处理 { WIFI_RevCount++; if(WIFI_RevCount > 3) { WIFI_RevFlg = 0; WIFI_RevCount = 0; WIFI_IT_Update(); } } #endif #if LTE_Conn LTE_TIM_Moni(); //LTE无通信定时初始化 if(LTE_RevFlg == 1) //LTE收到完整一帧去处理 { LTE_RevCount++; if(LTE_RevCount > 3) { LTE_RevFlg = 0; LTE_RevCount = 0; //有回复,清零等待倒计时 LTE_WaitRxFlg = 0; LTE_WaitRxDelay = 0; if(LTE_OTA_Flag == 0) { LTE_4G_IT_Update(); } else { LTE_OTA_IT_Update(); } } } #endif } } /************************************************************************** ** 函数名: TIMER_Update ** 输 入: nothing ** 输 出: tmrSys value ** 备 注:tmrSys do ++ in the SysTick_Handler function ***************************************************************************/ uint32_t TIMER_Update(void) { return tmrSys; } /************************************************************************** ** 函数名: ** 输 入: ** 输 出: ** 备 注: ***************************************************************************/ uint32_t TIMER_IsOut(uint32_t cnt, uint32_t tmr) { uint32_t tmp = tmrSys; tmp = cnt > tmp ? ( (uint32_t)(-1) - cnt + tmp ) : ( tmp-cnt ); if(tmp>=tmr) return 1; else return 0; } /************************************************************************** ** 函数名: ** 输 入: ** 输 出: ** 备 注: ***************************************************************************/ uint32_t TIMER_IsOther(uint32_t cnt, uint32_t tmr) { uint32_t tmp = tmrSys; uint32_t tmp1; tmp = cnt > tmp ? ( (uint32_t)(-1) - cnt + tmp ) : ( tmp-cnt ); tmp1 = tmp>=tmr ? (tmp - tmr): (tmr-tmp); return tmp1; }