9464|12

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

为啥我的delay函数是死循环?求助。 [复制链接]

我想在程序里添加一个延时函数进行时序的调整,但是,一运行到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); 

此帖出自stm32/stm8论坛

最新回复

                                 那是一个很简单的错误:systick 死机。   详情 回复 发表于 2009-5-8 22:04
点赞 关注
 

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

声明TimingDelay时要使用volatile修饰符

                                  
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

编译帮你优化掉了

用volatile修饰变量就OK了

只能说Keil的优化功能太厉害了,从当年的51到现在的ARM
此帖出自stm32/stm8论坛
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 

我没有改动声明。

程序里这样声明的。
static vu32 TimingDelay = 0;
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 

怎样用volatile声明?

怎样用volatile声明?
把static vu32 TimingDelay = 0;改为volatile vu32 TimingDelay=0;么?
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 

是的

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 

编译器的优化很厉害的

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

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

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

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 

vu32本身已经是volatile修饰的

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 

TimingDelay中断中自减

                                 应该是中断没打开吧,查一下
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 

我也遇到这个问题了

                                 你解决了吗??
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 

这个问题我知道

                                 是中断向量文件的问题,不要用MDK生成的,用ST公司提供的
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 

估计少了调用

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

此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 

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

那是一个很简单的错误:systick 死机
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表