搜索
bottom↓
回复: 15

STM32的SysTick时钟定时不准??【恢复】

[复制链接]

出0入0汤圆

发表于 2008-9-27 10:07:44 | 显示全部楼层 |阅读模式
我参照有关应用笔记,在万利的开发板上用SysTick时钟实现一个1ms延时中断,然后根据这个中断写了延时1s的程序:

1.RCC初始化:

void RCC_Config(void)

{

  RCC_DeInit();// Reset the RCC, Required

  

  RCC_HSEConfig(RCC_HSE_ON);// High Speed External OSC is enabled 

  

  HSEStartUpStatus = RCC_WaitForHSEStartUp();// Waiting for the HSE is usable

  if(HSEStartUpStatus == SUCCESS)

  {

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);// Set the PLLCLK to 6*HSECLK, 48MHz

    

    RCC_PLLCmd(ENABLE);// Enable the PLL

    

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);// Waiting for the PLLCLK is usable

    

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);// Config the PLLCLK to SYSCLK, 48MHz

    while(RCC_GetSYSCLKSource() != 0x08);

    

    RCC_HCLKConfig(RCC_SYSCLK_Div1);// Config the AHB clock to SYSCLK, 48MHz

      

    RCC_PCLK2Config(RCC_SYSCLK_Div2);// Config the APB2 clock to SYSCLK/2, 24MHz

    

    RCC_PCLK1Config(RCC_SYSCLK_Div4);// Config the APB1 clock to SYSCLK/4, 12MHz

    

//    FLASH_SetLatency(FLASH_Latency_2);// Flash Two Latency cycle

    

//    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);// Enable the Flash Prefetch Buffer

  }

  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC// Enable the APB2 peripheral clock 

                        |RCC_APB2Periph_GPIOD, ENABLE);

}



2.SysTick时钟初始化:

void SysTick_Config(void)

{

  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);// Config the SysTick to HCLK/8, 6MHz

  SysTick_SetReload(6000);                             // Timing 1ms 

  SysTick_ITConfig(ENABLE);                            // Enable SysTick Interrupt

}



3.stm32f10x_it.c中编写的SysTick时钟中断服务程序:

void SysTickHandler(void)

{

  if(TimingDelay != 0) TimingDelay--;

}



4.主程序main.c中的ms级延时程序:

void Delay(u32 nCnt)

{

  SysTick_CounterCmd(SysTick_Counter_Enable);          // Enable the SysTick

  

  TimingDelay = nCnt;

  while(TimingDelay != 0);

  

  SysTick_CounterCmd(SysTick_Counter_Disable);         // Disable the SysTick

  SysTick_CounterCmd(SysTick_Counter_Clear);           // Clear the SysTick

}



外部时钟频率是8MHz,根据我的设置,系统时钟SYSCLK为48MHz,AHB外设时钟HCLK=SYSCLK=48MHz,SysTickCLK=HCLK/8=6MHz,为了让SysTick产生1ms的中断,SysTick计数自动重装初值应该是6000,即SysTick_SetReload(6000),那么,在主程序里,我想实现一个LED点亮1S,熄灭1S, 点亮1S,熄灭1S,……如此闪烁的功能,那么1S的延时程序就应该是Delay(1000),可是程序调试时,LED点亮和熄灭的时间绝对远远大于1S!!我仔细看了我的程序,问题只可能出现在Delay()上,适当减小SysTick计数自动重装初值,例如SysTick_SetReload(1000),LED点亮和熄灭的时间变短,感觉上接近于1S。可是按照对SysTick时钟原理的理解,它是一个递减计数器,如果时钟没有设置错的话,应该是SysTick_SetReload(6000),可是看了RCC的设置,也没有看出什么问题,如果我的算术还好的话,SysTickCLK就是6MHz。那我到底错在什么地方呢?又或者是因为用ST Link II调试的原因?还请各位大侠指教。谢谢先。

本贴被 henry 编辑过,最后修改时间:2008-09-27,10:24:35.

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2009-1-31 15:15:09 | 显示全部楼层
很准,建议检查程序,我用示波器来调SYSTICK,很准。

出0入0汤圆

发表于 2009-1-10 21:13:34 | 显示全部楼层
不会不准吧,是不是自己算错了之类?

或中断太频,丢了.

我试过STM32F103ZE,是非常准的.

出0入0汤圆

发表于 2009-1-8 10:06:21 | 显示全部楼层
我也是在万利板上用的,调为延时2ms用示波器测脉冲比较准备确哦,不知楼上所说的不准备是如何不准确呢?

不过用Systick测中断脉宽就不准确,误差好大,现在研究了三天tim时钟还是不会用,那位朋友指导一下/~~

http://www.stmfans.com/bbs/frame.php?frameon=yes&referer=http%3A//www.stmfans.com/bbs/viewthread.php%3Ftid%3D544%26highlight%3D

出0入0汤圆

发表于 2008-10-23 08:45:09 | 显示全部楼层
使用MCO输出内部时钟,再用示波器看看它的频率是否可以解释。

出0入0汤圆

发表于 2008-10-23 00:17:51 | 显示全部楼层
检查时钟设置

本贴被 buickbuick 编辑过,最后修改时间:2008-10-23,00:27:38.

出0入0汤圆

发表于 2008-10-17 22:16:12 | 显示全部楼层
减小SysTick计数自动重装初值到什么样的数才比较准?

出0入0汤圆

发表于 2008-10-7 16:31:38 | 显示全部楼层
确实不准,这个我也试过!

出0入0汤圆

发表于 2008-9-27 20:01:28 | 显示全部楼层
我不会用 SysTick  我的情况是,一开SysTick程序就不走了。

出0入0汤圆

 楼主| 发表于 2008-9-27 11:35:46 | 显示全部楼层
ding

出0入0汤圆

发表于 2008-9-27 10:56:27 | 显示全部楼层
群:43204981

出0入0汤圆

 楼主| 发表于 2008-9-27 10:30:44 | 显示全部楼层
帖子沉得好快呀,顶一下,在线等

另外想问问有没有什么STM32的QQ交流群,想参加,可能交流的时效性更好吧,呵呵

出10入95汤圆

发表于 2009-8-31 20:11:53 | 显示全部楼层
应该是很准的,我使用的是外部4M时钟(手头没有8M的),默认的设置(不知道在哪设置),时钟是很准的2mS;

ST的手册(RM0008)写的很不明白,根本没有讲SysTick的寄存器,更没有讲怎么用,使用起来,很不方便,
还有Flash的寄存器也没有说明,唉...

出0入0汤圆

发表于 2009-9-1 00:43:07 | 显示全部楼层
与楼上相同感觉。最新的手册中稍微多讲了一些这方面的内容。

我的感觉是:ST的STM32手册主要介绍外围,而Flash和SysTick属于ARM Cortex-M3内核的东西,ST写STM32手册的人可能认为使用STM32的都已经是ARM的高手了,或者让大家再去看Cortex-M3的手册。

出0入0汤圆

发表于 2009-9-1 10:57:58 | 显示全部楼层
关于Cortex-M3内核和Flash的内容,ST另外有2篇文档:

STM32F10xxx Cortex-M3 programming manual

STM32F10xxx Flash programming 中文译文

出0入0汤圆

发表于 2009-12-15 17:57:30 | 显示全部楼层
我的 SYSTICK 很准确的,,,你用 '马老师'的帖子,,,不用库,,直接用 Stm32_Init.c  做初始化...很好用的...

我最初没注意设置 RCC 的频率,,,学会设置 RCC 时钟之后,,SYSTICK 1000毫秒,,做的方波用频率计测试周期 1.998xxx秒..

#include <stm32f10x_lib.h>                        // STM32F10x Library Definitions
#include "STM32_Init.h"                           // STM32 Initialization

#include "..\Stm32F103.h"

void SysTick_Handler(void) {
  if ((GPIOB_ODR & 0x00000200) == 0)       
    GPIOB_BSRR = (1<<9);
  else
    GPIOB_BSRR = (1<<9+16);                       //直接在中断里输出 2秒周期的方波..
}

int main(void) {
  unsigned int l,m,n,p,q;
  BKP_DR0 = 0x1357;
//  BKP_DR1 = 0x2468;
  FLASH_ACR = 0x11;                        //使用FLASH 一等待,0x12两等待
  RCC_CR = (1<<16);                        //Open HSE
  p = 0;
  for(q=0;q<0x1fff;q++) {
        p = p + 1;
  }
  RCC_CFGR = 0x072B4401;        //设置MCO输出PLL/2,PLL倍频12(系统时钟72兆)
  l = RCC_CR;
  RCC_CR = (1<<24);                        //Open PLL
  m = RCC_CR;
  for(q=0;q<0xdfff;q++) {
        p = p + 1;
  }
  RCC_CFGR = 0x072B4402;        //0x072B440"2"->"A" 切换PLL时钟(72兆)成功
  n = RCC_CR;
  q = RCC_CFGR;
  RCC_AHBENR  = 0xffffffff;        //Open FLASH,SRAM,DMA;clock
  RCC_APB2ENR = 0xffffffff;        //Open All clock
  RCC_APB1ENR = 0xffffffff;        //Open All clock

  GPIOA_CRL = 0x88888888;
  GPIOA_CRH = 0x8888888B;        //让 MCO 输出PLL/2时钟(36兆)
  GPIOA_ODR = 0x0000Bfff;        //JTCK 为"下拉"

  GPIOB_CRL = 0x88883888;        //JTDO 为"输出"
  GPIOB_CRH = 0x88888833;        //PB8,PB9点亮发光二极管(只影响了高8位)
  GPIOB_ODR = 0x0000fff7;        //JTDO 设置"输出0"

  GPIOC_CRL = 0x88888888;
  GPIOC_CRH = 0x88888888;
  GPIOC_ODR = 0x0000ffff;

  GPIOD_CRL = 0x88888888;        //晶体振荡器88带上拉也可起振
  GPIOD_CRH = 0x88888888;
  GPIOD_ODR = 0x0000ffff;

  GPIOB_ODR = l+m+n+p+q;        //Just Test        不被优化掉
  stm32_Init ();
while(1)
  {
  GPIOB_BSRR = (1<<8);
  GPIOB_BSRR = (1<<8+16);
  GPIOB_BSRR = (1<<8);
  GPIOB_BSRR = (1<<8+16);
  GPIOB_BSRR = (1<<8);
  GPIOB_BSRR = (1<<8+16);
  GPIOB_BSRR = (1<<8);
  GPIOB_BSRR = (1<<8+16);
  }
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 09:21

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

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