打印

stm32f103 TIM3 UG位更新

[复制链接]
3461|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lhwaizhu|  楼主 | 2013-4-26 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32 TIM3 工作于PWM1,向上计数,我想在匹配中断函数里更改CCR1的值,然后再软件设置UG位产生更新,将CCR1的值更新到影子寄存器,但是现在发现更新不到影子寄存器,请教下什么原因:

void   TM3_PWM_Config(void)
{
TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
TIM_OCInitTypeDef          TIM_OCInitStructure;  //比较捕获模式初始化
//基本的初始化
TIM_TimeBaseStructure.TIM_Prescaler=0;  //PSC预分频 不分频72MHZ
TIM_TimeBaseStructure.TIM_Period=900;  //自动重载寄存器 0到999 1000次一个周期
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;  //向上计数模式
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1 ; //不分频 见TIMx_CR1寄存器位9 位8
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1 ;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=CCR1_Val;  //设定比较值
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;         
TIM_OC1Init(TIM3,&TIM_OCInitStructure);  //初始化了通道1
    TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);  //使能匹配中断
//使能TM3重载寄存器ARR
TIM_ARRPreloadConfig(TIM3,ENABLE);
//使能TM3
TIM_Cmd(TIM3,ENABLE);
}

void  TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_CC1)==SET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);  //软件清0
CCR1_Val++;
TIM_SetCompare1(TIM3,CCR1_Val);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_GenerateEvent(TIM3,TIM_EventSource_Update);
if(CCR1_Val==998)
CCR1_Val=500;
}
}
沙发
dream_yi| | 2013-4-26 18:06 | 只看该作者
TIMx更新事件好像没使能啊

使用特权

评论回复
板凳
lhwaizhu|  楼主 | 2013-4-26 18:21 | 只看该作者
dream_yi 发表于 2013-4-26 18:06
TIMx更新事件好像没使能啊

能不能说一下,看不到啊...

使用特权

评论回复
地板
dream_yi| | 2013-4-26 18:55 | 只看该作者
参考手册P.256

使用特权

评论回复
5
hawksabre| | 2013-4-26 19:03 | 只看该作者
应该是楼上说的那个问题   仔细查一查技术手册   应该可以找到答案

使用特权

评论回复
6
lhwaizhu|  楼主 | 2013-4-26 19:41 | 只看该作者
dream_yi 发表于 2013-4-26 18:55
参考手册P.256

更新默认就是使能的吧

使用特权

评论回复
7
dream_yi| | 2013-4-27 12:29 | 只看该作者
TIM1_UpdateDisableConfig();加上这个函数看看。

使用特权

评论回复
8
lhwaizhu|  楼主 | 2013-4-27 18:02 | 只看该作者
dream_yi 发表于 2013-4-27 12:29
TIM1_UpdateDisableConfig();加上这个函数看看。

不行啊,还是不行,但是我发现软件置位了UG位,计数器CNT清零了,说明确实产生更新了啊,难道这个更新不能使CCR1影子寄存器更新?

使用特权

评论回复
9
dream_yi| | 2013-4-28 01:29 | 只看该作者
不应该啊,花了一晚上查看了一下原来的帖子,基本可以确定是更新了的。https://bbs.21ic.com/forum.php?mod=viewthread&tid=110636      而且香版主曾经回过一个帖子“ARR和CCR都有预加载寄存器,真正起作用的是其影子寄存器。当预加载寄存器被禁止时,写入ARR或CCR的数值会直接传送到对应的影子寄存器;如果使能预加载寄存器,则写入ARR或CCR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。”现在你的预加载寄存器使能了,UG置位,会加载到影子寄存器的。P.256也有说明:当发生一个更新事件时,所有的寄存器都被更新……“● 自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。”

使用特权

评论回复
10
huangfeng33| | 2014-8-10 18:41 | 只看该作者
这么多寄存器你能操作过来啊!果断用库吧!必然趋势!

使用特权

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

本版积分规则

24

主题

79

帖子

2

粉丝