[STM32F2] 用MDK编译设置的优化等级不同,得到的定时器延时不一样,这是什么原因?

[复制链接]
2415|6
 楼主| YIHAOXIAOYU 发表于 2015-10-21 16:11 | 显示全部楼层 |阅读模式
目前正在使用STM32F205VCT6,开了TIM8定时100ms中断,程序配置如下:
  1. #define TIM8_10Hz_Period  12000//0X1C1F//0X2ee0
  2. #define TIM8_10Hz_Prescaler  999//99//0X03E7

  3. void TIM8_Init(FunctionalState en)
  4. {
  5.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  6.         NVIC_InitTypeDef NVIC_InitStructure;
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, en);        //¶¨Ê±Æ÷8ÌṩʱÖÓ
  8.         NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;
  9.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  10.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
  11.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  12.         NVIC_Init(&NVIC_InitStructure);

  13.         TIM_TimeBaseStructure.TIM_Period = TIM8_10Hz_Period;//TIM8_1KHz_Period;            
  14.         TIM_TimeBaseStructure.TIM_Prescaler = TIM8_10Hz_Prescaler;//TIM8_1KHz_Prescaler;     
  15.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  16.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //¼ÆÊýģʽ
  17.         TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  18.         TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);                                         //ÔÊÐíÖжÏ
  19.         TIM_Cmd(TIM8, en);                                                                               
  20. Tick_1S_flag=0;
  21. }
  22. void TIM8_UP_TIM13_IRQHandler (void)
  23. {
  24.         static UINT16 t21ms;       

  25.         if(TIM_GetITStatus(TIM8,TIM_IT_Update)!=RESET)    //ÅжÏÊÇ·ñΪ¶¨Ê±Æ÷2Òç³öÖжÏ
  26.         {
  27.                 t21ms++;
  28.                 Tick_100MS_flag=1;
  29.                 if(t21ms>=10)//1000
  30.                 {

  31.                         t21ms=0;
  32.                         Tick_1S_flag=1;
  33.                 }
  34.         TIM_ClearFlag(TIM8, TIM_FLAG_Update);                  //ÇåÖжϱê¼Ç
  35.         TIM_ClearITPendingBit(TIM8, TIM_IT_Update);
  36.         }
  37. }

系统时钟配置在120MHz,按上面配置,在不开优化的时候定时是正常的。开到3级优化的时候TIM8_10Hz_Period  要设到4000才差不多满足。请问各位大神这是为什么呢?一直想不通,也没找到相关参考。
 楼主| YIHAOXIAOYU 发表于 2015-10-21 16:49 | 显示全部楼层
有没有人知道
香水城 发表于 2015-10-22 11:51 | 显示全部楼层
如果不改动代码里的初始化参数,建议查看一下优化后和优化前初始化后寄存器的配置是不是一样。
有没有可能一些初始化代码被省掉了,结果造成配置不一样。
 楼主| YIHAOXIAOYU 发表于 2015-10-22 15:51 | 显示全部楼层
香水城 发表于 2015-10-22 11:51
如果不改动代码里的初始化参数,建议查看一下优化后和优化前初始化后寄存器的配置是不是一样。
有没有可能 ...
  1. #ifdef STM32F2XX_MINE   
  2. //#if (HSE_VALUE)==((uint32_t)8000000)
  3. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N //0.95~2M*/
  4. //±£³ÖVCOÔÚ1M ¼´¿É
  5. #define PLL_M      (HSE_VALUE/1000000)
  6. #define PLL_N      240//216//

  7. /* SYSCLK = PLL_VCO / PLL_P */
  8. #define PLL_P     2

  9. /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
  10. #define PLL_Q      5
  11. //#if (HSE_VALUE)==((uint32_t)25000000)
  12. #else
  13. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  14. #define PLL_M      25
  15. #define PLL_N      240

  16. /* SYSCLK = PLL_VCO / PLL_P */
  17. #define PLL_P      2

  18. /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
  19. #define PLL_Q      5

  20. #endif
在system_stm32f2xx.c文件中只更改了这个分频设置,其他的没变。看了下disassembly,真的不一样,可是想不明白就简单的一个库函数调用为啥汇编结果不一样。?



左边是没有优化的,右边是开3级优化的

左边是没有优化的,右边是开3级优化的
 楼主| YIHAOXIAOYU 发表于 2015-10-22 16:13 | 显示全部楼层
还是不懂
冰河w 发表于 2015-10-24 21:11 | 显示全部楼层
可能一些初始化代码被优化掉了,关掉优化
lefeng 发表于 2015-10-24 21:24 | 显示全部楼层
函数在优化之前和优化后,delay函数的运行周期完全没有比例性,在高度Speed或Balanced优化后,delay函数将会紊乱!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

39

帖子

0

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