你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103 pwm输出同时开启溢出中断

[复制链接]
uamazing 提问时间:2018-8-7 17:01 /
在做步进电机的控制时,需要用到pwm脉冲计数,我想的是pwm输出的同时开启溢出中断,在服务函数里计算脉冲数。现在遇到的问题是,定时器中断和pwm输出 这两个代码分开的时候,两个都能正常运行,但是合在一起的时候就触发不了中断了。用的寄存器
<
收藏 评论11 发布时间:2018-8-7 17:01

举报

11个回答
uamazing 回答时间:2018-8-7 22:48:28
终于还是把程序调试完了,之前步进电机驱动的ena端线松了,导致实验现象与程序不符,又由于没有J-link,只能通过在程序中加LED灯来调试,就出现上面源程序的中断函数里有小灯和延时函数。花费了大量的时间来调试(这个故事告诉我们 ,拥有一个J-link是多么的美好
。简单总结一下,网上大多使用的是高级定时器来数脉冲,但是这次用到的板子上没有引出高级定时器,我就想通过通用定时器的溢出中断来计数脉冲,就目前来看,电机能按预期工作,尽管程序比较简单,但是对我这个菜鸟来说,能孤立完成已经很开心了

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

uamazing 回答时间:2018-8-7 17:06:55
void TIM3_PWM_Init(u16 arr,u16 psc)
{                                                          
        //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
        RCC->APB1ENR|=1<<1;         //TIM3ʱÖÓʹÄÜ   
        RCC->APB2ENR|=1<<3;            //ʹÄÜPORTBʱÖÓ       
//        GPIOB->CRL&=0XFF0FFFFF;        //PB5Êä³ö
//        GPIOB->CRL|=0X00B00000;        //¸´Óù¦ÄÜÊä³ö           
  RCC->APB2ENR|=1<<2;            //ʹÄÜPORTAʱÖÓ       
  GPIOA->CRL&=0X0FFFFFFF;        //PA7Êä³ö
        GPIOA->CRL|=0XB0000000;        //¸´Óù¦ÄÜÊä³ö        
          
        RCC->APB2ENR|=1<<0;     //¿ªÆô¸¨ÖúʱÖÓ          
//        AFIO->MAPR&=0XFFFFF3FF; //Çå³ýMAPRµÄ[11:10]
//        AFIO->MAPR|=0<<10;      //²¿·ÖÖØÓ³Ïñ,TIM3_CH2->PA7

        TIM3->ARR=arr;                        //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ
        TIM3->PSC=psc;                        //Ô¤·ÖƵÆ÷²»·ÖƵ
       
        TIM3->CCMR1|=7<<12;          //CH2 PWM2ģʽ                 
        TIM3->CCMR1|=1<<11;         //CH2Ô¤×°ÔØÊ¹ÄÜ          
        TIM3->CCER|=3<<4;           //OC2 Êä³öʹÄÜ          ,Êä³ö¼«ÐÔΪµÍ
        TIM3->DIER|=1<<0;   //ÔÊÐí¸üÐÂÖжÏ
        TIM3->DIER|=1<<6;   //ÔÊÐí´¥·¢ÖжÏ
        TIM3->DIER|=1<<2;   //ÔÊÐí±È½Ï/²¶»ñ2ÖжÏ
        MY_NVIC_Init(1,3,TIM3_IRQn,2);//ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2       
        //TIM3->CCER|=1<<4;           //OC2 Êä³öʹÄÜ        £¬ Êä³ö¼«ÐÔΪ¸ß
        TIM3->CR1=0x0080;           //ARPEʹÄÜ
        TIM3->CR1|=0x03;            //ʹÄܶ¨Ê±Æ÷3 £¬²¢Ö»ÓÐÒç³ö´¥·¢ÖжϠ                                                                                 
}           
uamazing 回答时间:2018-8-7 17:07:25
void TIM3_IRQHandler(void)
{
  LED1=1;
  delay_ms(500);       
        if(TIM3->SR>>2&0X0001)//Òç³öÖжÏ
        {
                        pluse=pluse+1;                                                                                               
        }                                  
        TIM3->SR&=~(1<<2);//Çå³ýÖжϱê־λ             
}
MrJiu 回答时间:2018-8-7 17:41:09
首先,中断里面用delay_ms(500);,牛逼。。。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

rydy 回答时间:2018-8-7 18:04:56
代码中最大的问题中断里延时,推荐一种高效方法,资源够用的情况下,可以考虑结合DMA精确脉冲控制,不用频繁进入中断。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

uamazing 回答时间:2018-8-7 22:50:36
void TIM3_PWM_Init(u16 arr,u16 psc)
{       

        //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
        RCC->APB1ENR|=1<<1;         //TIM3ʱÖÓʹÄÜ   
        RCC->APB2ENR|=1<<3;            //ʹÄÜPORTBʱÖÓ       
//        GPIOB->CRL&=0XFF0FFFFF;        //PB5Êä³ö
//        GPIOB->CRL|=0X00B00000;        //¸´Óù¦ÄÜÊä³ö           
  RCC->APB2ENR|=1<<2;            //ʹÄÜPORTAʱÖÓ       
  GPIOA->CRL&=0X0FFFFFFF;        //PA7Êä³ö
        GPIOA->CRL|=0XB0000000;        //¸´Óù¦ÄÜÊä³ö        
          
        RCC->APB2ENR|=1<<0;     //¿ªÆô¸¨ÖúʱÖÓ          
//        AFIO->MAPR&=0XFFFFF3FF; //Çå³ýMAPRµÄ[11:10]
//        AFIO->MAPR|=0<<10;      //²¿·ÖÖØÓ³Ïñ,TIM3_CH2->PA7

        TIM3->ARR=arr;                        //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ
        TIM3->PSC=psc;                        //Ô¤·ÖƵÆ÷²»·ÖƵ
       
        TIM3->CCMR1|=7<<12;          //CH2 PWM2ģʽ                 
        TIM3->CCMR1|=1<<11;         //CH2Ô¤×°ÔØÊ¹ÄÜ          
        TIM3->CCER|=3<<4;           //OC2 Êä³öʹÄÜ          ,Êä³ö¼«ÐÔΪµÍ
        TIM3->DIER|=1<<0;   //ÔÊÐí¸üÐÂÖжÏ
        TIM3->DIER|=1<<6;   //ÔÊÐí´¥·¢ÖжÏ
        TIM3->DIER|=1<<2;   //ÔÊÐí±È½Ï/²¶»ñ2ÖжϠ      
        //TIM3->CCER|=1<<4;           //OC2 Êä³öʹÄÜ        £¬ Êä³ö¼«ÐÔΪ¸ß
        TIM3->CR1=0x0080;           //ARPEʹÄÜ
        TIM3->CR1|=0x0005;            //ʹÄܶ¨Ê±Æ÷3 £¬²¢Ö»ÓÐÒç³ö´¥·¢ÖжϠ      

  MY_NVIC_Init(1,3,TIM3_IRQn,2);//ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2       
}           
uamazing 回答时间:2018-8-7 22:51:18
extern u16 pluse;
void TIM3_IRQHandler(void)
{  
        if(TIM3->SR&0X0001)//Òç³öÖжÏ
        {   
                 
                        pluse++;
//      if(pluse>6400)               
//                        ENA=1;
               
        }                                  
        TIM3->SR&=~(1<<0);//Çå³ýÖжϱê־λ                 
}
uamazing 回答时间:2018-8-7 22:52:22
rydy 发表于 2018-8-7 18:04
代码中最大的问题中断里延时,推荐一种高效方法,资源够用的情况下,可以考虑结合DMA精确脉冲控制,不用频 ...

嗯嗯,学到DMA的时候试试,谢谢
uamazing 回答时间:2018-8-7 22:53:17
MrJiu 发表于 2018-8-7 17:41
首先,中断里面用delay_ms(500);,牛逼。。。

我是菜鸟啦,查了下资料,现在知道了,谢谢啦
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版