打印

求助!STM32定时器中的周期计数寄存器的用法

[复制链接]
4115|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YUCHUN0607|  楼主 | 2012-2-10 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,
我想让定时器在PWM的n个周期后才中断一次,该怎么设置?
所以我想到用周期计数器寄存器来实现,不知道可不可以?
沙发
YUCHUN0607|  楼主 | 2012-2-10 15:02 | 只看该作者
在线等

使用特权

评论回复
板凳
香水城| | 2012-2-10 15:35 | 只看该作者
可以。

用法很简单,只要初始化时,配置分量TIM_TimeBaseStructure.TIM_RepetitionCounter即可。

使用特权

评论回复
地板
YUCHUN0607|  楼主 | 2012-2-10 16:27 | 只看该作者
我也是这样,但还是每次定时器上溢就中断,
设置时有什么要注意的地方吗?

使用特权

评论回复
5
香水城| | 2012-2-10 17:09 | 只看该作者
我没有具体做过,提不出具体意见。

你可以参考固件库中,定时器部分的那个DMA例子里就是使用了Repetition计数器。

使用特权

评论回复
6
无冕之王| | 2012-2-10 17:33 | 只看该作者
肯定可以,参考一下固件库中的例子

使用特权

评论回复
7
YUCHUN0607|  楼主 | 2012-2-10 17:59 | 只看该作者
嗯,我好好看看

使用特权

评论回复
8
YUCHUN0607|  楼主 | 2012-2-13 09:08 | 只看该作者
嗯,可以中断了,和香主说的一样,但是还有个问题,
我把周期计数器设为5,按理应该是6个周期中断一次,但实际是12个周期中断一次;反正是我设置的两倍的周期中断一次,不知道是怎么回事?

使用特权

评论回复
9
香水城| | 2012-2-13 09:51 | 只看该作者
嗯,可以中断了,和香主说的一样,但是还有个问题,
我把周期计数器设为5,按理应该是6个周期中断一次,但实际是12个周期中断一次;反正是我设置的两倍的周期中断一次,不知道是怎么回事? ...
YUCHUN0607 发表于 2012-2-13 09:08


你怎么知道是12个周期中断一次?

使用特权

评论回复
10
YUCHUN0607|  楼主 | 2012-2-13 10:08 | 只看该作者
我用LED指示的啊,
刚才说的这个情况是初始化后第一次中断是两倍,以后的都正常了,非常奇怪

使用特权

评论回复
11
YUCHUN0607|  楼主 | 2012-2-13 10:27 | 只看该作者
我的代码:
void TIM1_init(u16 period, u8 rcnt)//PWM输出
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        TIM_TimeBaseInitStructure.TIM_Prescaler = 8000;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period = period - 1;//150KHz
        TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter = rcnt - 1;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

        TIM_ARRPreloadConfig(TIM1, ENABLE);

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
        TIM_OCInitStructure.TIM_Pulse = period >> 1;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);

        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

//        TIM_GenerateEvent(TIM1, TIM_EventSource_Update);
        TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Regular);
        TIM_ClearFlag(TIM1, TIM_IT_Update);
        TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
        TIM_Cmd(TIM1, ENABLE);       
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

使用特权

评论回复
12
YUCHUN0607|  楼主 | 2012-2-13 10:38 | 只看该作者
找到原因了,把这句屏蔽掉就对了TIM_ClearFlag(TIM1, TIM_IT_Update);
可是为什么呢?香主解释下

使用特权

评论回复
13
香水城| | 2012-2-13 10:56 | 只看该作者
找到原因了,把这句屏蔽掉就对了TIM_ClearFlag(TIM1, TIM_IT_Update);
可是为什么呢?香主解释下
YUCHUN0607 发表于 2012-2-13 10:38


我不知道为什么。

你可以在中断中看看是什么引起的中断,然后再顺藤摸瓜。

使用特权

评论回复
14
1989despair| | 2013-12-16 15:58 | 只看该作者
求助一个问题,我想知道有观测自动重装载寄存器周期的值的变化的寄存器吗?也就是想知道某一时刻我想知道设置的向下计数的递减的值是多少?能帮忙解答一下吗?还有就是我在固件库手册中没找到这个函数TIM_TimeBaseStructure.TIM_RepetitionCounter

使用特权

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

本版积分规则

8

主题

54

帖子

0

粉丝