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

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

[复制链接]
美年达 提问时间:2012-11-7 17:07 /
初始化:
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有可能不变的前提下,程序就会出问题了。不知道大家是否遇到如此奇怪现象!
收藏 评论6 发布时间:2012-11-7 17:07

举报

6个回答
zykzyk-93033 回答时间: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)发生时的计数器值(此时该寄存器为只读)。
美年达 回答时间: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),则出错!

我的问题你明白了吗?
美年达 回答时间:2012-11-8 09:22:47

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

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

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

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

只有当更新事件发生时,此预装载值才传输至当前捕获/比较1寄存器中。
xiaodc88 回答时间:2012-11-8 12:35:43

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

你写入数值后用软件设置更新事件试试看
xieyuanfu 回答时间:2012-11-11 23:35:17

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

会不会跟你这个函数有关系呢?
TIM1_SetCompare1((capture_data+256));  
你把这个函数也贴出来看看
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版