
定时器时间计算公式: Tout = ( ( psc+1) / Tclk ) * (arr+1) Tout : 溢出时间值(μs) psc: 预分频值(例如系统时钟为72MHz,APB分频1,则该值为7200) Tclk: 输入时钟(MHz) arr: 自动装载值(根据需要溢出的时间,通过预分频值和时钟倒推出自动装载值为多少) 例如:需要TIM2每 1s 中断一次(APB为1分频) 1000000μs = ((7199+1)/72MHz) * (arr+1) -----> 由此可求出 arr的自动装载值为9999 关于TIM2 ~ TIM7 的初始化 1. 使能该定时器的时钟(TIM2 ~ TIM7是挂载在APB1下) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能或者失能APB1外设时钟 1. 初始化定时器 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = psc;//预分频值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 TIM_TimeBaseStructure.TIM_Period = arr;//在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//TDTS = Tck_tim TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化 1. 初始化NVIC NVIC_InitTypeDef NVIC_my_init ; NVIC_my_init.NVIC_IRQChannel = TIM2_IRQChannel ; NVIC_my_init.NVIC_IRQChannelPreemptionPriority = 0 ; NVIC_my_init.NVIC_IRQChannelSubPriority = 3 ; NVIC_my_init.NVIC_IRQChannelCmd = ENABLE ; NVIC_Init(&NVIC_my_init) ; 1. 打开定时器中断 TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE); 1. 打开定时器 TIM_Cmd(TIM2, ENABLE); 1. 编写定时中断函数 void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清空中断标志位 //函数编写----尽量只设置标志位,避免中断嵌套 } } |
LZ最近转载了不少资料过来呀 |
楼主的计算方式似乎太复杂了吧。 |