打印
[STM32F1]

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

[复制链接]
751|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
S2663265296|  楼主 | 2017-9-5 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************************
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  
        }
}

评分
参与人数 1威望 +2 收起 理由
mmuuss586 + 2 很给力!
沙发
S2663265296|  楼主 | 2017-9-5 17:43 | 只看该作者

使用特权

评论回复
板凳
S2663265296|  楼主 | 2017-9-5 17:44 | 只看该作者

使用特权

评论回复
地板
S2663265296|  楼主 | 2017-9-5 18:37 | 只看该作者
...

使用特权

评论回复
5
S2663265296|  楼主 | 2017-9-5 19:00 | 只看该作者
自己解决了,从定时器的PSC和ARR设置有误

使用特权

评论回复
6
mmuuss586| | 2017-9-5 19:02 | 只看该作者
S2663265296 发表于 2017-9-5 19:00
自己解决了,从定时器的PSC和ARR设置有误

解决了就好

使用特权

评论回复
7
S2663265296|  楼主 | 2017-9-5 19:30 | 只看该作者
结贴

使用特权

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

本版积分规则

8

主题

120

帖子

1

粉丝