你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 8505|回复: 6

STM8:TIM1,难道寄存器TIM1->CCR,高位不变,低位变化就会COMPARE出错? 【悬赏问答】

[复制链接]

2

主题

4

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-18
发表于 2012-11-7 17:07:38 | 显示全部楼层 |阅读模式
初始化:
void TIM1_Init(void)
{
 TIM1_DeInit();
 TIM1_TimeBaseInit(7,TIM1_COUNTERMODE_UP,65535,0);
 TIM1_PrescalerConfig(7,TIM1_PSCRELOADMODE_IMMEDIATE);
 TIM1_ClearITPendingBit(TIM1_IT_UPDATE); 
 
 TIM1_OC1Init(TIM1_OCMODE_TIMING, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 1000, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET, TIM1_OCNIDLESTATE_SET); 
 TIM1_OC1PreloadConfig(DISABLE); 

 TIM1_ITConfig(TIM1_IT_CC1,ENABLE);
 
 TIM1_Cmd(ENABLE);
}
 
比较中断函数:
#ifdef _COSMIC_
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
#else /* _RAISONANCE_ */
void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void) interrupt 11
#endif /* _COSMIC_ */
{
 capture_data=TIM1_GetCounter();
 
 if(TIM1_GetITStatus(TIM1_IT_CC1))
 {
  TIM1_SetCompare1((capture_data+256));  // TIM1_SetCompare1((capture_data+255));
  TIM1_ClearITPendingBit(TIM1_IT_CC1);//RESET_CCR1_INT_FLAG;
  
  LED_XOR;
 }
}
经测试,中断函数中  TIM1_SetCompare1((capture_data+256));正确; TIM1_SetCompare1((capture_data+255));错误!
调用的结果是不一样的。也就是TIM1->CCR1H有可能不变的前提下,程序就会出问题了。不知道大家是否遇到如此奇怪现象!
<
回复

使用道具 举报

24

主题

591

回帖

0

蝴蝶豆

中级会员

最后登录
2020-12-2
发表于 2012-11-7 20:45:58 | 显示全部楼层

RE:STM8:TIM1,难道寄存器TIM1->CCR,高位不变,低位变化就会COMPARE出错? 【悬赏问答】

CCR1[15:8]: 捕获/比较1的高8位值
若CC1通道配置为输出(TIM1_CCMR1的CC1S位):
CCR1包含了装入当前捕获/比较1寄存器的值(预装载值)。
如果在TIM1_CCMR1寄存器(OC1PE位)中未选择预装载功能,写入的数值会立即传输至当前寄存器中。否则只有当更新事件发生时,此预装载值才传输至当前捕获/比较1寄存器中。
当前捕获/比较寄存器的值同计数器TIM1_CNT的值相比较,并在OC1端口上产生输出信号。
若CC1通道配置为输入:
CCR1包含了上一次输入捕获1事件(IC1)发生时的计数器值(此时该寄存器为只读)。
回复 支持 反对

使用道具 举报

2

主题

4

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-18
 楼主| 发表于 2012-11-8 09:12:35 | 显示全部楼层

RE:STM8:TIM1,难道寄存器TIM1->CCR,高位不变,低位变化就会COMPARE出错? 【悬赏问答】

我的配置使用的是Output compare mode ,用来定时用的,代表一定的时间到来。 我要得就是能随时更新CCR1里面的数值,以达到任意定时的效果——TIM1_OC1PreloadConfig(DISABLE);就是未选择预装载功能,每次MATCH的时候,先把COUNTER读出来,加上所需要的延时时间,写入CCR1中去,使得下次能够再MATH,以达到我所要求的定时时间,问题就是写入CCR1值的时候,当高位不变,仅低位变就存在写错的问题——这里我是通过LED灯的变化测试出来的,程序我无法确切定位。如我的时基是1US,我定时256US(100H),高位变了,就OK,如果定时小于等于255(FFH),则出错!

我的问题你明白了吗?
回复 支持 反对

使用道具 举报

2

主题

4

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-18
 楼主| 发表于 2012-11-8 09:22:47 | 显示全部楼层

回复:STM8:TIM1,难道寄存器TIM1->CCR,高位不变,低位变化就会COMPARE出错? 【悬赏问答】

楼上的,我不太明白你得意思,我把我的问题重新阐述一下:

&lt;span style=&quot;font-size: medium&quot;&gt;我的配置,可以看出来用的是OUTPUT COMPARE MODE,其实起了一个定时作用,用CCR1里的值和COUNTER进行MATCH,我用TIM1_OC1PreloadConfig(DISABLE);就是想直接更改CCR1的数值,在每次MATCH中断 的时候,读COUNTER的数值,写入CCR1的新数值,写入的数值没能使高位TIM1-&gt;CCR1H发生变化,就出问题了——当然程序无法确切定位,只能通过LED灯用示波器测试来判断,如写入100H,CCR1H变化了,就OK,写入
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2012-11-8 09:56:34 | 显示全部楼层

RE:STM8:TIM1,难道寄存器TIM1->CCR,高位不变,低位变化就会COMPARE出错? 【悬赏问答】

只有当更新事件发生时,此预装载值才传输至当前捕获/比较1寄存器中。
回复 支持 反对

使用道具 举报

25

主题

446

回帖

0

蝴蝶豆

中级会员

最后登录
2019-12-10
发表于 2012-11-8 12:35:43 | 显示全部楼层

回复:STM8:TIM1,难道寄存器TIM1->CCR,高位不变,低位变化就会COMPARE出错? 【悬赏问答】

你写入数值后用软件设置更新事件试试看
回复 支持 反对

使用道具 举报

8

主题

206

回帖

0

蝴蝶豆

中级会员

最后登录
2019-10-23
发表于 2012-11-11 23:35:17 | 显示全部楼层

RE:STM8:TIM1,难道寄存器TIM1->CCR,高位不变,低位变化就会COMPARE出错? 【悬赏问答】

会不会跟你这个函数有关系呢?
TIM1_SetCompare1((capture_data+256));  
你把这个函数也贴出来看看
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版