3.5库的时钟初始化与SYSTICK实现延时的问题

2019-03-23 20:17发布

新手求助。。。 使用3.5的库,根据描述。。库中默认为外部8mhz。我也就没设置。。然后进行systick初始化。。和延时函数定义。。但下到板子里。。定时不准。。已开始以为是延时函数的问题,后来把systick的初始化包括延时函数都放到其他历程中(此里程始终初始化是直接用寄存器设置的)。。延时准确。。说明延时这块没问题。。 是不是默认的时钟初始化有问题啊?谁能帮我说说。。库中默认的始终初始化直接用有什么问题吗?请高手帮我讲。。时钟的初始化。。都纠结我好多天了。。。   此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
wx837078933
1楼-- · 2019-03-24 01:27
/

这我的程序,写的应该是延时一秒的,可实际却3秒左右。。。。大家帮忙看看。。到底咋回事啊。。。。。

#include "stm32f10x.h"
 
 // 声明结构体
 GPIO_InitTypeDef GPIO_InitStructure; //此句话定义了一个名字叫GPIO_InitStructure的结构体


/*void SysTick_Configuration(void)
{
 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//设置时钟源为HCLK
} */
 //2.0库设置方法。。。
//void us_delay(u32 n)
//{
// u32 flag;
// SysTick_SetReload(72000*n);
// SysTick_CounterCmd(SysTick_Counter_Clear);
// SysTick_CounterCmd(SysTick_Counter_Enable);
//  do
// {
//  flag=SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
// }while(flag!=1);
// SysTick_CounterCmd(SysTick_Counter_Disable);
// }

 u8 us;
 u16 ms;

void delay_init()
{
 SysTick->CTRL&=0xfffffffb;
  us=9;
  ms=(u16)us*1000;
}

void delay_us(u32 n)
{
 u32 temp;
 SysTick->LOAD=n*us;
 SysTick->VAL=0x00;
 SysTick->CTRL=0x01;
// do
// {temp=(SysTick->CTRL)>>16;
// }while(temp!=1);
 do
 {
  temp=SysTick->CTRL;
 }
 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
 SysTick->CTRL=0x00;
 SysTick->VAL=0x00;

}

void delay_ms(u16 n)
{
 u32 temp;
 SysTick->LOAD=(u32)n*ms;
 SysTick->VAL=0x00;
 SysTick->CTRL=0x01;
// do
// {temp=(SysTick->CTRL)>>16;
// }while(temp!=1);
 do
 {
  temp=SysTick->CTRL;
 }
 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
 SysTick->CTRL=0x00;
 SysTick->VAL=0x00;

}  

 

 


 void GPIO_Configuration(void)

 {

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;     //第二个引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOD,&GPIO_InitStructure);
 
  }
 

int main(void)
{  
  
 
   //使能线上时钟,
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能IO口A和D
  GPIO_Configuration ();//GPIO初始化
  delay_init(72);
 
   
 
  while (1)
  {
  
   GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //D2口置位即输出高电平
   delay_ms(1000);
  
   GPIO_SetBits (GPIOD,GPIO_Pin_2);
    delay_ms(1000);
 
  }
}

[ 本帖最后由 wx837078933 于 2011-9-25 00:10 编辑 ]
wx837078933
2楼-- · 2019-03-24 01:38
 精彩回答 2  元偷偷看……

一周热门 更多>