/** ****************************************************************************** * @file bsp_TimBase.c * @author fire * @version V1.0 * @date 2019-2-14 * @brief TIM2 1ms 定时应用bsp ****************************************************************************** * @attention * * 实验平台:保护跳闸 开发板 * ****************************************************************************** */ #include "Timer2.h" #include "sys.h" TIM_HandleTypeDef TIM2_Handler; //定时器句柄 u32 lwip_localtime=0; //lwip本地时间计数器,单位:ms /* * TIM_Period / Auto Reload Register(ARR) = 1000 TIM_Prescaler--71 * 中断周期为 = 1/(72MHZ /72) * 1000 = 1ms * * TIMxCLK/CK_PSC --> TIMxCNT --> TIM_Period(ARR) --> 中断 且TIMxCNT重置为0重新计数 */ void Timer2_Init(u16 arr,u16 psc) { //定时器2 __HAL_RCC_TIM2_CLK_ENABLE(); HAL_NVIC_SetPriority(TIM2_IRQn,1,3); //设置中断优先级,抢占优先级2,子优先级2 HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM4中断 TIM2_Handler.Instance=TIM2; //通用定时器2 /* 累计 TIM_Period个频率后产生一个更新或者中断 */ /* 时钟预分频数为72 */ TIM2_Handler.Init.Prescaler=psc; //分频 TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器 /* 自动重装载寄存器周期的值(计数值) */ TIM2_Handler.Init.Period=arr; //自动装载值 /* 对外部时钟进行采样的时钟分频,这里没有用到 */ TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //1分频 HAL_TIM_Base_Init(&TIM2_Handler); HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2中断 } //定时器2中断服务程序 void TIM2_IRQHandler(void) { if(__HAL_TIM_GET_IT_SOURCE(&TIM2_Handler,TIM_IT_UPDATE)==SET)//溢出中断 { // usmart_dev.scan(); //执行usmart扫描 __HAL_TIM_SET_COUNTER(&TIM2_Handler,0);; //清空定时器的CNT __HAL_TIM_SET_AUTORELOAD(&TIM2_Handler,100);//恢复原来的设置 } __HAL_TIM_CLEAR_IT(&TIM2_Handler, TIM_IT_UPDATE);//清除中断标志位 } //定时器3中断服务函数 void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&TIM2_Handler); } //回调函数,定时器中断服务函数调用 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==(&TIM2_Handler)) { lwip_localtime +=10; //加10 } } /*********************************************END OF FILE**********************/