定时器时间计算公式: Tout = ( ( psc+1) / Tclk ) * (arr+1) Tout : 溢出时间值(μs)0 R* N6 P/ l; w: z5 P psc: 预分频值(例如系统时钟为72MHz,APB分频1,则该值为7200) Tclk: 输入时钟(MHz) arr: 自动装载值(根据需要溢出的时间,通过预分频值和时钟倒推出自动装载值为多少) 例如:需要TIM2每 1s 中断一次(APB为1分频)) H7 Z. L4 W. \ 1000000μs = ((7199+1)/72MHz) * (arr+1) -----> 由此可求出 arr的自动装载值为9999) w/ d" z! F- z 关于TIM2 ~ TIM7 的初始化' w+ d! X& s+ |, P$ \, F+ J ) o8 N/ d8 x! `/ c" p8 C 1. 使能该定时器的时钟(TIM2 ~ TIM7是挂载在APB1下) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能或者失能APB1外设时钟 3 C/ l# W: j3 N+ v) c3 ~ * d5 o/ d/ O ~7 p 1. 初始化定时器 $ m) c* s, K# B9 G8 Y TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;! R; c; O! e2 e) u& B 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_tim2 E0 x4 _( C6 q TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化 1. 初始化NVIC+ }( c/ e* C& V$ A( p NVIC_InitTypeDef NVIC_my_init ; NVIC_my_init.NVIC_IRQChannel = TIM2_IRQChannel ;& @2 B7 v, A0 _( u( i NVIC_my_init.NVIC_IRQChannelPreemptionPriority = 0 ;( P6 b( K* t: V' H2 { NVIC_my_init.NVIC_IRQChannelSubPriority = 3 ; NVIC_my_init.NVIC_IRQChannelCmd = ENABLE ;, \- U, h' E) P5 _* U8 {9 l' o NVIC_Init(&NVIC_my_init) ;7 y P) \3 Y4 ? q5 k 9 R$ v% O3 ?' E( J 1. 打开定时器中断! M8 U0 p5 P$ j6 ~. q7 N % i: s/ l! u3 m }+ c, E) x2 y' v TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);5 Y3 r. m8 r; p1 J! }& s / e1 z6 |5 Q# P8 ` 1. 打开定时器' R! |% g' f3 D8 @& c9 T) E( T. [ 8 V, t a7 |5 E; R5 X8 _1 Z( Q TIM_Cmd(TIM2, ENABLE);* n; I& f$ B- ^+ ` " l# b: Z6 k, e. A 1. 编写定时中断函数( r0 t: q3 ^- o4 w' U2 t; b4 J8 j void TIM2_IRQHandler(void): ? O3 Y7 G! Q {/ G" q5 a, s h$ { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清空中断标志位8 H; T) @& D) T' C a //函数编写----尽量只设置标志位,避免中断嵌套7 k5 ^5 G C' d6 s" N }6 }1 j' _% ?6 L } |
LZ最近转载了不少资料过来呀 |
楼主的计算方式似乎太复杂了吧。 |