定时器时间计算公式: Tout = ( ( psc+1) / Tclk ) * (arr+1) Tout : 溢出时间值(μs) psc: 预分频值(例如系统时钟为72MHz,APB分频1,则该值为7200) Tclk: 输入时钟(MHz) arr: 自动装载值(根据需要溢出的时间,通过预分频值和时钟倒推出自动装载值为多少)( b) c9 x3 `+ K. I# q 例如:需要TIM2每 1s 中断一次(APB为1分频)! D9 M; c, k1 V0 ^4 ~" I" ] 1000000μs = ((7199+1)/72MHz) * (arr+1) -----> 由此可求出 arr的自动装载值为9999$ H* E% }; w7 g! p5 { & f6 o" x4 k* j! B/ D 关于TIM2 ~ TIM7 的初始化 ! }7 _- J: n% m: T - Y) P& U/ c8 V$ q 1. 使能该定时器的时钟(TIM2 ~ TIM7是挂载在APB1下) + Z* d" a1 s d3 Y+ t; s* |* q - T& G& ~# x& Z; h7 P K RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能或者失能APB1外设时钟 1. 初始化定时器 9 {5 H; ?9 I2 O& _# i TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = psc;//预分频值, i& p5 H" R# b TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式 TIM_TimeBaseStructure.TIM_Period = arr;//在下一个更新事件装入活动的自动重装载寄存器周期的值3 U1 @/ N: f3 u. L TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//TDTS = Tck_tim TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化 4 v$ B7 w$ z8 q* d/ w T9 o. E 1. 初始化NVIC0 r" ]1 g0 `0 K/ J9 `, W . m# n2 \7 K/ i S# S8 b$ U/ ^ $ F: c; F+ A4 C- L NVIC_InitTypeDef NVIC_my_init ; NVIC_my_init.NVIC_IRQChannel = TIM2_IRQChannel ;& C6 a5 ^: H8 r6 C NVIC_my_init.NVIC_IRQChannelPreemptionPriority = 0 ;; t: z( A& Q) n& x5 o# E NVIC_my_init.NVIC_IRQChannelSubPriority = 3 ; NVIC_my_init.NVIC_IRQChannelCmd = ENABLE ;3 J8 F$ y6 `" s, n/ b9 Q' d* y! t NVIC_Init(&NVIC_my_init) ;1 l# E" b8 T6 U% C% ] / W& V. C( A7 c7 T* U( S- E 1. 打开定时器中断 l: k( T& |! f+ f TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE); 6 I" t9 g! ~# b9 y4 K9 I 1. 打开定时器; {+ z6 |" i: c! s a M( x+ r- y, I# C4 M( {5 j( I p TIM_Cmd(TIM2, ENABLE); 1. 编写定时中断函数' y$ [6 Y* I0 \6 D " g) O/ W: C# J [& Z7 D1 V0 O1 Q void TIM2_IRQHandler(void) {2 U9 ?* h( n1 ^( A$ w X( b' ? if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){0 e/ w8 c% E, z6 Q/ @" y" s TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清空中断标志位- g5 g6 C/ O1 \- B. [% I //函数编写----尽量只设置标志位,避免中断嵌套 } } 6 D* S( k0 G4 F% t* c |
LZ最近转载了不少资料过来呀 |
楼主的计算方式似乎太复杂了吧。 |