打印
[STM32F2]

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

[复制链接]
1987|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
目前正在使用STM32F205VCT6,开了TIM8定时100ms中断,程序配置如下:
#define TIM8_10Hz_Period  12000//0X1C1F//0X2ee0
#define TIM8_10Hz_Prescaler  999//99//0X03E7

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

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

        TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);                                         //ÔÊÐíÖжÏ
        TIM_Cmd(TIM8, en);                                                                               
Tick_1S_flag=0;
}
void TIM8_UP_TIM13_IRQHandler (void)
{
        static UINT16 t21ms;       

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

                        t21ms=0;
                        Tick_1S_flag=1;
                }
        TIM_ClearFlag(TIM8, TIM_FLAG_Update);                  //ÇåÖжϱê¼Ç
        TIM_ClearITPendingBit(TIM8, TIM_IT_Update);
        }
}

系统时钟配置在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
如果不改动代码里的初始化参数,建议查看一下优化后和优化前初始化后寄存器的配置是不是一样。
有没有可能 ...
#ifdef STM32F2XX_MINE   
//#if (HSE_VALUE)==((uint32_t)8000000)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N //0.95~2M*/
//±£³ÖVCOÔÚ1M ¼´¿É
#define PLL_M      (HSE_VALUE/1000000)
#define PLL_N      240//216//

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P     2

/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      5
//#if (HSE_VALUE)==((uint32_t)25000000)
#else
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      25
#define PLL_N      240

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2

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

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



360截图20151022154709558.jpg (700.77 KB )

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

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

使用特权

评论回复
5
YIHAOXIAOYU|  楼主 | 2015-10-22 16:13 | 只看该作者
还是不懂

使用特权

评论回复
6
冰河w| | 2015-10-24 21:11 | 只看该作者
可能一些初始化代码被优化掉了,关掉优化

使用特权

评论回复
7
lefeng| | 2015-10-24 21:24 | 只看该作者
函数在优化之前和优化后,delay函数的运行周期完全没有比例性,在高度Speed或Balanced优化后,delay函数将会紊乱!

使用特权

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

本版积分规则

10

主题

39

帖子

0

粉丝