[应用相关] 为啥我的delay函数是死循环?求助。

[复制链接]
4311|12
 楼主| sdc666 发表于 2009-5-6 17:56 | 显示全部楼层 |阅读模式
我想在程序里添加一个延时函数进行时序的调整,但是,一运行到delay就死掉了,就运行到: while(TimingDelay != 0); 就不动了,我看了看其他的程序,也是这样写的。 如果要用这个函数还要初始化哪些? 在初始化时我没有用PLL,直接用的8M晶振。 请教高手。 谢谢。 
以下是delay函数。 
void Delay(u32 nCount) 

  TimingDelay = nCount; 

  /* Enable the SysTick Counter */ 
  SysTick_CounterCmd(SysTick_Counter_Enable); 
   
  while(TimingDelay != 0) 
  { 
  } 

  /* Disable the SysTick Counter */ 
  SysTick_CounterCmd(SysTick_Counter_Disable); 

  /* Clear the SysTick Counter */ 
  SysTick_CounterCmd(SysTick_Counter_Clear); 


以下是我RCC初始化函数。 

void RCC_Configuration(void) 

  /* RCC system reset(for debug purpose) */ 
  RCC_DeInit(); 

  /* Enable HSE */ 
  RCC_HSEConfig(RCC_HSE_ON); 

  /* Wait till HSE is ready */ 
  HSEStartUpStatus = RCC_WaitForHSEStartUp(); 

  if(HSEStartUpStatus == SUCCESS) 
  { 
    /* HCLK = SYSCLK */ 
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  
   
    /* PCLK2 = HCLK */ 
    RCC_PCLK2Config(RCC_HCLK_Div1);  

    /* PCLK1 = HCLK */ 
    RCC_PCLK1Config(RCC_HCLK_Div1); 

    /* Flash 2 wait state */ 
    FLASH_SetLatency(FLASH_Latency_2); 
    /* Enable Prefetch Buffer */ 
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 
    /* Select HSE as system clock source */ 
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); 

    /* Wait till HSE is used as system clock source */ 
    while(RCC_GetSYSCLKSource() != 0x04) 
    { 
    } 
  } 
   /* Enable USART1 and GPIOB clock */ 
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 

香水城 发表于 2009-5-6 18:00 | 显示全部楼层

声明TimingDelay时要使用volatile修饰符

McuPlayer 发表于 2009-5-6 18:04 | 显示全部楼层

编译帮你优化掉了

用volatile修饰变量就OK了

只能说Keil的优化功能太厉害了,从当年的51到现在的ARM
 楼主| sdc666 发表于 2009-5-6 18:05 | 显示全部楼层

我没有改动声明。

程序里这样声明的。
static vu32 TimingDelay = 0;
 楼主| sdc666 发表于 2009-5-6 18:07 | 显示全部楼层

怎样用volatile声明?

怎样用volatile声明?
把static vu32 TimingDelay = 0;改为volatile vu32 TimingDelay=0;么?
香水城 发表于 2009-5-6 18:09 | 显示全部楼层
McuPlayer 发表于 2009-5-6 18:09 | 显示全部楼层

编译器的优化很厉害的

IAR或者Keil是非常聪明的,比如:

TimingDelay= 0;
while(TimingDelay== 0)
{
      Delay();打酱油的Delay;
}

编译器一看,哇,写代码的这哥们真幽默,那个变量刚赋值为0然后就一直问这个变量是0吗。
于是编译器自作聪明,把你的代码给优化成
while(1)
{
      Delay();永远的打酱油,for ever...............
}
McuPlayer 发表于 2009-5-6 18:10 | 显示全部楼层

vu32本身已经是volatile修饰的

Txapp 发表于 2009-5-6 20:18 | 显示全部楼层

TimingDelay中断中自减

应该是中断没打开吧,查一下
55948218 发表于 2009-5-7 16:26 | 显示全部楼层

我也遇到这个问题了

你解决了吗??
zcw9911 发表于 2009-5-8 13:04 | 显示全部楼层

这个问题我知道

是中断向量文件的问题,不要用MDK生成的,用ST公司提供的
贾斯文 发表于 2009-5-8 20:36 | 显示全部楼层

估计少了调用

在stm32f10x_it.c中需要调用Decrement_TimingDelay()这个函数,执行TimingDelay--操作。

香水城 发表于 2009-5-8 22:04 | 显示全部楼层

另外有个帖子也许可以借鉴

那是一个很简单的错误:systick 死机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

83

帖子

0

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