OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3272|回复: 5

stm32输出比较中断函数 无法执行的问题

[复制链接]

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2021-3-14
在线时间
20 小时
发表于 2022-1-3 19:28:38 | 显示全部楼层 |阅读模式
1金钱
我程序要在TIM1CH3、TIM1CH4进行输出比较中断   ch1、ch2这两句输出互补波     在网上参考了几个输出比较定时器初始化配置的代码,本人用的是定时器1高级定时器  因为要用到死区互补输出,而网上一般用的是tim3、tim2,遇到的问题是一直无法进入中断      我的定时器的中断初始化用的这句   NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1的输出比较/输入捕获中断  而网上如果是tim2 用的是   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;   
程序如下

void ConfigTimer( void )
{
    GPIO_InitTypeDef GPIO_InitSturcture;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );

    //TIM1 ??PWM CH1->PA8  CH2->PA9  CH1N->PB13  CH2N->PB14
    GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
    GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA, &GPIO_InitSturcture );

    GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitSturcture );
    //?????
    TIM_TimeBaseInitStructure.TIM_Period = (Fsys/2) / Fpwm;;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;
    TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );
    //CH1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;                                
    TIM_OCInitStructure.TIM_Pulse = ccr1;                                                             
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;               
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;          
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
    TIM_OC1Init( TIM1, &TIM_OCInitStructure );
    //CH2
    TIM_OCInitStructure.TIM_Pulse = ccr2;                                                               
    TIM_OC2Init( TIM1, &TIM_OCInitStructure );
    //
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;        
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;        
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;                        
    TIM_BDTRInitStructure.TIM_DeadTime = deadtime;                                       
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;                       
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;                
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
    TIM_BDTRConfig( TIM1, &TIM_BDTRInitStructure );
               
                /* CH3 */
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
                TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
                TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
                TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
                TIM_OCInitStructure.TIM_Pulse = 0;
                TIM_OC3Init(TIM1,&TIM_OCInitStructure);
    /* CH4 */
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
                TIM_OCInitStructure.TIM_Pulse =((Fsys/2) / Fpwm) ;
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
                TIM_OC4Init(TIM1,&TIM_OCInitStructure);
               
    TIM_CtrlPWMOutputs( TIM1, ENABLE );
    TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable );   
    TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Enable );      
                TIM_OC3PreloadConfig( TIM1, TIM_OCPreload_Disable );     
                TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable );     
    TIM_ARRPreloadConfig( TIM1, ENABLE );
                TIM_ClearFlag(TIM1, TIM_FLAG_CC3)  ;                     
                TIM_ClearFlag(TIM1, TIM_FLAG_CC4)  ;                    
                TIM_ITConfig( TIM1,TIM_IT_CC3 |TIM_IT_CC4,ENABLE);   
    TIM_Cmd( TIM1, ENABLE );
               

    /* Configure one bit for preemption priority */
                NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1的输出比较/输入捕获中断
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);                 
}



void TIM1_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)    // CH3′¥·¢êä3ö±è½ÏÖD¶Ï
        {
                LED0=0;
                if(flag_ch3==0)
                {
//            capture= TIM_GetCapture3(TIM1);
//            TIM_SetCompare3(TIM1, capture +(((Fsys/2) / Fpwm) * PWM_DUTY) / 100);
                        TIM_SetCompare3(TIM1, (((Fsys/2) / Fpwm) * PWM_DUTY) / 100 );
                        flag_ch3=1;
                }
                else
                {
                        TIM_SetCompare3(TIM1, 0);
                        flag_ch3=0;
                }
        }
        if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET)    // CH4′¥·¢êä3ö±è½ÏÖD¶Ï
        {
                LED0=0;
                if(flag_ch4==0)
                {
//            capture= TIM_GetCapture4(TIM1);
//            TIM_SetCompare4(TIM1, capture -(((Fsys/2) / Fpwm) * PWM_DUTY) / 100);
                        TIM_SetCompare4(TIM1, (((Fsys/2) / Fpwm) * (100-PWM_DUTY)) / 100 );
                        flag_ch4=1;
                }
                else
                {
                        TIM_SetCompare4(TIM1, ((Fsys/2) / Fpwm));
                        flag_ch4=0;
                }
        }
        TIM_ClearITPendingBit(TIM1, TIM_IT_CC3|TIM_IT_CC4);  //Çå3yCH3¡¢CH4μÄêä3ö±è½ÏÖD¶Ï±ê־λ
}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2022-1-4 00:09:24 | 显示全部楼层
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2022-1-4 10:28:31 | 显示全部楼层
参考下这个:【探索者高级定时器互补输出PWM带短路和死区时间控制】http://www.openedv.com/forum.php?mod=viewthread&tid=295335
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-1-4 15:33:35 | 显示全部楼层
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;               
你把这个开起来干吗?
还有一个BDTR寄存器的MOE要开起来,库函数我没怎么用
寄存器是TIM1->BDTR|=TIM_BDTR_MOE;
回复

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2021-3-14
在线时间
20 小时
 楼主| 发表于 2022-1-7 08:21:29 | 显示全部楼层
聚东风 发表于 2022-1-4 15:33
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;               
你把这个开起来干吗?
还有一 ...

这句 开起来怎么了? 什么影响?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2022-1-9 01:36:14 | 显示全部楼层
爱扣篮的KD 发表于 2022-1-7 08:21
这句 开起来怎么了? 什么影响?

看他操作了啥寄存器,去看寄存器描述
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 20:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表