OpenEdv-开源电子网

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

三个定时器使用 两路PWM 一路中断输出 求问为什么只有一路输出?

[复制链接]

6

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-24
在线时间
8 小时
发表于 2016-3-25 14:26:22 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "timer.h"
#include "delay.h"
#include "usart.h"       

extern u8 flog;

void TIM2_IRQHandler(void)
{
        u16 ADD;
        if(TIM2->SR&0X0001)//òç3öÖD¶Ï
        {
                ADD++;
    SCLK=!SCLK;                       
        }                                  
        TIM2->SR&=~(1<<0);//&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
        if(ADD>50000)
        {
                flog=~flog;
        }
}


void TIM2_Int_Init(u16 arr,u16 psc)
{
//        printf("time_set \r\n");
        RCC->APB1ENR|=1<<0;        //TIM2ê±&#214;óê1&#196;ü  
        RCC->APB2ENR|=1<<4;
  GPIOC->CRL&=0XF0FFFFFF;//PC6&#199;&#229;á&#227;       
        GPIOC->CRL|=0X03000000;// ê&#228;3&#246;&#196;£ê&#189; 50Mhz
  
        TIM2->ARR=arr;          //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
        TIM2->PSC=psc;          //&#212;¤·&#214;&#198;μ&#198;÷éè&#214;&#195;
        TIM2->DIER|=1<<0;   //&#212;êDí&#184;üD&#194;&#214;D&#182;&#207;                               
        TIM2->CR1|=0x01;    //ê1&#196;ü&#182;¨ê±&#198;÷2
  MY_NVIC_Init(1,3,TIM2_IRQn,2);//&#199;à&#213;&#188;1£&#172;×óó&#197;&#207;è&#188;&#182;3£&#172;×é2                                                                         
}

void TIM3_PWM_Init(u16 arr,u16 psc)
{                                                          
        RCC->APB1ENR|=1<<1;         //TIM3ê±&#214;óê1&#196;ü
        RCC->APB2ENR|=1<<2;            //ê1&#196;üPORTAê±&#214;ó            
        RCC->APB2ENR|=1<<3;            //ê1&#196;üPORTBê±&#214;ó       
        RCC->APB2ENR|=1<<4;       //ê1&#196;üPORTCê±&#214;ó       
       
       
        GPIOC->CRH&=0XFFFFFFF0;//PC8&#199;&#229;á&#227;       
        GPIOC->CRH|=0X0000000B;// &#184;′&#206;&#187;1|&#196;üê&#228;3&#246;
         

  RCC->APB2ENR|=1<<0;     //  
  AFIO->MAPR&=0XFFFFF3FF; //
  AFIO->MAPR|=3<<10;            
          

        TIM3->ARR=arr;                        //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
        TIM3->PSC=psc;                        //&#212;¤·&#214;&#198;μ&#198;÷2&#187;·&#214;&#198;μ


           
        TIM3->CCMR2|=7<<4;          //CH3 PWM2&#196;£ê&#189;                 
        TIM3->CCMR2|=1<<3;             //CH3&#212;¤×°&#212;&#216;ê1&#196;ü          
        TIM3->CCER|=1<<8;           //OC3 ê&#228;3&#246;ê1&#196;ü
   

               
        TIM3->CCR3=1028;               //OC3 ê&#228;3&#246;ê1&#196;ü

        TIM3->CR1|=1<<7;               //ARPEê1&#196;ü
        TIM3->CR1|=0x01;            //ê1&#196;ü&#182;¨ê±&#198;÷3
  MY_NVIC_Init(1,2,TIM3_IRQn,2);       
}           

void TIM4_PWM_Init(u16 arr,u16 psc)
{                                                          
        //′&#203;2&#191;·&#214;Dèê&#214;&#182;ˉDT&#184;&#196;IO&#191;úéè&#214;&#195;
        RCC->APB1ENR|=1<<2;         //TIM4ê±&#214;óê1&#196;ü  
  RCC->APB2ENR|=1<<2;            //ê1&#196;üPORTAê±&#214;ó          
        GPIOA->CRH&=0XFFFFFFF0;        //PA8&#199;&#229;3y&#214;&#174;&#199;°μ&#196;éè&#214;&#195;
        GPIOA->CRH|=0X0000000B;        //&#184;′ó&#195;1|&#196;üê&#228;3&#246;
       
        TIM1->ARR=arr;                        //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
        TIM1->PSC=psc;                        //&#212;¤·&#214;&#198;μ&#198;÷éè&#214;&#195;
  
        TIM1->CCMR1|=7<<4;          //CH1 PWM2&#196;£ê&#189;                 
        TIM1->CCMR1|=1<<3;                 //CH1&#212;¤×°&#212;&#216;ê1&#196;ü         
        TIM1->CCER|=1<<0;           //OC1 ê&#228;3&#246;ê1&#196;ü          
        TIM1->BDTR|=1<<15;           //MOE &#214;÷ê&#228;3&#246;ê1&#196;ü          

        TIM1->CR1=0x0080;           //ARPEê1&#196;ü
        TIM1->CR1|=0x01;            //ê1&#196;ü&#182;¨ê±&#198;÷1
  MY_NVIC_Init(1,1,TIM4_IRQn,2);       
}  









[/mw_shl_code]
[mw_shl_code=c,true]#include "sys.h"               
#include "delay.h"       
#include "timer.h"
#include "usart.h"       
u8 flog;       

int main(void)
{                                                                                  
        Stm32_Clock_Init(9);        //&#207;μí3ê±&#214;óéè&#214;&#195;
        delay_init(72);                            //&#209;óê±3&#245;ê&#188;&#187;ˉ
        uart_init(72,9600);  //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ
       
        TIM2_Int_Init(100,71);//í¨ó&#195;&#182;¨ê±&#198;÷&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ
        if(flog){
                TIM3_PWM_Init(3199,0);        //5KHz       
        }
        else{
                TIM4_PWM_Init(2285,0);//7KHz
        }
         
        while(1);
}
[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

想起来了是中断优先级没有设置好 设置好了就可以了 提示和我一样的新手们 要设置 MY_NVIC_Init(1,1,TIM4_IRQn,2); 括号内 第一位 主优先级 第二位是 次优先级 第三个是 准备设置的中断服务名称 第四位是 分组 组二 是两位抢占位 两位响应位(通俗来说就是 你括号内的第一位和第二位的范围(例如组二就是 主0~3 次0~3))再补充一句就是一个程序只能是同一个组!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-24
在线时间
8 小时
 楼主| 发表于 2016-3-25 14:26:23 | 显示全部楼层
hcy33fond 发表于 2016-3-27 20:47
改善了 我也不知道为什么  可能是IO口配置出了错误  
我再仔细分析一下

想起来了是中断优先级没有设置好  设置好了就可以了  提示和我一样的新手们 要设置
MY_NVIC_Init(1,1,TIM4_IRQn,2);
括号内 第一位 主优先级 第二位是 次优先级  第三个是 准备设置的中断服务名称  第四位是 分组 组二 是两位抢占位 两位响应位(通俗来说就是 你括号内的第一位和第二位的范围(例如组二就是 主0~3 次0~3))再补充一句就是一个程序只能是同一个组!
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-24
在线时间
8 小时
 楼主| 发表于 2016-3-25 14:29:49 | 显示全部楼层
[mw_shl_code=c,true]void TIM4_PWM_Init(u16 arr,u16 psc)
{                                                          
        //′&#203;2&#191;·&#214;Dèê&#214;&#182;ˉDT&#184;&#196;IO&#191;úéè&#214;&#195;
        RCC->APB1ENR|=1<<2;         //TIM4ê±&#214;óê1&#196;ü  
  RCC->APB2ENR|=1<<2;            //ê1&#196;üPORTAê±&#214;ó          
        GPIOA->CRH&=0XFFFFFFF0;        //PA8&#199;&#229;3y&#214;&#174;&#199;°μ&#196;éè&#214;&#195;
        GPIOA->CRH|=0X0000000B;        //&#184;′ó&#195;1|&#196;üê&#228;3&#246;
       
        TIM4->ARR=arr;                        //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
        TIM4->PSC=psc;                        //&#212;¤·&#214;&#198;μ&#198;÷éè&#214;&#195;
  
        TIM4->CCMR1|=7<<4;          //CH1 PWM2&#196;£ê&#189;                 
        TIM4->CCMR1|=1<<3;                 //CH1&#212;¤×°&#212;&#216;ê1&#196;ü         
        TIM4->CCER|=1<<0;           //OC1 ê&#228;3&#246;ê1&#196;ü             

        TIM4->CR1=0x0080;           //ARPEê1&#196;ü
        TIM4->CR1|=0x01;            //ê1&#196;ü&#182;¨ê±&#198;÷1
  MY_NVIC_Init(1,1,TIM4_IRQn,2);       
}  
[/mw_shl_code]  之前的忘记更改了 修改一下 还是不知道 新手求学路
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2016-3-25 14:30:30 | 显示全部楼层
用一个定时器就可以输出多路PWM了
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-24
在线时间
8 小时
 楼主| 发表于 2016-3-25 14:33:32 | 显示全部楼层
Electronic 发表于 2016-3-25 14:30
用一个定时器就可以输出多路PWM了

我需要输出两个不同频率的PWM 所以为了不麻烦所以用两个定时器
回复

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4036
金钱
4036
注册时间
2015-11-14
在线时间
545 小时
发表于 2016-3-26 16:05:59 | 显示全部楼层
hcy33fond 发表于 2016-3-25 14:33
我需要输出两个不同频率的PWM 所以为了不麻烦所以用两个定时器

可以的啊
我以前就用过6路
回复

使用道具 举报

6

主题

16

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-24
在线时间
8 小时
 楼主| 发表于 2016-3-27 20:47:20 | 显示全部楼层
Electronic 发表于 2016-3-26 16:05
可以的啊
我以前就用过6路

改善了 我也不知道为什么  可能是IO口配置出了错误  
我再仔细分析一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 16:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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