孤独将一 发表于 2013-9-2 09:36:34

求助:Systick延时1s问题

============Systick.c==============
static __IO u32 TimingDelay;

/*³õʼ»¯SysTick*/
void SysTick_Init(void)
{

        if (SysTick_Config(9000))
{
    /* Capture error */
    while (1);
}
}

void _delay_ms(__IO u32 nTime)
{
        TimingDelay = nTime;
while(TimingDelay != 0);
}
/* »ñÈ¡½ÚÅijÌÐò£¬ÔÚ SysTick ÖжϺ¯Êý SysTick_Handler()µ÷Óà      */
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
    TimingDelay--;
}
}
//=================
void SysTick_Handler(void)
{
        TimingDelay_Decrement();
}
//=================
GPIO_SetBits(GPIOD,GPIO_Pin_8 );   //Ture_On
                        _delay_ms(10000);
               
                        GPIO_ResetBits(GPIOD,GPIO_Pin_8 );        //Ture_OFF
                  _delay_ms(10000);//=======================================
1:SysTick_Config(9000)不是1us吗,我的外接晶振8M,还“SystemInit();”。
2:为什么 _delay_ms(10000);才能达到1.25s。理论是_delay_ms(1000);是1S啊。
3:新手

68336016 发表于 2013-9-2 09:39:27

看你的HCLK是多少先,SysTick_Config里面是HCLK/1000

孤独将一 发表于 2013-9-2 09:57:24

68336016 发表于 2013-9-2 09:39 static/image/common/back.gif
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000

72mhz/8分频得到Systick

孤独将一 发表于 2013-9-2 10:18:37

68336016 发表于 2013-9-2 09:39 static/image/common/back.gif
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000

说错了,SysTick_Config(9000)不是1ms吗?

68336016 发表于 2013-9-2 10:26:34

孤独将一 发表于 2013-9-2 10:18 static/image/common/back.gif
说错了,SysTick_Config(9000)不是1ms吗?

如果你配置没错,SYSTICK是HCLK8分配的话,这里的确就是9000

孤独将一 发表于 2013-9-2 10:29:35

68336016 发表于 2013-9-2 10:26 static/image/common/back.gif
如果你配置没错,SYSTICK是HCLK8分配的话,这里的确就是9000

void _delay_xms(u16 nms)
{
          u32 temp;
          SysTick->LOAD = (u32)nms*9000;                                              //这里乘以9000.
          SysTick->VAL = 0x00;

       SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
       do{
               temp = SysTick ->CTRL;
       }while(temp&0x01 && !(temp&(1<<16)));
       SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
       SysTick->VAL = 0x00;
}//仿真下来这个和上面的那个都是1.25s。不是1s。_delay_xms(1000);

孤独将一 发表于 2013-9-2 10:39:52

68336016 发表于 2013-9-2 10:26 static/image/common/back.gif
如果你配置没错,SYSTICK是HCLK8分配的话,这里的确就是9000

怎样启用外部晶振

孤独将一 发表于 2013-9-2 10:45:45

本帖最后由 孤独将一 于 2013-9-2 10:51 编辑

RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
这句加上,时钟问题、、、、、、、、、、、、、、、、、
=======================
但是还是不准。500ms结果是561ms(8Mhz)

zjzly 发表于 2013-9-15 10:10:07

首先要确定时钟频率正确,包括您使用的72MHZ,然后systick时钟源是它的八分之一。
2.你可以利用进入中断来准确计时,可能使用led灯来计时也会产生一些误差吧。
同样是新手,只是一些建议。。。

szmini2006 发表于 2013-9-15 10:12:29

关注,曾经也为这个困惑很久,当时在我的系统上,延迟时间是理论时间的精确1.5倍,一直没搞懂

ljbskx 发表于 2013-9-15 17:03:21

是不是因为你每次执行延时程序的时候,都在延时里执行很多的语句的原因

millwood0 发表于 2013-9-16 07:06:06

At SystemCoreClock of 72Mhz, each click is 1/72Mhz = 0.0138...us. 9001 of them means every 0.0138...us * 9001 = ~125us, SysTick_Handler() is called. That means that if you set delay at 10,000 -> the led will be turned on / off for 125us * 10000 = 1.25s. Or 1.250139s, to be exact.

If you have spent just a little bit of time on the datasheet, you would have figured that out by yourself.

w282529350 发表于 2013-9-16 16:44:34

load寄存器只能载入24位,即值的范围是0~0xFFFFFF,你delay(10000)的话,10000*9000溢出了

shen2008jie 发表于 2013-9-28 01:26:52

主要是要考虑延时的最大值。24位的值大概你算算是2^24个系统时钟节拍的八分频。大概在72M系统时钟的情况下,8分频后,也就最多计时1.677秒差不多。还有就是你仿真的时候有没有在设置中设置外部时钟为8M。当然还有就是在编译中有没有设置为8M,我记得传统里面可能是默认25M的。

ananyjlo 发表于 2013-10-30 23:13:30

{:smile:}{:smile:}学习一下,呵呵!!

zlxd1990 发表于 2014-3-9 12:45:25

MARK,学习了

wangkdd 发表于 2014-7-30 09:36:46

悬赏的也太少了
页: [1]
查看完整版本: 求助:Systick延时1s问题