打印

为什么我发的贴没人回答呢?正陷入在 用定时器1 实现匹配中断的 溢出中断

[复制链接]
1838|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子好学者|  楼主 | 2013-3-19 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助啊   
沙发
电子好学者|  楼主 | 2013-3-19 16:37 | 只看该作者
我是想写  我设置的是 1ms 溢出中断     71+1分频 arr值为1000    那么 我要实现的是    我通道1 和通道2  输出两路pwm波  比如占空比为 500   百分之五十   那么 我通道的4 的占空比就为 250  也就是百分之二十五   那么我设置的是  cnt值为250 时 就会和通道4  ccr4 值匹配  (TIM1->DIER|=1<<4;   //允许触发中断                    MY_NVIC_Init(0,2,TIM1_CC_IRQChannel,2);//抢占0,子优先级2,组2   )中断   然后再 1ms到时   (                       TIM1->DIER|=1<<0;   //允许更新中              TIM1->DIER|=1<<6;   //允许触发中断
  MY_NVIC_Init(0,1,TIM1_UP_IRQChannel,2);//抢占0,子优先级2,组2) 溢出中断  我程序是这样设置的

使用特权

评论回复
板凳
电子好学者|  楼主 | 2013-3-19 16:38 | 只看该作者
//此部分需手动修改IO口设置
        RCC->APB2ENR|=1<<0;       //开启辅助时钟
        RCC->APB2ENR|=1<<11;
//        RCC->APB1ENR|=1<<2;       //TIM4时钟使能   
        AFIO->MAPR=3<<6;                  //TIM1完全映射
    RCC->APB2ENR|=1<<6;    //使能PORTe时钟         
        GPIOE->CRH&=0XF00F0F0F;//PE11 PE13  PE9 PE14输出
    GPIOE->CRH|=0X0BB0B0B0;//复用输出
           GPIOE->ODR|=1<<9;//PE9上拉       
        GPIOE->ODR|=1<<11;//PD13上拉
        GPIOE->ODR|=1<<13;//PD14上拉
    GPIOE->ODR|=1<<14;//PD11上拉
        TIM1->ARR=arr;//设定计数器自动重装值
        TIM1->PSC=psc;//预分频器不分频
        TIM1->CCMR1|=6<<12;  //CH2 PWM2模式                 
        TIM1->CCMR1|=1<<11; //CH2预装载使能          
    TIM1->CCMR1|=6<<4;  //CH1 PWM2模式       
        TIM1->CCMR1|=1<<3;        //CH1预装载使能
        TIM1->CCMR2|=6<<12;  //CH4 PWM2模式       
        TIM1->CCMR2|=1<<11;  //CH4
    TIM1->CCMR2|=6<<4;  //CH3 PWM2模式       
        TIM1->CCMR2|=1<<3;  //CH3 PWM2模式       
        TIM1->CCER|=1<<4;   //OC2 输出使能 开关位          
        TIM1->CCER|=1<<0;   //OC1 输出使能 开关位
        TIM1->CCER|=1<<8;   //OC3 输出使能 开关位
    TIM1->CCER|=1<<12;  //OC4 输出使能 开关位
        TIM1->BDTR|=1<<15;        // 主输出使能
        TIM1->CR1|=1<<7;   //ARPE使能
    TIM1->DIER|=1<<0;   //允许更新中断                               
        TIM1->DIER|=1<<6;   //允许触发中断                  
        TIM1->DIER|=1<<4;   //允许触发中断
        MY_NVIC_Init(0,1,TIM1_UP_IRQChannel,2);//抢占0,子优先级2,组2       
        MY_NVIC_Init(0,2,TIM1_CC_IRQChannel,2);//抢占0,子优先级2,组2
        PWM0_VAL=500;                                                                //设置PWM位为10khz 占空比50%
        PWM1_VAL=500;
        PWM2_VAL=250;
        PWM3_VAL=250;

使用特权

评论回复
地板
王紫豪| | 2013-3-19 17:04 | 只看该作者
真心看不懂

使用特权

评论回复
5
金融小数| | 2013-3-19 18:13 | 只看该作者
先把问题写清楚

使用特权

评论回复
6
电子好学者|  楼主 | 2013-3-19 20:02 | 只看该作者
金融小数 发表于 2013-3-19 18:13
先把问题写清楚

我是想写:我设置的是 1ms 溢出中断,71+1分频 arr值为1000,就为1ms计时。    那么, 我要实现的是 :我通道1和通道2输出两路pwm波,比如占空比为 500,就是百分之五十,通道的4 的占空比就为250,也就是百分之二十五,当cnt值为250 时,就会和通道4的CCR4值匹配(TIM1->DIER|=1<<4;   //允许触发中断                    MY_NVIC_Init(0,2,TIM1_CC_IRQChannel,2);//抢占0,子优先级2,组2   ),产生匹配中断,此时CNT的值还是250开始计到1000,然后产生1ms(                   TIM1->DIER|=1<<0;   //允许更新中
TIM1->DIER|=1<<6;   //允许触发中断
MY_NVIC_Init(0,1,TIM1_UP_IRQChannel,2);//抢占0,子优先级2,组2) 溢出中断,进入溢出中断子程序吗?

使用特权

评论回复
7
电子好学者|  楼主 | 2013-3-19 20:03 | 只看该作者
金融小数 发表于 2013-3-19 18:13
先把问题写清楚

进入匹配中断  CNT 的值会被清零吗?  还是会保留和CCRx  匹配时候的值

使用特权

评论回复
8
金融小数| | 2013-3-19 20:19 | 只看该作者
进入匹配中断,CNT 的值不会被清零,CNT会继续计数,直到CNT到达1000,产生溢出中断,同时CNT被清0。

使用特权

评论回复
9
hawksabre| | 2013-3-19 20:54 | 只看该作者
楼主   问题解决了吗   应该问题不大吧  呵呵1

使用特权

评论回复
10
电子好学者|  楼主 | 2013-3-19 21:07 | 只看该作者
金融小数 发表于 2013-3-19 20:19
进入匹配中断,CNT 的值不会被清零,CNT会继续计数,直到CNT到达1000,产生溢出中断,同时CNT被清0。 ...

那我这样 设置对吗?

TIM1->DIER|=1<<4;   //允许触发中断
MY_NVIC_Init(0,2,TIM1_CC_IRQChannel,2);//抢占0,子优先级2,组2、

还有 溢出中断后 进入中断子程序  那么CNT 在处理中断子程序时   CNT 有在计数吗? 我软件仿真时看 CNT值 在走

使用特权

评论回复
11
电子好学者|  楼主 | 2013-3-19 21:08 | 只看该作者
hawksabre 发表于 2013-3-19 20:54
楼主   问题解决了吗   应该问题不大吧  呵呵1

加你qq下 可不可以啊  

使用特权

评论回复
12
bbsdianzi168| | 2013-3-19 21:38 | 只看该作者
我也看不懂。但是回复一下。表示我还理你 :lol

使用特权

评论回复
13
电子好学者|  楼主 | 2013-3-19 21:59 | 只看该作者
bbsdianzi168 发表于 2013-3-19 21:38
我也看不懂。但是回复一下。表示我还理你

谢谢啊!  谢谢 支持 。。。。。。。。。。。。。。

使用特权

评论回复
14
金融小数| | 2013-3-19 22:07 | 只看该作者
电子好学者 发表于 2013-3-19 21:07
那我这样 设置对吗?

TIM1->DIER|=1

不对,你可以看看STM32的软件库里面的例程

使用特权

评论回复
15
beanandpeach| | 2013-3-20 08:37 | 只看该作者
帮你顶一下,虽然我不懂

使用特权

评论回复
16
elec921| | 2013-3-20 12:49 | 只看该作者
这样贴代码的没法回答啊

使用特权

评论回复
17
电子好学者|  楼主 | 2013-3-20 12:50 | 只看该作者
金融小数 发表于 2013-3-19 22:07
不对,你可以看看STM32的软件库里面的例程

哪 找  论坛里面都搜不到  

使用特权

评论回复
18
电子好学者|  楼主 | 2013-3-20 14:17 | 只看该作者
金融小数 发表于 2013-3-19 22:07
不对,你可以看看STM32的软件库里面的例程

使能计数比较匹配功能,当计数至40000时,发生计数比较匹配事件,并因为开启了通道1匹配中断,此计数比较匹配事件将请求计数匹配中断,执行计数比较匹配中断服务程序

执行计数比较匹配中断服务程序,更新通道1更新匹配比较计数值为 “当前计数值+匹配比较计数递增值”为40000+40000=80000; 但定时器最大计数值仅为65535,则此处实际上更新比较匹配值为80000-65535=14465.

清除中断标志,中断返回,计数值继续从40000处向上计数值65535,再下一次计数时将发生一个计数值向上溢出事件(该事件会导致计数值重装载),但因为禁止了预装载寄存器,因此不会发生寄存器重装载) 计数值回归零 重新向上计数


计数至14465 再次发生匹配事件 一次循环


那个匹配值 怎么会变成 40000+40000  然后下一次匹配为14465  ????这是怎么回事

使用特权

评论回复
19
电子好学者|  楼主 | 2013-3-20 14:18 | 只看该作者
beanandpeach 发表于 2013-3-20 08:37
帮你顶一下,虽然我不懂

使能计数比较匹配功能,当计数至40000时,发生计数比较匹配事件,并因为开启了通道1匹配中断,此计数比较匹配事件将请求计数匹配中断,执行计数比较匹配中断服务程序

执行计数比较匹配中断服务程序,更新通道1更新匹配比较计数值为 “当前计数值+匹配比较计数递增值”为40000+40000=80000; 但定时器最大计数值仅为65535,则此处实际上更新比较匹配值为80000-65535=14465.

清除中断标志,中断返回,计数值继续从40000处向上计数值65535,再下一次计数时将发生一个计数值向上溢出事件(该事件会导致计数值重装载),但因为禁止了预装载寄存器,因此不会发生寄存器重装载) 计数值回归零 重新向上计数


计数至14465 再次发生匹配事件 一次循环

可以帮我解释下   匹配值 在下一次匹配 会变成14465?呢?

使用特权

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

本版积分规则

34

主题

119

帖子

1

粉丝