搜索
bottom↓
回复: 16

求助:Systick延时1s问题

[复制链接]

出0入0汤圆

发表于 2013-9-2 09:36:34 | 显示全部楼层 |阅读模式
  1. ============Systick.c==============
  2. static __IO u32 TimingDelay;

  3. /*³õʼ»¯  SysTick*/
  4. void SysTick_Init(void)
  5. {

  6.         if (SysTick_Config(9000))
  7.   {
  8.     /* Capture error */
  9.     while (1);
  10.   }
  11. }

  12. void _delay_ms(__IO u32 nTime)
  13. {
  14.         TimingDelay = nTime;
  15.   while(TimingDelay != 0);
  16. }
  17. /* »ñÈ¡½ÚÅijÌÐò£¬ÔÚ SysTick ÖжϺ¯Êý SysTick_Handler()µ÷Óà        */  
  18. void TimingDelay_Decrement(void)
  19. {
  20.   if (TimingDelay != 0x00)
  21.   {
  22.     TimingDelay--;
  23.   }
  24. }
  25. //=================
  26. void SysTick_Handler(void)
  27. {
  28.         TimingDelay_Decrement();
  29. }
  30. //=================
  31. GPIO_SetBits(GPIOD,GPIO_Pin_8 );   //Ture_On
  32.                         _delay_ms(10000);
  33.                
  34.                         GPIO_ResetBits(GPIOD,GPIO_Pin_8 );        //Ture_OFF
  35.                   _delay_ms(10000);
复制代码
//=======================================
1:SysTick_Config(9000)不是1us吗,我的外接晶振8M,还“SystemInit();”。
2:为什么 _delay_ms(10000);才能达到1.25s。理论是_delay_ms(1000);是1S啊。
3:新手

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出130入129汤圆

发表于 2013-9-2 09:39:27 | 显示全部楼层
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000

出0入0汤圆

 楼主| 发表于 2013-9-2 09:57:24 | 显示全部楼层
68336016 发表于 2013-9-2 09:39
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000

72mhz/8分频得到Systick

出0入0汤圆

 楼主| 发表于 2013-9-2 10:18:37 | 显示全部楼层
68336016 发表于 2013-9-2 09:39
看你的HCLK是多少先,SysTick_Config里面是HCLK/1000

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

出130入129汤圆

发表于 2013-9-2 10:26:34 | 显示全部楼层
孤独将一 发表于 2013-9-2 10:18
说错了,SysTick_Config(9000)不是1ms吗?

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

出0入0汤圆

 楼主| 发表于 2013-9-2 10:29:35 | 显示全部楼层
68336016 发表于 2013-9-2 10:26
如果你配置没错,SYSTICK是HCLK8分配的话,这里的确就是9000
  1. void _delay_xms(u16 nms)
  2. {
  3.           u32 temp;
  4.           SysTick->LOAD = (u32)nms*9000;                                              //这里乘以9000.
  5.           SysTick->VAL = 0x00;

  6.          SysTick->CTRL  |=  SysTick_CTRL_ENABLE_Msk;
  7.          do{
  8.                  temp = SysTick ->CTRL;
  9.          }while(temp&0x01 && !(temp&(1<<16)));
  10.          SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  11.          SysTick->VAL = 0x00;
  12. }
复制代码
//仿真下来这个和上面的那个都是1.25s。不是1s。_delay_xms(1000);

出0入0汤圆

 楼主| 发表于 2013-9-2 10:39:52 | 显示全部楼层
68336016 发表于 2013-9-2 10:26
如果你配置没错,SYSTICK是HCLK8分配的话,这里的确就是9000

怎样启用外部晶振

出0入0汤圆

 楼主| 发表于 2013-9-2 10:45:45 | 显示全部楼层
本帖最后由 孤独将一 于 2013-9-2 10:51 编辑

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

出0入0汤圆

发表于 2013-9-15 10:10:07 | 显示全部楼层
首先要确定时钟频率正确,包括您使用的72MHZ,然后systick时钟源是它的八分之一。
  2.你可以利用进入中断来准确计时,可能使用led灯来计时也会产生一些误差吧。
同样是新手,只是一些建议。。。

出0入0汤圆

发表于 2013-9-15 10:12:29 | 显示全部楼层
关注,曾经也为这个困惑很久,当时在我的系统上,延迟时间是理论时间的精确1.5倍,一直没搞懂

出0入0汤圆

发表于 2013-9-15 17:03:21 | 显示全部楼层
是不是因为你每次执行延时程序的时候,都在延时里执行很多的语句的原因

出0入0汤圆

发表于 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.

出0入0汤圆

发表于 2013-9-16 16:44:34 | 显示全部楼层
load寄存器只能载入24位,即值的范围是0~0xFFFFFF,你delay(10000)的话,10000*9000溢出了

出0入0汤圆

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

出0入0汤圆

发表于 2013-10-30 23:13:30 | 显示全部楼层
学习一下,呵呵!!

出0入0汤圆

发表于 2014-3-9 12:45:25 | 显示全部楼层
MARK,学习了

出0入0汤圆

发表于 2014-7-30 09:36:46 | 显示全部楼层
悬赏的也太少了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 01:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表