/** ******************************** STM32F10x ********************************* * @文件名 : timer.c * @作者 : sun * @库版本 : V3.5.0 * @文件版本 : V1.0.0 * @日期 : 2016年05月09日 * @摘要 : 定时器源文件 ******************************************************************************/ /*---------------------------------------------------------------------------- 更新日志: 2016-05-09 V1.0.0:初始版本 ----------------------------------------------------------------------------*/ /* 包含的头文件 --------------------------------------------------------------*/ #include "timer.h" #include "led.h" int TimeCount,TimeFlag; void Tim3_init(int Period, int Prescaler) { TIM_TimeBaseInitTypeDef TimeBaseInitValue; NVIC_InitTypeDef NVIC_InitValue; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* 时钟计算: TIM2在APB1总线,APB1总线的时钟是72M/4=18MHz 定时器的时钟是总线时钟的2倍(参考代码得知) 定时器计数时钟=36M/3600=10000hz 计数是10000,则定时时间为1s */ TimeBaseInitValue.TIM_ClockDivision = TIM_CKD_DIV1; TimeBaseInitValue.TIM_CounterMode = TIM_CounterMode_Up; TimeBaseInitValue.TIM_Period = Period; //计数 TimeBaseInitValue.TIM_Prescaler = Prescaler; //分频系数 TIM_TimeBaseInit(TIM3, &TimeBaseInitValue); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC_InitValue.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitValue.NVIC_IRQChannelCmd = ENABLE; NVIC_InitValue.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitValue.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitValue); TIM_Cmd(TIM3, ENABLE); } void TIM3_IRQHandler(void) { static int count = 0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) { count++; if(count >= 2) { count = 0; LED_RUN = !LED_RUN; } // IWDG_Feed(); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } /************************************************ 函数名称 : TIMER_Initializes 功 能 : TIMER初始化 参 数 : 无 返 回 值 : 无 作 者 : sun *************************************************/ void TIMER_Initializes(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM4时基单元配置 */ TIM_TimeBaseStructure.TIM_Prescaler = TIM4_PRESCALER_VALUE; //预分频值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period = TIM4_PERIOD_TIMING; //定时周期(自动从装载寄存器ARR的值) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); /* 使能预分频值 */ TIM_ARRPreloadConfig(TIM4, ENABLE); //使能重载值TIM4_PRESCALER_VALUE } /************************************************ 函数名称 : TIMDelay_N10us 功 能 : 定时器延时N个10us 参 数 : Times --- N值 返 回 值 : 无 作 者 : sun *************************************************/ void TIMDelay_N10us(uint16_t Times) { TIM4->CR1 |= TIM_CR1_CEN; //启动定时器 while(Times--) { while((TIM4->SR & TIM_FLAG_Update) == RESET); TIM4->SR &= ~TIM_FLAG_Update; //清除标志 } TIM4->CR1 &= ~TIM_CR1_CEN; //关闭定时器 } /************************************************ 函数名称 : TIMDelay_Nms 功 能 : 定时器延时Nms 参 数 : Times --- N值 返 回 值 : 无 作 者 : sun *************************************************/ void TIMDelay_Nms(uint16_t Times) { while(Times--) { TIMDelay_N10us(10); } } /**** Copyright (C)2016 sun. All Rights Reserved **** END OF FILE ****/