打印
[应用相关]

为啥我的delay函数是死循环?求助。

[复制链接]
3342|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;

使用特权

评论回复
5
sdc666|  楼主 | 2009-5-6 18:07 | 只看该作者

怎样用volatile声明?

怎样用volatile声明?
把static vu32 TimingDelay = 0;改为volatile vu32 TimingDelay=0;么?

使用特权

评论回复
6
香水城| | 2009-5-6 18:09 | 只看该作者

是的

使用特权

评论回复
7
McuPlayer| | 2009-5-6 18:09 | 只看该作者

编译器的优化很厉害的

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

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

编译器一看,哇,写代码的这哥们真幽默,那个变量刚赋值为0然后就一直问这个变量是0吗。
于是编译器自作聪明,把你的代码给优化成
while(1)
{
      Delay();永远的打酱油,for ever...............
}

使用特权

评论回复
8
McuPlayer| | 2009-5-6 18:10 | 只看该作者

vu32本身已经是volatile修饰的

使用特权

评论回复
9
Txapp| | 2009-5-6 20:18 | 只看该作者

TimingDelay中断中自减

应该是中断没打开吧,查一下

使用特权

评论回复
10
55948218| | 2009-5-7 16:26 | 只看该作者

我也遇到这个问题了

你解决了吗??

使用特权

评论回复
11
zcw9911| | 2009-5-8 13:04 | 只看该作者

这个问题我知道

是中断向量文件的问题,不要用MDK生成的,用ST公司提供的

使用特权

评论回复
12
贾斯文| | 2009-5-8 20:36 | 只看该作者

估计少了调用

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

使用特权

评论回复
13
香水城| | 2009-5-8 22:04 | 只看该作者

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

那是一个很简单的错误:systick 死机

使用特权

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

本版积分规则

29

主题

83

帖子

0

粉丝