[STM32] 高分求救,stm32 mo timer2进不了中断

[复制链接]
 楼主| 大道至简 发表于 2014-4-29 11:42 | 显示全部楼层 |阅读模式
写了一个stm32的定时器初始化程序
cpu型号是stm32f051c8t6

可以初始化,但是永远进不了中断服务程序,程序在仿真器里面跑的时候每次停下来,都停止在以下红色的部分。
难道我中断部分配置错了?


以下是代码
  1. //-----------------------------------------------------       
  2. void TIM2_IRQHandler()
  3. {
  4.         static int tic,tid;
  5.          if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) ==SET )
  6.          {
  7.                 TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
  8.                         tic++;
  9.                         tid=tic&0x0001;
  10.                         if(tid==0)
  11.                                 GPIO_SetBits(LED_PORT,LED4);  //点亮LED1
  12.                         else
  13.                                 GPIO_ResetBits(LED_PORT,LED4);//熄灭LED1
  14.         }
  15. }
  16. //-----------------------------------------------------       
  17. void init_timer2_sub0()
  18. {
  19.     GPIO_InitTypeDef GPIO_InitStructure;   
  20.     RCC_AHBPeriphClockCmd(MOTO_GPIO_CLK, ENABLE);//使能moto所在GPIO的时钟

  21.         GPIO_InitStructure.GPIO_Pin = motor0_pluse | motor0_dir;
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  23.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  26.         GPIO_Init(motor0_port, &GPIO_InitStructure);

  27.         GPIO_ResetBits(motor0_port,motor0_pluse | motor0_dir);
  28. }
  29. //-----------------------------------------------------       
  30. void init_timer2_sub1()
  31. {
  32.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  33.         TIM_DeInit(TIM2);
  34.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  35.         TIM_InternalClockConfig(TIM2);
  36.         TIM_TimeBaseStructure.TIM_Period=2000;//这个值实际上就是TIMX->ARR,延时开始时重新设定即可?
  37.         TIM_TimeBaseStructure.TIM_Prescaler=20000;//计数频率为1KHz
  38.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV4;//定时器基准频率8MHz
  39.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
  40.         TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
  41.         TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
  42.         TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//计数溢出时触发中断
  43.         TIM_ARRPreloadConfig(TIM2, DISABLE);
  44.         TIM_Cmd(TIM2,ENABLE);
  45. }
  46. //-----------------------------------------------------
  47. void init_timer2_sub2()
  48. {
  49.         NVIC_InitTypeDef  NVIC_InitStructure;
  50.         NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn;  
  51.         NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
  52.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  53.         NVIC_Init(&NVIC_InitStructure);       
  54. }
  55. ///-----------------------------------------------------
  56. void moto_task_init()
  57. {
  58.         init_MotorStepCount();
  59.         init_timer2_sub0();
  60.         init_timer2_sub1();
  61.         init_timer2_sub2();
  62. }
  63. //-----------------------------------------------------       
  64. void moto_task(void)
  65. {
  66.         moto_task_init();
  67.         while(1)
  68.         {
  69.         }
  70. }


 楼主| 大道至简 发表于 2014-4-29 11:43 | 显示全部楼层
最后都停止在这个红色的部分:
void moto_task(void)
{
        moto_task_init();
        while(1)
        {
        }

}
 楼主| 大道至简 发表于 2014-4-29 11:50 | 显示全部楼层
断点停下来的时候可以看见timer2的CNT寄存器变化了
lanmp 发表于 2014-4-29 11:51 | 显示全部楼层
版主都搞不定,看来这芯片有问题。
 楼主| 大道至简 发表于 2014-4-29 14:31 | 显示全部楼层
不是搞不定,只是时间问题。有配件类似问题,也许回答我只是一分钟的事情。
 楼主| 大道至简 发表于 2014-4-29 22:08 | 显示全部楼层
自己找到了,问题在这里。disable更改成enable就好了
void init_timer2_sub1()
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_DeInit(TIM2);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

        TIM_InternalClockConfig(TIM2);
        TIM_TimeBaseStructure.TIM_Period=2000;//这个值实际上就是TIMX->ARR,延时开始时重新设定即可?
        TIM_TimeBaseStructure.TIM_Prescaler=20000;//计数频率为1KHz
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV4;//定时器基准频率8MHz
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//计数溢出时触发中断
        TIM_ARRPreloadConfig(TIM2, DISABLE);
        TIM_Cmd(TIM2,ENABLE);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:看大道至简所著的《感悟设计》,感悟设计的至简大道

7562

主题

9523

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部