打印

F4 的一个有趣现象

[复制链接]
2111|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种写法。

使用特权

评论回复
5
香水城| | 2012-7-24 14:54 | 只看该作者
挺有意思

暂时想到的差别就是 TIM2->CCR1是一个volatile而TT只是一个u16

使用特权

评论回复
6
damiaa| | 2012-7-24 15:03 | 只看该作者
是啊。是个硬件寄存器。不是内存和通用寄存器啊。也许也许。

使用特权

评论回复
7
lllaaa| | 2012-7-24 16:46 | 只看该作者
打个岔

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


TIM2->CCR1+= 8400;
难道不用考虑溢出

使用特权

评论回复
8
huangxz| | 2012-7-25 20:38 | 只看该作者
看看汇编代码最好,可以看到有任何细微的差别。

使用特权

评论回复
9
seawwh|  楼主 | 2012-7-26 12:02 | 只看该作者
4# IJK

我在IAR 6.3环境下编译下面的语句并没有出现warning 。
    TIM2->CCR1 += 8400;

使用特权

评论回复
10
seawwh|  楼主 | 2012-7-27 12:22 | 只看该作者
问题已经找到,关键是TIM2是一个32位定时器,如果按照32位来编程就不会有问题。
在初始化TIM2的时候,应该这样写:
TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; // 如果是 0xFFFF 后面的代码需要注意。

遗憾的是ST提供的手册(RM0090)中,对TIM2 的描述为16位,导致了问题的发生。也许这一部分拷贝自F103,忘了做修改。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

368

帖子

0

粉丝