OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5003|回复: 3

systick时间不准确

[复制链接]

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-12-3
在线时间
0 小时
发表于 2013-12-10 12:20:28 | 显示全部楼层 |阅读模式


#include "delay.h"
#include "stm32f10x.h"
static  u8  fac_us=0;
static  u16 fac_ms=0;
static  u16 fac_s=0;

void Delay_Init()  
{


SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //?????????±??  HCLK/8
fac_us=1.0/9000000; //???????±????1/8  
fac_ms=(u16)fac_us*1000;
fac_s=(u16)fac_ms*1000;
}    


void delay_us(u32 us)
{
u32 temp;      
SysTick->LOAD=us*fac_us;     
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;      
}


void delay_ms(u16 ms)
{    
                 u32 temp;   
SysTick->LOAD=ms*fac_ms;
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;          


void delay_s(u32 s)
{
                  u32 temp;      
SysTick->LOAD=s*fac_ms;    
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;      
}


#include"stm32f10x.h"
#include"delay.h"
void GPIO_Configuration(void);
void RCC_Configuration(void);

  
 int main(void)
 { 
   
   RCC_Configuration();
   GPIO_Configuration();
   Delay_Init();
   while(1)
   {
    // GPIO_SetBits(GPIOA,GPIO_Pin_2);
     GPIO_SetBits(GPIOA,GPIO_Pin_3);
     //delay_ms(250);
    GPIO_ResetBits(GPIOA,GPIO_Pin_2);
        delay_us(500);
    GPIO_ResetBits(GPIOA,GPIO_Pin_3);
     delay_us(500);
   }
   }
  
 void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;
    RCC_DeInit();  //????RCC?±????????????????×???
    RCC_HSEConfig(RCC_HSE_ON);//?????????????????÷(HSE)
    HSEStartUpStatus=RCC_WaitForHSEStartUp(); //????HSE????
   if(HSEStartUpStatus==SUCCESS) 
   {
     RCC_HCLKConfig(RCC_SYSCLK_Div1);
     RCC_PCLK2Config(RCC_HCLK_Div1);
     RCC_PCLK1Config(RCC_HCLK_Div1);
     FLASH_SetLatency(FLASH_Latency_2);
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
     RCC_PLLCmd(ENABLE);
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     while(RCC_GetSYSCLKSource() != 0x08);//???? RCC_GetSYSCLKSource() ??·?????0x08
      // - 0x08: PLL used as system clock
    }
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
      // RCC_APB2PeriphClockCmd?????ò????????APB(APB2)???§?±??
      }
   
   
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  /* ?è??PA2,PA3???????ì??????×??ó·?×???????50MHz*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //???¨GPIO????????
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//?¨?ù??????????
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //???¨?ù????????×÷????
  GPIO_Init(GPIOA , &GPIO_InitStructure);  //?ù?????¨????????GPIOx???§
    
}
  
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-12-3
在线时间
0 小时
 楼主| 发表于 2013-12-10 13:20:50 | 显示全部楼层
回复 支持 反对

使用道具 举报

17

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2013-7-9
在线时间
57 小时
发表于 2013-12-10 16:12:28 | 显示全部楼层
systick时间不准确
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12052
金钱
12052
注册时间
2013-3-8
在线时间
1282 小时
发表于 2013-12-10 22:21:37 | 显示全部楼层
回复【2楼】小五子一号:
---------------------------------
是不准确!但ms级的还是很准确的!delay_us,ms函数没有考虑到函数内容本身也要执行时间,所以us数越小,就越不准确。到了ms级,函数内容执行时间就可以忽略不计,这时时间是准确的!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 13:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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