求助: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:新手
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000 68336016 发表于 2013-9-2 09:39 static/image/common/back.gif
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000
72mhz/8分频得到Systick 68336016 发表于 2013-9-2 09:39 static/image/common/back.gif
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000
说错了,SysTick_Config(9000)不是1ms吗?
孤独将一 发表于 2013-9-2 10:18 static/image/common/back.gif
说错了,SysTick_Config(9000)不是1ms吗?
如果你配置没错,SYSTICK是HCLK8分配的话,这里的确就是9000 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); 68336016 发表于 2013-9-2 10:26 static/image/common/back.gif
如果你配置没错,SYSTICK是HCLK8分配的话,这里的确就是9000
怎样启用外部晶振 本帖最后由 孤独将一 于 2013-9-2 10:51 编辑
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
这句加上,时钟问题、、、、、、、、、、、、、、、、、
=======================
但是还是不准。500ms结果是561ms(8Mhz) 首先要确定时钟频率正确,包括您使用的72MHZ,然后systick时钟源是它的八分之一。
2.你可以利用进入中断来准确计时,可能使用led灯来计时也会产生一些误差吧。
同样是新手,只是一些建议。。。 关注,曾经也为这个困惑很久,当时在我的系统上,延迟时间是理论时间的精确1.5倍,一直没搞懂 是不是因为你每次执行延时程序的时候,都在延时里执行很多的语句的原因 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.
load寄存器只能载入24位,即值的范围是0~0xFFFFFF,你delay(10000)的话,10000*9000溢出了 主要是要考虑延时的最大值。24位的值大概你算算是2^24个系统时钟节拍的八分频。大概在72M系统时钟的情况下,8分频后,也就最多计时1.677秒差不多。还有就是你仿真的时候有没有在设置中设置外部时钟为8M。当然还有就是在编译中有没有设置为8M,我记得传统里面可能是默认25M的。 {:smile:}{:smile:}学习一下,呵呵!! MARK,学习了 悬赏的也太少了
页:
[1]