[求助] stm32f103 TIM3 UG位更新

lhwaizhu   2013-4-26 16:30 楼主
stm32 TIM3 工作于PWM1,向上计数,软件仿真中:中断函数里更改CCR1的值,然后再软件设置UG位产生更新,将CCR1的值更新到影子寄存器,发现CNT清零了,但是为什么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;
}
}

回复评论 (10)

TIM_ClearFlag(TIM3,TIM_FLAG_Update);这句不对,要清除的是cc1的标记
点赞  2013-4-26 17:48

回复 楼主 lhwaizhu 的帖子

影子寄存器你是看不到的
点赞  2013-4-26 17:48
这个不是影子寄存器吗?可是每次我进中断CNT的值几乎一样,说明CCR1没有更新到影子寄存器中啊

    未命名.JPG (2013-4-26 18:20 上传)

    104.3 KB, 下载次数: 6

点赞  2013-4-26 18:20

回复 楼主 lhwaizhu 的帖子

亲,这么多寄存器你能操作过来啊!果断用库吧!必然趋势!
点赞  2013-4-28 14:22

回复 4楼 lhwaizhu 的帖子

你的理解有点偏差,CCR1是通道值他的改变影响占空比,影子寄存器是一个后台寄存器,看不到,只在开启了预装载时起作用,它实际上只起一个缓冲的作用.开启预装载后通道值写入新数值后pwm并不马上起作用,这是为了防止出现意外的逻辑.那么什么时候起作用最合适呢?就是在每个pwm的起始点,此时一定是无效电平这是更新通道值是绝对没问题的.pwm的起始点也就是定时器的回0点.这部分是不需要额外操作的.
UG位的引入是为了在程序中除定时器回零以外的情况要触发更新中断而设立的,你的应用中用不着它.
点赞  2013-4-28 16:09
开启预装载,直接写通道值,别的都是硬件完成的你不需要管它.
点赞  2013-4-28 16:13

回复 5楼 zqjqq88 的帖子

用的是库函数啊
点赞  2013-4-28 16:19

回复 8楼 huo_hu 的帖子

看错了!悲剧 ,建议楼主编辑下吧,这样看好累哦!用添加代码的形式贴进来!
点赞  2013-4-28 16:30

回复 6楼 huo_hu 的帖子

您好,我现在有点钻牛角尖了,我是想在使能预装载的情况下,看看软件置位UG到底能不能更新影子寄存器...有点乱了...
点赞  2013-4-28 21:01

回复 10楼 lhwaizhu 的帖子

影子到通道值的更新不需要up中断,你可以写个程序大循环中连续用CNT更新通道值,结果只有一个(是第一个呢还是最后一个呢?),这样就验证了.
点赞  2013-4-29 02:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复