TIM计数中断:神舟IV

 计数器模式

原子的链接:http://www.openedv.com/posts/list/11832.htm

TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数

中断时间:自动加载值/(主频/预分频)

先设置TIM3 向上计数 1秒1次中断,再设置TIM4向下计数1/4秒中断一次,在中断函数中打印counter,中断函数中不推荐使用printf

Timer3_Config
 1 void Timer3_Config(void)
 2 {
 3   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 4   NVIC_InitTypeDef     NVIC_InitStructure;
 5 
 6   /* TIM3 clock enable */
 7   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 8   
 9   /* ---------------------------------------------------------------
10     TIM3 Configuration: Output Compare Timing Mode:
11     TIM2CLK = 36 MHz, Prescaler = 7200, TIM2 counter clock = 7.2 MHz
12   --------------------------------------------------------------- */
13 
14   /* Time base configuration */
15   //这个就是自动装载的计数值,由于计数是从0开始的,计数10000次后为9999
16   TIM_TimeBaseStructure.TIM_Period = (10000 - 1);
17   // 这个就是预分频系数,当由于为0时表示不分频所以要减1
18   TIM_TimeBaseStructure.TIM_Prescaler = (7200 - 1);
19   // 高级应用本次不涉及。定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)
20   // 使用的采样频率之间的分频比例
21   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
22   //向上计数
23   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
24   //初始化定时器3
25   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
26 
27   /* Clear TIM3 update pending flag[清除TIM5溢出中断标志] */
28   TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
29 
30   /* TIM IT enable */ //打开溢出中断
31   TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
32 
33   /* TIM3 enable counter */
34   TIM_Cmd(TIM3, ENABLE);  //计数器使能,开始工作
35 
36 
37   
38   /* Set the Vector Table base address at 0x08000000 */
39   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
40 
41   /* Enable the TIM5 gloabal Interrupt */
42   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
43   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
44   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
45   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
46 
47   NVIC_Init(&NVIC_InitStructure);
48 
49 }
Timer4_Config
 1 void Timer4_Config(void)
 2 {
 3 
 4   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 5   NVIC_InitTypeDef     NVIC_InitStructure;
 6 
 7   /* TIM3 clock enable */
 8   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
 9   
10   /* ---------------------------------------------------------------
11     TIM3 Configuration: Output Compare Timing Mode:
12     TIM2CLK = 36 MHz, Prescaler = 7200, TIM2 counter clock = 7.2 MHz
13   --------------------------------------------------------------- */
14 
15   /* Time base configuration */
16   //这个就是自动装载的计数值,由于计数是从0开始的,计数10000次后为9999 除以四,1/4秒中断
17   TIM_TimeBaseStructure.TIM_Period = (10000/4 - 1);
18   // 这个就是预分频系数,当由于为0时表示不分频所以要减1
19   TIM_TimeBaseStructure.TIM_Prescaler = (7200 - 1);
20   // 高级应用本次不涉及。定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)
21   // 使用的采样频率之间的分频比例
22   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
23   //向上计数
24   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
25   //初始化定时器4
26   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
27 
28   /* Clear TIM4 update pending flag[清除TIM4溢出中断标志] */
29   TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
30 
31   /* TIM IT enable */ //打开溢出中断
32   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
33 
34   /* TIM4 enable counter */
35   TIM_Cmd(TIM4, ENABLE);  //计数器使能,开始工作
36 
37 
38   
39   /* Set the Vector Table base address at 0x08000000 */
40   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
41 
42   /* Enable the TIM5 gloabal Interrupt */
43   NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
44   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
45   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
46   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
47 
48   NVIC_Init(&NVIC_InitStructure);
49 
50 
51 }
TIM3_IRQHandler
1 void TIM3_IRQHandler(void)
2 {
3   static u32 counter3 = 0;
4   if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
5   {
6    TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
7   }    
8   printf("Allen:-->TIM3:%d\n\r", counter3++);
9 }
TIM4_IRQHandler
 1 void TIM4_IRQHandler(void)
 2 {
 3   static u32 counter4 = 0;
 4   if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
 5   {
 6    TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
 7   }    
 8   printf("Allen:-->TIM4:%d\n\r", counter4++);;
 9 
10 }

 

posted @ 2013-03-13 21:04  wwjdwy  阅读(401)  评论(0编辑  收藏  举报