6475|10

25

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm32f103 TIM3 UG位更新 [复制链接]

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;
}
}
此帖出自stm32/stm8论坛

最新回复

影子到通道值的更新不需要up中断,你可以写个程序大循环中连续用CNT更新通道值,结果只有一个(是第一个呢还是最后一个呢?),这样就验证了.  详情 回复 发表于 2013-4-29 02:06

点评

亲,这么多寄存器你能操作过来啊!果断用库吧!必然趋势!:)  详情 回复 发表于 2013-4-28 14:22
影子寄存器你是看不到的  详情 回复 发表于 2013-4-26 17:48
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
TIM_ClearFlag(TIM3,TIM_FLAG_Update);这句不对,要清除的是cc1的标记
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 

回复 楼主 lhwaizhu 的帖子

影子寄存器你是看不到的
此帖出自stm32/stm8论坛
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

4
 
这个不是影子寄存器吗?可是每次我进中断CNT的值几乎一样,说明CCR1没有更新到影子寄存器中啊

未命名.JPG

104.3 KB, 下载次数: 6

此帖出自stm32/stm8论坛

点评

你的理解有点偏差,CCR1是通道值他的改变影响占空比,影子寄存器是一个后台寄存器,看不到,只在开启了预装载时起作用,它实际上只起一个缓冲的作用.开启预装载后通道值写入新数值后pwm并不马上起作用,这是为了防止出现意  详情 回复 发表于 2013-4-28 16:09
 
 
 

回复

1149

帖子

3

TA的资源

五彩晶圆(初级)

5
 

回复 楼主 lhwaizhu 的帖子

亲,这么多寄存器你能操作过来啊!果断用库吧!必然趋势!
此帖出自stm32/stm8论坛

点评

用的是库函数啊  详情 回复 发表于 2013-4-28 16:19
 
 
 

回复

4008

帖子

0

TA的资源

版主

6
 

回复 4楼 lhwaizhu 的帖子

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

点评

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

回复

4008

帖子

0

TA的资源

版主

7
 
开启预装载,直接写通道值,别的都是硬件完成的你不需要管它.
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

8
 

回复 5楼 zqjqq88 的帖子

用的是库函数啊
此帖出自stm32/stm8论坛

点评

看错了!悲剧:faint: ,建议楼主编辑下吧,这样看好累哦!用添加代码的形式贴进来!  详情 回复 发表于 2013-4-28 16:30
 
 
 

回复

1149

帖子

3

TA的资源

五彩晶圆(初级)

9
 

回复 8楼 huo_hu 的帖子

看错了!悲剧 ,建议楼主编辑下吧,这样看好累哦!用添加代码的形式贴进来!
此帖出自stm32/stm8论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 6楼 huo_hu 的帖子

您好,我现在有点钻牛角尖了,我是想在使能预装载的情况下,看看软件置位UG到底能不能更新影子寄存器...有点乱了...
此帖出自stm32/stm8论坛

点评

影子到通道值的更新不需要up中断,你可以写个程序大循环中连续用CNT更新通道值,结果只有一个(是第一个呢还是最后一个呢?),这样就验证了.  详情 回复 发表于 2013-4-29 02:06
 
 
 

回复

4008

帖子

0

TA的资源

版主

11
 

回复 10楼 lhwaizhu 的帖子

影子到通道值的更新不需要up中断,你可以写个程序大循环中连续用CNT更新通道值,结果只有一个(是第一个呢还是最后一个呢?),这样就验证了.
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表