F4 的一个有趣现象

[复制链接]
2858|9
 楼主| seawwh 发表于 2012-7-20 17:26 | 显示全部楼层 |阅读模式
近日使用F4发现一个有趣现象,一个十分简单的语句(在F1中已经通过的)计算结果不对。

这是一个利用TIM2做1ms定时中断的代码:

void TIM2_IRQHandler(void) {
  if (TIM2->SR & TIM_IT_CC1) {
    TIM2->SR = ~TIM_IT_CC1;  
    TIM2->CCR1+= 8400;  //8.4MHz   1ms
  }
}

改为下面的代码就Ok了

void TIM2_IRQHandler(void) {
u16  TT = 0;
  if (TIM2->SR & TIM_IT_CC1) {
    TIM2->SR = ~TIM_IT_CC1;  
    TT = TIM2->CCR1;
    TIM2->CCR1= TT + 8400;  //8.4MHz   1ms
  }
}

优化:Medium

读了一下反汇编看不出什么问题。
figo20042005 发表于 2012-7-20 20:52 | 显示全部楼层
这个就不知道为什么了
wangzhihai1986 发表于 2012-7-24 09:04 | 显示全部楼层
1和4是有些差别的,寄存器和时钟都有可能不一样。
IJK 发表于 2012-7-24 13:48 | 显示全部楼层
这个情况似乎有点意思。
按理如果生成的汇编相同,虽然芯片不同但估计在TIM2的这个功能细节方面应该没有区别。
最后,在IAR EWARM里面第1种写法有warning,所以我都用第2种写法。
香水城 发表于 2012-7-24 14:54 | 显示全部楼层
挺有意思

暂时想到的差别就是 TIM2->CCR1是一个volatile而TT只是一个u16
damiaa 发表于 2012-7-24 15:03 | 显示全部楼层
是啊。是个硬件寄存器。不是内存和通用寄存器啊。也许也许。
lllaaa 发表于 2012-7-24 16:46 | 显示全部楼层
打个岔

TIM2->SR = ~TIM_IT_CC1;
难道不应该是
TIM2->SR &= ~TIM_IT_CC1;


TIM2->CCR1+= 8400;
难道不用考虑溢出
huangxz 发表于 2012-7-25 20:38 | 显示全部楼层
看看汇编代码最好,可以看到有任何细微的差别。
 楼主| seawwh 发表于 2012-7-26 12:02 | 显示全部楼层
4# IJK

我在IAR 6.3环境下编译下面的语句并没有出现warning 。
    TIM2->CCR1 += 8400;
 楼主| seawwh 发表于 2012-7-27 12:22 | 显示全部楼层
问题已经找到,关键是TIM2是一个32位定时器,如果按照32位来编程就不会有问题。
在初始化TIM2的时候,应该这样写:
TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; // 如果是 0xFFFF 后面的代码需要注意。

遗憾的是ST提供的手册(RM0090)中,对TIM2 的描述为16位,导致了问题的发生。也许这一部分拷贝自F103,忘了做修改。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

368

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部