打印
[STM32F1]

定时器级联,从定时器没有反应,不进入中断函数

[复制链接]
842|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bqyj|  楼主 | 2018-11-6 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器级联,从定时器没有反应,不进入中断函数
沙发
bqyj|  楼主 | 2018-11-6 19:25 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
bqyj|  楼主 | 2018-11-6 19:28 | 只看该作者

/*********************************************
Function:        TIM3_STEP_Init
Description:     步进电机驱动信号定时器初始化         
*********************************************/
void TIM3_STEP_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
               
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//使用默认值填充结构体成员


        TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable); //使能主从模式,010:更新 – 更新事件被选为触发输入(TRGO)。
         //例如,一个主定时器的时钟可以被用作一个从定时器的预分频器。
        TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update);    //选择输出触发,一个主定时器的时钟可以被用作一个从定时器的预分频器。

        TIM_TimeBaseStructure.TIM_Period = 101;       //
        TIM_TimeBaseStructure.TIM_Prescaler = 19;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;        // 时钟分频因子 ,配置死区时间时需要用到
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        // 计数器计数模式,设置为向上计数
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);        // 初始化定时器
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
               
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;        // 配置为PWM模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        // 输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;        // 输出通道电平极性配置
        TIM_OCInitStructure.TIM_Pulse = TIM3->ARR >>1;            //重载值的一半,即50%
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);
        TIM_OC4Init(TIM3, &TIM_OCInitStructure);
        
        
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);  
        TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
        
        
        TIM_ClearFlag(TIM3, TIM_FLAG_Update);                                                // 清除计数器中断标志位
        //TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                                       // 开启计数器中断
        //TIM_Cmd(TIM3,ENABLE);//主函数有使能
        
}

/*********************************************
Function:        TIM1_STEP_Init
Description:     电机PWM计数定时器初始化         
*********************************************/
void TIM1_STEP_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
          //从定时器TIM1
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        TIM_TimeBaseStructure.TIM_Period= 0;                                                        // 自动重装载寄存器的值
        TIM_TimeBaseStructure.TIM_Prescaler= 0;                                                  // 时钟预分频数
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                        // 时钟分频因子 ,        
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 计数器计数模式,设置为向上计数               
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;                                  // 重复计数器的值
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                         // 初始化定时器

        //连接定时器3的TRGO1输出至定时器1,设置高级TIM1_SMCR寄存器的TS=’010’内部触发0(ITR2),(TIM3主TIM1从选择ITR2,P237页)
        //配置定时器1为使用ITR2作为内部触发的从模式。
        TIM_SelectInputTrigger(TIM1,TIM_TS_ITR2);
        //然后把从模式控制器置于外部时钟模式1(TIM1_SMCR寄存器的SMS=111);
        //这样定时器1即可由定时器3周期性的上升沿(即定时器3的计数器溢出)信号驱动。
       TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_External1);
        
        TIM_ClearFlag(TIM1, TIM_FLAG_Update);                                // 清除计数器中断标志位
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);                                // 开启计数器中断
        
          TIM_Cmd(TIM1, ENABLE);                                                        // 使能计数器
}

void TIM1_UP_IRQHandler(void)
{
         if(TIM_GetITStatus(TIM1, TIM_IT_Update) == SET)
  {
                TI1Spama++;
                TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清中断标志TIM_IT_Update  
        }
}

使用特权

评论回复
地板
zwll| | 2018-11-6 19:31 | 只看该作者
从定时器的PSC和ARR设置有误

使用特权

评论回复
5
bqyj|  楼主 | 2018-11-6 19:35 | 只看该作者

搞定了,呵呵,犯了低级错误……结贴啦,多谢

使用特权

评论回复
6
幸福小强| | 2018-11-6 22:15 | 只看该作者
定时器还能级联?

使用特权

评论回复
7
磨砂| | 2018-11-7 09:58 | 只看该作者
有没有可能是中断优先级的问题

使用特权

评论回复
8
晓伍| | 2018-11-7 10:03 | 只看该作者
你看看计数器里边开始计数了吗

使用特权

评论回复
9
天灵灵地灵灵| | 2018-11-7 11:22 | 只看该作者
这年头我就会用图形化配置了,太复杂搞不定

使用特权

评论回复
10
观海| | 2018-11-7 11:51 | 只看该作者
话说楼主能说清楚哪里的问题了吗

使用特权

评论回复
11
renzheshengui| | 2018-11-7 12:58 | 只看该作者
难道楼主没有开启二级定时器?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

390

主题

4526

帖子

2

粉丝